Skip to content

OpenAI 与 Anthropic 集成

GPT 系列和 Claude 系列是目前工具调用最稳的两个模型家族。本章讲怎么把它们接进 LangGraph,包括国内访问 OpenAI 的代理配置。

一、OpenAI 集成

1.1 安装与配置

bash
pip install langchain-openai -i https://pypi.tuna.tsinghua.edu.cn/simple

API Key 推荐用环境变量管理,别硬编码到代码里:

bash
# Windows PowerShell
setx OPENAI_API_KEY "sk-你的key"

# macOS / Linux
export OPENAI_API_KEY="sk-你的key"

设完环境变量重开终端才生效。代码里 ChatOpenAI 会自动读 OPENAI_API_KEY,不用显式传。

1.2 ChatOpenAI 常用参数

python
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="gpt-4o-mini",     # 模型名
    temperature=0,           # 0 确定性最强,1 最发散
    max_tokens=1024,         # 最大输出 token
    timeout=30,              # 超时秒数
    # base_url="https://xxx/v1",  # 自定义代理地址(见下文)
)

1.3 模型选择

模型特点适用
gpt-4o旗舰,多模态,强复杂任务
gpt-4o-mini便宜快,工具调用稳日常/智能体首选
gpt-4-turbo旧旗舰,长上下文兼容老系统
o1-mini推理强,慢且贵数学/代码推理

新手做智能体首选 gpt-4o-mini:便宜(输入约 $0.15/百万 token)、工具调用稳、速度快。

1.4 国内访问:配置代理 base_url

OpenAI 官方 API 在国内直连不稳定。两种方案:

方案 A:用国内中转服务(最简单)。注册一个 OpenAI 中转服务商,拿到它们的 base_url 和 key:

python
llm = ChatOpenAI(
    model="gpt-4o-mini",
    api_key="中转服务给你的key",
    base_url="https://api.中转服务.com/v1",
)

方案 B:自建代理。在能访问 OpenAI 的服务器上跑一个反代,把请求转发到 api.openai.com。本地连这个反代地址。

无论哪种,本质都是改 base_url。环境变量也行:

bash
setx OPENAI_BASE_URL "https://api.中转服务.com/v1"

二、Anthropic 集成

2.1 安装与配置

bash
pip install langchain-anthropic -i https://pypi.tuna.tsinghua.edu.cn/simple
bash
# Windows
setx ANTHROPIC_API_KEY "sk-ant-你的key"
# macOS / Linux
export ANTHROPIC_API_KEY="sk-ant-你的key"

2.2 ChatAnthropic 用法

python
from langchain_anthropic import ChatAnthropic

llm = ChatAnthropic(
    model="claude-3-5-sonnet-20241022",
    temperature=0,
    max_tokens=1024,
)

2.3 模型选择

模型特点适用
claude-3-5-sonnet-20241022旗舰,工具调用强,写作好复杂任务/长文
claude-3-5-haiku-20241022快且便宜日常
claude-3-opus旧旗舰兼容

Claude 的写作质量和长文理解公认强于 GPT-4o,但国内访问同样需要代理。

三、工具调用对比

两家都支持工具调用,API 一致(靠 bind_tools),但底层格式不同:

python
from langchain_core.tools import tool

@tool
def add(a: float, b: float) -> float:
    """两数相加。"""
    return a + b

# OpenAI
from langchain_openai import ChatOpenAI
openai_llm = ChatOpenAI(model="gpt-4o-mini").bind_tools([add])
r1 = openai_llm.invoke("3+5=?")
print(r1.tool_calls)   # [{'name': 'add', 'args': {'a': 3, 'b': 5}, ...}]

# Anthropic
from langchain_anthropic import ChatAnthropic
anthropic_llm = ChatAnthropic(model="claude-3-5-sonnet-20241022").bind_tools([add])
r2 = anthropic_llm.invoke("3+5=?")
print(r2.tool_calls)   # 同样的格式

LangChain 在底层把两家的差异抹平了,你拿到的 tool_calls 格式一致。但实测:

  • GPT-4o-mini:工具调用稳定,参数 schema 解析准。
  • Claude 3.5 Sonnet:工具选择更"聪明",多工具场景下选得更准。

四、在 LangGraph 中使用

模型只是节点内的一个组件,用法和前面章节一致:

python
from langgraph.prebuilt import create_react_agent

# 用 OpenAI
agent = create_react_agent(
    model=ChatOpenAI(model="gpt-4o-mini", temperature=0),
    tools=[add],
)

# 换 Claude,只改一行
agent = create_react_agent(
    model=ChatAnthropic(model="claude-3-5-sonnet-20241022", temperature=0),
    tools=[add],
)

五、环境变量管理(推荐)

把所有 key 集中到 .env 文件,用 python-dotenv 加载:

bash
pip install python-dotenv -i https://pypi.tuna.tsinghua.edu.cn/simple
text
# .env 文件
OPENAI_API_KEY=sk-xxx
OPENAI_BASE_URL=https://api.中转服务.com/v1
ANTHROPIC_API_KEY=sk-ant-xxx
python
from dotenv import load_dotenv
load_dotenv()   # 加载 .env 到环境变量

# 之后正常用 ChatOpenAI / ChatAnthropic,自动读到 key

重要:把 .env 加进 .gitignore,别提交到 git 仓库泄露 key。

六、完整可运行示例

python
import os
from dotenv import load_dotenv
from langchain_core.tools import tool
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
from langgraph.prebuilt import create_react_agent

load_dotenv()

@tool
def add(a: float, b: float) -> float:
    """两数相加。"""
    return a + b

@tool
def multiply(a: float, b: float) -> float:
    """两数相乘。"""
    return a * b

tools = [add, multiply]

# 同一个任务,两个模型各跑一遍
task = [HumanMessage(content="算 12 + 34,再乘以 2,分步来。")]

for name, llm in [
    ("GPT-4o-mini", ChatOpenAI(model="gpt-4o-mini", temperature=0)),
    ("Claude 3.5 Sonnet", ChatAnthropic(model="claude-3-5-sonnet-20241022", temperature=0)),
]:
    print(f"\n===== {name} =====")
    agent = create_react_agent(llm, tools)
    result = agent.invoke({"messages": task})
    print(result["messages"][-1].content)

跑一遍对比两个模型的回答风格和工具调用顺序,很有意思。

七、常见踩坑

1. 额度/账单问题

OpenAI 新账号有免费额度,但用完不自动停,会按用量扣费。务必在后台设消费上限。Anthropic 类似。建议用国产中转服务,能人民币结算、有用量看板。

2. 代理 base_url 末尾要带 /v1

OpenAI 的 base_url 必须以 /v1 结尾,如 https://api.xxx.com/v1。少了 /v1 会 404。

3. 工具调用格式差异

虽然 LangChain 抹平了,但有些细节不同。比如 Claude 在工具结果里要求 ToolMessage 必须紧跟 AIMessagetool_calls,顺序乱了会报错。OpenAI 宽容些。用 ToolNode 自动处理就行,别手搓。

4. max_tokens 含义不同

OpenAI 的 max_tokens 是"输出上限",Anthropic 的 max_tokens 是必填且也是输出上限,但 Claude 默认上限很高,不设可能超时。建议都显式设 max_tokens=1024 起步。

5. 模型名带日期

Claude 模型名带日期后缀(如 claude-3-5-sonnet-20241022),换版本要改。OpenAI 的 gpt-4o-mini 没日期,但会"静默升级",行为可能微变。

八、小结

  • OpenAI:langchain-openaiChatOpenAI,国内用 base_url 配代理。
  • Anthropic:langchain-anthropicChatAnthropic,写作/长文强。
  • 两家工具调用 API 一致,靠 bind_tools,底层差异 LangChain 已抹平。
  • .env + python-dotenv 管理 key,别硬编码、别提交 git。

国产模型是国内生产环境的常客,下一章讲通义千问集成