LangChain智能体开发入门(二)

68 阅读4分钟

Models(模型)的连接

目前LangChain有两种与大语言模型连接的核心方法,对应两种抽象的接口:LLMChatModel ,分别对接“文本补全型”和“对话聊天型”大语言模型。

  1. 基础文本生成接口(LLM),这种接口连接方式官方已经不再推荐使用,下面我来简单说明:

在LangChain中,LLM接口的用途为纯文本补全(text completion)模型。输入输出都是字符串,典型的就是用于旧版 GPT-3(如 text-davinci-003)、某些本地模型(如通过 Hugging Face pipeline 加载的非聊天模型)。

为什么说是非聊天模型?在 LangChain(以及现代 LLM API)中,“聊天格式”(chat format)特指 以“消息列表(list of messages)”作为输入,每条消息带有角色(role) ,例如:

[ 
SystemMessage(content="你是一个数学老师。"),
HumanMessage(content="2+2等于多少?"),
AIMessage(content="2+2等于4。"), 
HumanMessage(content="那 3+3 呢?") 
]

这种格式源于 OpenAI 的 Chat Completions API,其底层请求结构是:

{
  "model": "gpt-4o",
  "messages": [
    {"role": "system", "content": "你是一个数学老师。"},
    {"role": "user", "content": "2+2等于多少?"},
    {"role": "assistant", "content": "2+2等于4。"}
  ]
}

这就是支持聊天格式的模型:能理解 system/user/assistant 等角色,并据此生成上下文连贯的回复。
不支持聊天格式的模型:只接受一个纯字符串作为输入,比如 "2+2等于多少?",没有角色、没有对话历史的概念。比如:

输入:"法国的首都是"
输出:"巴黎。"

这种模式,它可能能勉强续写,但这不是“原生支持聊天格式”,而是靠你手动构造 prompt 模拟对话

  1. LangChain的第二种模型连接方式,通过ChatModel(聊天对话接口),也是官方主推的一种,通过ChatOpenAI和init_chat_model两种方法来连接模型,下面通过代码来展示使用方法:
from langchain_openai import ChatOpenAI  # 模型交互工具
from langchain_core.messages import HumanMessage  # 用户消息载体
import os  # 系统环境工具
from dotenv import load_dotenv  # 环境变量加载工具

# 加载环境变量
load_dotenv()

# 初始化模型,设置参数
chat = ChatOpenAI(
    model="deepseek-chat",
    streaming=True,  # 流式响应
    temperature=0.7,  # 模型温度(0-1之间,越高越随机,越低越严谨)
    max_tokens=1000,  # 模型生成的最大token数
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url=os.getenv("DEEPSEEK_BASE_URL")
)

# 发送消息与打印内容
response = chat.invoke([HumanMessage(content="你好,介绍一下你自己")])
print(response.content)

这是一个使用ChatOpenAI的简单示例,该类适用于API接口兼容 OpenAI 规范的模型(如 DeepSeek),因为这些模型遵循了 OpenAI 的请求/响应格式,通过ChatOpenAI和自定义base_url/api_key 适配。但是,不是所有的模型接口都兼容OpenAI,所以,LangChain开发了一个统一的方法:init_chat_model,该方法适用于官方适配的绝大多数主流模型提供商(如 OpenAI、DeepSeek、Anthropic 等),示例如下:

from langchain_core.output_parsers import StrOutputParser
from langchain.chat_models import init_chat_model
from dotenv import load_dotenv

# 加载项目根目录的 .env,确保可读取 DEEPSEEK_API_KEY
load_dotenv()

# 自动适配底层 API,无需手动配置 base_url
model = init_chat_model(model="deepseek-chat", model_provider="deepseek")  

# 直接使用模型 + 输出解析器搭建一个链
basic_qa_chain = model | StrOutputParser()

# 测试链
response = basic_qa_chain.invoke("你好,介绍一下你自己")
print(response)

以上两种都是 ChatModel 接口的具体实现方式,核心差异集中在兼容性和配置复杂度上,具体对比如下:

对比维度ChatOpenAI 类init_chat_model 方法
核心定位适配 OpenAI 规范的专属工具兼容多厂商的通用工具
适用场景连接 API 兼容 OpenAI 规范的模型(如 DeepSeek、GPT 系列)连接 LangChain 官方适配的主流模型(OpenAI、DeepSeek、Anthropic 等)
兼容性仅支持 OpenAI 规范兼容模型,小众模型可能失效覆盖绝大多数主流厂商,兼容性更广
配置复杂度需手动指定 base_url 和对应厂商 API 密钥仅需指定 model 和 model_provider,自动适配底层配置
参数控制粒度可精细控制 OpenAI 规范相关参数(如 streaming、frequency_penalty)以通用参数为主,厂商特有参数需通过 **kwargs 传递
切换模型成本切换非 OpenAI 规范模型时,需重新适配配置切换模型仅需修改 model 和 model_provider 参数
上手难度需了解目标模型的 OpenAI 兼容情况,略高无需关注底层 API 差异,上手更简易

通过以上的对比结果,我们得出两点建议

  • 若你使用的模型明确兼容 OpenAI 规范(如 DeepSeek、GPT-3.5/4 系列),且需要精细控制模型参数,优先选 ChatOpenAI 类
  • 若你需要频繁切换不同厂商的模型(如今天用 DeepSeek、明天用 Anthropic Claude),或不确定模型是否兼容 OpenAI 规范,优先选 init_chat_model 方法,效率更高、兼容性更有保障。