以下是使用 LangChain 和 OpenRouter 统一调用多模型的完整 Demo。

AI摘要
【知识分享】本文详细介绍了使用LangChain和OpenRouter统一调用多模型的技术方案。LangChain通过BaseChatModel抽象层和ChatOpenAI接口,支持OpenAI、通义千问、文心一言及本地Ollama模型,仅需修改model、api_key、base_url三个参数即可切换。OpenRouter则提供单一API Key访问40+模型,兼容OpenAI格式。文章还对比了两种方案的特性与适用场景,并给出了带记忆的多轮对话等高级用法示例。

以下是使用 LangChainOpenRouter 统一调用多模型的完整 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_urlapi_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 和参数 修改 modelapi_keybase_url 修改 model 名称
国内模型支持 通义千问、文心一言等 通义千问(兼容模式) 通义千问、DeepSeek 等
本地模型支持 ✅ Ollama、vLLM ✅ Ollama(兼容模式) ❌ 不支持本地
额外功能 记忆、Chain、Agent 等丰富生态 同上 自动路由、模型回退

选择建议

  1. 需要 LangChain 完整生态(记忆、Agent、Chain 等)→ 选择 LangChain 方案
  2. 需要统一管理多个云厂商模型,减少 API Key 管理成本 → 选择 OpenRouter
  3. 需要调用本地模型(Ollama、vLLM)→ 选择 LangChain + OpenAI 兼容模式
  4. 需要调用国内模型(通义千问、文心一言)且不想折腾兼容性 → 选择 LangChain 官方集成包langchain-dashscopelangchain-qianfan

核心结论:无论哪种方案,核心差异始终是 api_keybase_urlmodel 三个参数,统一接口让你只需改动这几行配置即可切换模型。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!