以下是使用 LangChain 和 OpenRouter 统一调用多模型的完整 Demo。
以下是使用 LangChain 和 OpenRouter 统一调用多模型的完整 Demo。
一、LangChain 方案
LangChain 提供了统一的 BaseChatModel 抽象层,让你可以用同一套代码调用不同厂商的模型。
1.1 安装依赖
# 核心依赖
pip install langchain langchain-core langchain-community
# OpenAI 兼容接口(适用于 OpenAI、通义千问兼容模式等)
pip install langchain-openai
# 通义千问官方 SDK(DashScope)
pip install dashscope langchain-dashscope
# 文心一言(百度千帆)
pip install langchain-qianfan qianfan
1.2 方式一:通过 OpenAI 兼容接口统一调用
这是最通用的方式——只要模型厂商提供 OpenAI 兼容的 API 端点,就可以用 ChatOpenAI 统一调用。
import os
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage
# ====================== 配置各模型 ======================
# 1. OpenAI(官方)
openai_model = ChatOpenAI(
model="gpt-4o",
api_key=os.getenv("OPENAI_API_KEY"),
base_url="https://api.openai.com/v1",
temperature=0.7,
)
# 2. 通义千问(DashScope 兼容模式)
# 参考:https://dashscope.aliyuncs.com/compatible-mode/v1
qwen_model = ChatOpenAI(
model="qwen-plus",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature=0.7,
)
# 3. 本地开源模型(通过 Ollama 的 OpenAI 兼容接口)
# Ollama 默认提供 http://localhost:11434/v1 端点
local_model = ChatOpenAI(
model="llama3.2",
api_key="ollama", # Ollama 不需要真实的 API Key,填任意值即可
base_url="http://localhost:11434/v1",
temperature=0.7,
)
# 4. 通过 OneAPI 网关统一调用(支持文心一言、通义千问等)
# OneAPI 将所有模型统一成 OpenAI 格式
oneapi_model = ChatOpenAI(
model="ERNIE-3.5-Turbo", # 在 OneAPI 中配置的模型名称
api_key=os.getenv("ONEAPI_API_KEY"),
base_url="http://localhost:3000/v1", # OneAPI 服务地址
temperature=0.7,
)
# ====================== 统一调用函数 ======================
def chat_with_model(model, prompt: str) -> str:
"""使用统一接口调用任意模型"""
messages = [
SystemMessage(content="你是一个有用的AI助手。"),
HumanMessage(content=prompt),
]
response = model.invoke(messages)
return response.content
# ====================== 测试调用 ======================
if __name__ == "__main__":
test_prompt = "请用一句话介绍什么是大语言模型。"
print("=" * 50)
print("【OpenAI】")
try:
print(chat_with_model(openai_model, test_prompt))
except Exception as e:
print(f"调用失败: {e}")
print("\n" + "=" * 50)
print("【通义千问 (DashScope兼容)】")
try:
print(chat_with_model(qwen_model, test_prompt))
except Exception as e:
print(f"调用失败: {e}")
print("\n" + "=" * 50)
print("【本地 Llama3 (Ollama)】")
try:
print(chat_with_model(local_model, test_prompt))
except Exception as e:
print(f"调用失败: {e}")
核心要点:通过 ChatOpenAI,不同模型的区别仅在于三个参数:
model:模型名称api_key:API 密钥base_url:API 端点地址
1.3 方式二:使用 init_chat_model 工厂函数
LangChain 1.0 推荐的 init_chat_model() 工厂函数,可根据模型名称自动选择正确的集成包。
from langchain.chat_models import init_chat_model
# ====================== 配置各模型 ======================
# 1. OpenAI
openai_model = init_chat_model(
model="gpt-4o",
model_provider="openai",
temperature=0.7,
max_tokens=2048,
api_key=os.getenv("OPENAI_API_KEY"),
)
# 2. 通义千问(通过 DashScope)
qwen_model = init_chat_model(
model="qwen-plus",
model_provider="dashscope",
temperature=0.7,
max_tokens=2048,
api_key=os.getenv("DASHSCOPE_API_KEY"),
)
# 3. 通义千问(通过 OpenAI 兼容模式)
qwen_compat_model = init_chat_model(
model="qwen-plus",
model_provider="openai",
temperature=0.7,
max_tokens=2048,
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
# 4. 文心一言(通过百度千帆)
# 需要先安装:pip install qianfan
wenxin_model = init_chat_model(
model="ERNIE-3.5-Turbo",
model_provider="qianfan",
temperature=0.7,
max_tokens=2048,
api_key=os.getenv("QIANFAN_API_KEY"),
secret_key=os.getenv("QIANFAN_SECRET_KEY"),
)
# 5. 本地模型(通过 Ollama 的 OpenAI 兼容接口)
local_model = init_chat_model(
model="llama3.2",
model_provider="openai",
temperature=0.7,
max_tokens=2048,
api_key="ollama",
base_url="http://localhost:11434/v1",
)
# ====================== 统一调用函数 ======================
def chat_with_model(model, prompt: str) -> str:
"""统一调用接口"""
response = model.invoke(prompt)
return response.content
# ====================== 测试 ======================
if __name__ == "__main__":
test_prompt = "请用一句话介绍什么是大语言模型。"
models = {
"OpenAI": openai_model,
"通义千问 (DashScope)": qwen_model,
"通义千问 (兼容模式)": qwen_compat_model,
"文心一言": wenxin_model,
"本地 Llama3": local_model,
}
for name, model in models.items():
print(f"\n{'='*50}")
print(f"【{name}】")
try:
print(chat_with_model(model, test_prompt))
except Exception as e:
print(f"调用失败: {e}")
1.4 高级用法:带记忆的多轮对话
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
# 使用任意模型(以通义千问兼容模式为例)
llm = ChatOpenAI(
model="qwen-plus",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature=0.7,
)
# 配置记忆
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=False,
)
# 创建对话链
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=False,
)
# 多轮对话
print(conversation.predict(input="你好,我叫小明"))
print(conversation.predict(input="我叫什么名字?")) # 能记住之前的对话
二、OpenRouter 方案
OpenRouter 提供了一个统一的 API,用一个 API Key 访问 40+ 个模型(OpenAI、Anthropic、Google、Meta 等)。
2.1 安装依赖
pip install openai # OpenRouter 兼容 OpenAI API 格式
# 或使用第三方封装
pip install openrouter
2.2 方式一:直接使用 OpenAI SDK 调用 OpenRouter
OpenRouter 的 API 与 OpenAI 完全兼容,只需修改 base_url 和 api_key。
import os
from openai import OpenAI
# ====================== 配置 OpenRouter ======================
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=os.getenv("OPENROUTER_API_KEY"),
# 可选:设置应用信息以便 OpenRouter 统计
default_headers={
"HTTP-Referer": "http://localhost:3000", # 你的应用地址
"X-Title": "My AI App", # 应用名称
}
)
# ====================== 调用不同模型 ======================
def chat_with_openrouter(model: str, prompt: str) -> str:
"""通过 OpenRouter 调用任意模型"""
response = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "你是一个有用的AI助手。"},
{"role": "user", "content": prompt}
],
temperature=0.7,
max_tokens=2048,
)
return response.choices[0].message.content
# ====================== 测试多个模型 ======================
if __name__ == "__main__":
test_prompt = "请用一句话介绍什么是大语言模型。"
# OpenRouter 支持的模型列表
models = [
"openai/gpt-4o", # OpenAI
"anthropic/claude-3.5-sonnet", # Anthropic Claude
"google/gemini-2.0-flash", # Google Gemini
"meta-llama/llama-3.2-3b-instruct", # Meta Llama
"qwen/qwen-2.5-72b-instruct", # 通义千问
"deepseek/deepseek-chat", # DeepSeek
]
for model in models:
print(f"\n{'='*50}")
print(f"【{model}】")
try:
print(chat_with_openrouter(model, test_prompt))
except Exception as e:
print(f"调用失败: {e}")
2.3 方式二:LangChain + OpenRouter 集成
LangChain 原生支持 OpenRouter,可以通过 ChatOpenAI 调用:
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage
import os
# ====================== 配置 OpenRouter ======================
# 通过 ChatOpenAI 调用 OpenRouter
openrouter = ChatOpenAI(
model="openai/gpt-4o", # OpenRouter 模型标识符
api_key=os.getenv("OPENROUTER_API_KEY"),
base_url="https://openrouter.ai/api/v1",
temperature=0.7,
max_tokens=2048,
# 可选:OpenRouter 特有参数
default_headers={
"HTTP-Referer": "http://localhost:3000",
"X-Title": "My LangChain App",
}
)
# ====================== 动态切换模型 ======================
def get_openrouter_model(model_name: str):
"""根据模型名称创建 OpenRouter 模型实例"""
return ChatOpenAI(
model=model_name,
api_key=os.getenv("OPENROUTER_API_KEY"),
base_url="https://openrouter.ai/api/v1",
temperature=0.7,
)
# ====================== 测试 ======================
if __name__ == "__main__":
test_prompt = "请用一句话介绍什么是大语言模型。"
messages = [HumanMessage(content=test_prompt)]
# 切换不同模型测试
models_to_test = [
"openai/gpt-4o",
"anthropic/claude-3.5-sonnet",
"meta-llama/llama-3.2-3b-instruct",
]
for model_name in models_to_test:
print(f"\n{'='*50}")
print(f"【{model_name}】")
try:
model = get_openrouter_model(model_name)
response = model.invoke(messages)
print(response.content)
except Exception as e:
print(f"调用失败: {e}")
2.4 OpenRouter 高级功能:自动路由
OpenRouter 支持 openrouter/auto 自动选择最适合处理当前提示的模型:
# 使用自动路由
auto_model = ChatOpenAI(
model="openrouter/auto", # 自动选择最佳模型
api_key=os.getenv("OPENROUTER_API_KEY"),
base_url="https://openrouter.ai/api/v1",
temperature=0.7,
)
response = auto_model.invoke([HumanMessage(content="帮我写一个快速排序算法")])
print(response.content)
三、方案对比总结
| 特性 | LangChain(原生集成) | LangChain(OpenAI兼容) | OpenRouter |
|---|---|---|---|
| 统一接口 | ✅ BaseChatModel |
✅ ChatOpenAI |
✅ OpenAI 兼容 |
| 支持的模型 | 需安装对应集成包 | 任何提供 OpenAI 兼容端点的模型 | 40+ 模型 |
| API Key 管理 | 每个厂商单独管理 | 每个厂商单独管理 | 单个 API Key |
| 模型切换 | 修改 model_provider 和参数 |
修改 model、api_key、base_url |
修改 model 名称 |
| 国内模型支持 | 通义千问、文心一言等 | 通义千问(兼容模式) | 通义千问、DeepSeek 等 |
| 本地模型支持 | ✅ Ollama、vLLM | ✅ Ollama(兼容模式) | ❌ 不支持本地 |
| 额外功能 | 记忆、Chain、Agent 等丰富生态 | 同上 | 自动路由、模型回退 |
选择建议
- 需要 LangChain 完整生态(记忆、Agent、Chain 等)→ 选择 LangChain 方案
- 需要统一管理多个云厂商模型,减少 API Key 管理成本 → 选择 OpenRouter
- 需要调用本地模型(Ollama、vLLM)→ 选择 LangChain + OpenAI 兼容模式
- 需要调用国内模型(通义千问、文心一言)且不想折腾兼容性 → 选择 LangChain 官方集成包(
langchain-dashscope、langchain-qianfan)
核心结论:无论哪种方案,核心差异始终是 api_key、base_url 和 model 三个参数,统一接口让你只需改动这几行配置即可切换模型。
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: