Appearance
OpenAI 与 Anthropic 集成
GPT 系列和 Claude 系列是目前工具调用最稳的两个模型家族。本章讲怎么把它们接进 LangGraph,包括国内访问 OpenAI 的代理配置。
一、OpenAI 集成
1.1 安装与配置
bash
pip install langchain-openai -i https://pypi.tuna.tsinghua.edu.cn/simpleAPI 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/simplebash
# 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/simpletext
# .env 文件
OPENAI_API_KEY=sk-xxx
OPENAI_BASE_URL=https://api.中转服务.com/v1
ANTHROPIC_API_KEY=sk-ant-xxxpython
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 必须紧跟 AIMessage 的 tool_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-openai的ChatOpenAI,国内用base_url配代理。 - Anthropic:
langchain-anthropic的ChatAnthropic,写作/长文强。 - 两家工具调用 API 一致,靠
bind_tools,底层差异 LangChain 已抹平。 - 用
.env+python-dotenv管理 key,别硬编码、别提交 git。
国产模型是国内生产环境的常客,下一章讲通义千问集成。