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 模型
# 1. 安装必要的包(如果尚未安装)# pip install -U "langchain[openai]"# 2. 设置环境变量(推荐从安全位置加载密钥)importos os.environ["OPENAI_API_KEY"]="sk-..."# 替换为你的实际 API 密钥# 3. 导入并初始化模型fromlangchain.chat_modelsimportinit_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:当请求因网络超时、速率限制等原因失败时,系统重试的最大次数。
这些参数可以在初始化模型时通过关键字参数传入。
示例:初始化时配置参数
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属性来标识对话中的发送者。
示例:使用不同的输入格式
# 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. 传入消息对象(更规范,推荐用于复杂场景)fromlangchain.messagesimportHumanMessage,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)
大多数模型支持流式输出,即在生成内容的同时逐步返回。这能显著提升长文本响应的用户体验。
基础流式调用示例
# 逐块打印输出forchunkinmodel.stream("为什么鹦鹉会模仿人说话?"):print(chunk.text,end="",flush=True)# 实时输出,不换行- 与
invoke的区别:stream()返回一个迭代器,产出多个AIMessageChunk对象,每个包含输出文本的一部分。 - 组装完整消息:可以通过累加这些块来重建完整的消息。
full_message=Noneforchunkinmodel.stream("天空是什么颜色的?"):full_message=chunkiffull_messageisNoneelsefull_message+chunk# 可以在此处实时查看构建过程print(full_message.text)# 最终,full_message 等同于 invoke 返回的结果高级:事件流(astream_events)
astream_events()方法可以流式传输语义事件,便于基于事件类型和元数据进行过滤,并会在后台自动聚合完整消息。
importasyncioasyncdeftrack_events():asyncforeventinmodel.astream_events("你好"):ifevent["event"]=="on_chat_model_start":print(f"输入内容:{event['data']['input']}")elifevent["event"]=="on_chat_model_stream":print(f"生成词元:{event['data']['chunk'].text}")elifevent["event"]=="on_chat_model_end":print(f"完整消息:{event['data']['output'].text}")asyncio.run(track_events())“自动流式”模式
在某些场景下(例如在 LangGraph 智能体的流式应用中),即使你调用了model.invoke(),LangChain 也会自动切换到内部的流式模式,以确保整个应用的流式输出能包含模型的中间生成过程。
4.3 批量调用(Batch)
对于大量独立的请求,使用batch()方法进行批处理可以提升性能并降低成本。
基础批处理
questions=["为什么鹦鹉的羽毛色彩鲜艳?","飞机是如何飞行的?","什么是量子计算?"]responses=model.batch(questions)forresponseinresponses:print(response.content)按完成顺序返回的批处理
batch_as_completed()方法会在每个请求完成后立即返回结果,而不是等待整批完成。结果可能以乱序到达。
forresponseinmodel.batch_as_completed(questions):print(response)# 每个 response 包含输入索引等信息控制并发度
处理大量输入时,可以通过RunnableConfig控制最大并行调用数。
model.batch(questions,config={'max_concurrency':5}# 限制最多5个并发请求)5. 工具调用(Tool Calling)
工具调用功能允许模型请求执行外部工具(如查询数据库、搜索网络或运行代码),并将结果整合到其响应中。工具由两部分组成:
- 模式定义:包含工具名称、描述和参数定义(通常为 JSON 模式)。
- 执行函数:实际执行任务的函数或可调用对象。
工具调用流程:
- 用户向模型提问。
- 模型判断是否需要调用工具,并生成工具调用请求。
- 系统执行工具。
- 将工具执行结果返回给模型。
- 模型结合结果生成最终回答。
5.1 基础使用
首先需要将用户定义的工具“绑定”到模型上,模型才能在后续调用中根据需要选择使用它们。
fromlangchain.toolsimporttool# 1. 定义一个工具(使用装饰器)@tooldefget_weather(location:str)->str:"""获取指定地点的天气情况。"""# 这里应该是真实的 API 调用,此处为示例returnf"{location}的天气是晴朗的,22°C。"# 2. 将工具绑定到模型model_with_tools=model.bind_tools([get_weather])# 3. 调用模型response=model_with_tools.invoke("波士顿天气怎么样?")# 4. 查看模型是否请求调用工具ifresponse.tool_calls:fortool_callinresponse.tool_calls:print(f"请求调用工具:{tool_call['name']}")print(f"传入参数:{tool_call['args']}")注意:某些模型提供商支持强制工具调用模式,可以通过模型或调用参数启用。
5.2 工具执行循环
当模型返回工具调用请求时,你需要手动执行工具并将结果传回模型,形成一个完整的对话循环。LangChain 的智能体抽象层会自动处理这个流程,但在独立使用模型时,可以按以下方式操作:
# 绑定工具model_with_tools=model.bind_tools([get_weather])# 初始化对话历史messages=[{"role":"user","content":"波士顿和纽约的天气分别怎么样?"}]# 第一步:模型生成请求,其中可能包含工具调用ai_msg=model_with_tools.invoke(messages)messages.append(ai_msg)# 第二步:执行所有被请求的工具,并收集结果fortool_callinai_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 官方文档和相应的集成页面。