1. 概述
LangChain 的 Models 模块为开发者提供了与各类大型语言模型(LLM) 交互的标准化接口。LLM 能够像人类一样理解和生成文本,其能力不仅限于文本生成,还扩展至内容创作、语言翻译、摘要总结和问答等多种任务,且通常无需为每项任务进行专门训练。现代模型通常还支持以下高级功能:
- 工具调用:调用外部工具(如数据库查询、API 请求)并在回应中使用其结果。
- 结构化输出:将模型的输出约束为预定义的格式。
- 多模态处理:处理和生成除文本外的图像、音频、视频等数据。
- 推理:模型执行多步推理以得出结论。
本指南将详细阐述如何在 LangChain 中有效地初始化、配置和使用这些模型。
2. 基础用法
模型可通过两种核心方式使用:
- 与智能体配合:在创建智能体时动态指定模型。
- 独立使用:直接调用模型执行文本生成、分类或信息抽取等任务,无需完整的智能体框架。
2.1 初始化模型
使用 init_chat_model 函数是初始化独立模型的最简便方式。该函数支持从主流的聊天模型提供商进行初始化,例如 OpenAI、Anthropic、Google Gemini、Azure、AWS Bedrock、HuggingFace 等。
示例:初始化 OpenAI GPT-4.1 模型
python
# 1. 安装必要的包(如果尚未安装)
# pip install -U "langchain[openai]"
# 2. 设置环境变量(推荐从安全位置加载密钥)
import os
os.environ["OPENAI_API_KEY"] = "sk-..." # 替换为你的实际 API 密钥
# 3. 导入并初始化模型
from langchain.chat_models import init_chat_model
model = init_chat_model("gpt-4.1") # 指定模型名称
init_chat_model 也支持通过 provider:model 的格式直接指定提供商和模型,例如 openai:o1。更多参数配置细节可查阅其官方文档。
2.2 支持的模型
LangChain 支持所有主流的模型提供商。每个提供商都提供了多种具备不同能力的模型。完整的支持列表请参阅 LangChain 的 Integrations 页面。
2.3 核心方法概览
模型对象主要提供以下三种调用方法,以适应不同的应用场景:
invoke:最基础的调用方式,接收输入并返回完整的输出消息。stream:流式调用,在模型生成输出的同时实时逐块返回结果。batch:批处理调用,将多个独立请求打包发送以提高处理效率和降低成本。
除了聊天模型,LangChain 还支持其他相关技术,如嵌入模型 和向量数据库。
3. 模型参数详解
聊天模型的行为可通过一系列参数进行配置。虽然不同模型和提供商支持的参数略有差异,但以下是一些通用且重要的参数:
model:指定要使用的具体模型标识符。api_key:提供商认证所需的密钥,通常通过环境变量设置。temperature:控制输出随机性的浮点数(通常 0.0 到 2.0)。值越高,输出越具有创造性和随机性;值越低,输出越确定和一致。max_tokens:限制模型响应中生成的最大令牌(token)数量,从而控制输出长度。timeout:等待模型响应的最长时间(秒),超时则取消请求。max_retries:当请求因网络超时、速率限制等原因失败时,系统重试的最大次数。
这些参数可以在初始化模型时通过关键字参数传入。
示例:初始化时配置参数
python
model = init_chat_model(
"claude-sonnet-4-5-20250929", # 指定 Anthropic 的 Claude Sonnet 模型
# 传入模型参数
temperature=0.7, # 适度的创造性
timeout=30, # 30秒超时
max_tokens=1000, # 最多生成1000个token
)
注意:每个聊天模型集成可能还有提供商特定的功能参数。请查阅相应提供商的集成文档以获取完整列表。
4. 调用模型
模型必须被调用才能生成输出。针对不同场景,有三种主要的调用方式。
4.1 普通调用(Invoke)
invoke() 方法是调用模型最直接的方式,可以接收单个消息或消息列表作为输入。消息列表用于表示对话历史,每条消息都有一个 role 属性来标识对话中的发送者。
示例:使用不同的输入格式
python
# 1. 传入单个字符串(系统会自动包装为 HumanMessage)
response = model.invoke("为什么鹦鹉的羽毛如此多彩?")
print(response)
# 2. 传入字典格式的消息列表
conversation_dict = [
{"role": "system", "content": "你是一个将英文翻译成中文的助手。"},
{"role": "user", "content": "Translate: I love programming."},
{"role": "assistant", "content": "我喜欢编程。"},
{"role": "user", "content": "Translate: Artificial Intelligence."}
]
response = model.invoke(conversation_dict)
print(response) # 输出: AIMessage(content="人工智能。")
# 3. 传入消息对象(更规范,推荐用于复杂场景)
from langchain.messages import HumanMessage, AIMessage, SystemMessage
conversation_objects = [
SystemMessage("你是一个将英文翻译成中文的助手。"),
HumanMessage("Translate: I love programming."),
AIMessage("我喜欢编程。"),
HumanMessage("Translate: Artificial Intelligence.")
]
response = model.invoke(conversation_objects)
print(response)
重要提示 :聊天模型(如 ChatOpenAI)的 invoke() 返回的是 AIMessage 对象。请确保你使用的是聊天模型,而非传统的文本补全 LLM。
4.2 流式调用(Stream)
大多数模型支持流式输出,即在生成内容的同时逐步返回。这能显著提升长文本响应的用户体验。
基础流式调用示例
python
# 逐块打印输出
for chunk in model.stream("为什么鹦鹉会模仿人说话?"):
print(chunk.text, end="", flush=True) # 实时输出,不换行
- 与
invoke的区别 :stream()返回一个迭代器,产出多个AIMessageChunk对象,每个包含输出文本的一部分。 - 组装完整消息:可以通过累加这些块来重建完整的消息。
python
full_message = None
for chunk in model.stream("天空是什么颜色的?"):
full_message = chunk if full_message is None else full_message + chunk
# 可以在此处实时查看构建过程
print(full_message.text)
# 最终,full_message 等同于 invoke 返回的结果
高级:事件流(astream_events)
astream_events() 方法可以流式传输语义事件,便于基于事件类型和元数据进行过滤,并会在后台自动聚合完整消息。
python
import asyncio
async def track_events():
async for event in model.astream_events("你好"):
if event["event"] == "on_chat_model_start":
print(f"输入内容: {event['data']['input']}")
elif event["event"] == "on_chat_model_stream":
print(f"生成词元: {event['data']['chunk'].text}")
elif event["event"] == "on_chat_model_end":
print(f"完整消息: {event['data']['output'].text}")
asyncio.run(track_events())
"自动流式"模式
在某些场景下(例如在 LangGraph 智能体的流式应用中),即使你调用了 model.invoke(),LangChain 也会自动切换到内部的流式模式,以确保整个应用的流式输出能包含模型的中间生成过程。
4.3 批量调用(Batch)
对于大量独立的请求,使用 batch() 方法进行批处理可以提升性能并降低成本。
基础批处理
python
questions = [
"为什么鹦鹉的羽毛色彩鲜艳?",
"飞机是如何飞行的?",
"什么是量子计算?"
]
responses = model.batch(questions)
for response in responses:
print(response.content)
按完成顺序返回的批处理
batch_as_completed() 方法会在每个请求完成后立即返回结果,而不是等待整批完成。结果可能以乱序到达。
python
for response in model.batch_as_completed(questions):
print(response) # 每个 response 包含输入索引等信息
控制并发度
处理大量输入时,可以通过 RunnableConfig 控制最大并行调用数。
python
model.batch(
questions,
config={'max_concurrency': 5} # 限制最多5个并发请求
)
5. 工具调用(Tool Calling)
工具调用功能允许模型请求执行外部工具(如查询数据库、搜索网络或运行代码),并将结果整合到其响应中。工具由两部分组成:
- 模式定义:包含工具名称、描述和参数定义(通常为 JSON 模式)。
- 执行函数:实际执行任务的函数或可调用对象。
工具调用流程:
- 用户向模型提问。
- 模型判断是否需要调用工具,并生成工具调用请求。
- 系统执行工具。
- 将工具执行结果返回给模型。
- 模型结合结果生成最终回答。
5.1 基础使用
首先需要将用户定义的工具"绑定"到模型上,模型才能在后续调用中根据需要选择使用它们。
python
from langchain.tools import tool
# 1. 定义一个工具(使用装饰器)
@tool
def get_weather(location: str) -> str:
"""获取指定地点的天气情况。"""
# 这里应该是真实的 API 调用,此处为示例
return f"{location} 的天气是晴朗的,22°C。"
# 2. 将工具绑定到模型
model_with_tools = model.bind_tools([get_weather])
# 3. 调用模型
response = model_with_tools.invoke("波士顿天气怎么样?")
# 4. 查看模型是否请求调用工具
if response.tool_calls:
for tool_call in response.tool_calls:
print(f"请求调用工具: {tool_call['name']}")
print(f"传入参数: {tool_call['args']}")
注意 :某些模型提供商支持强制工具调用模式,可以通过模型或调用参数启用。
5.2 工具执行循环
当模型返回工具调用请求时,你需要手动执行工具并将结果传回模型,形成一个完整的对话循环。LangChain 的智能体抽象层会自动处理这个流程,但在独立使用模型时,可以按以下方式操作:
python
# 绑定工具
model_with_tools = model.bind_tools([get_weather])
# 初始化对话历史
messages = [{"role": "user", "content": "波士顿和纽约的天气分别怎么样?"}]
# 第一步:模型生成请求,其中可能包含工具调用
ai_msg = model_with_tools.invoke(messages)
messages.append(ai_msg)
# 第二步:执行所有被请求的工具,并收集结果
for tool_call in ai_msg.tool_calls:
# 根据 tool_call 中的信息执行对应工具
tool_result = get_weather.invoke(tool_call["args"])
# 将结果作为 ToolMessage 加入历史
messages.append(tool_result)
# 第三步:将工具执行结果传回模型,生成最终响应
final_response = model_with_tools.invoke(messages)
print(final_response.text)
每个 ToolMessage 都包含一个 tool_call_id,用于与原始的调用请求匹配,帮助模型关联结果。
通过掌握上述内容,你应该能够在 LangChain 框架中有效地集成和利用各类大型语言模型,构建功能丰富的 AI 应用。对于更高级的主题(如结构化输出、多模态处理)和特定提供商的细节,建议深入查阅 LangChain 官方文档和相应的集成页面。