news 2026/2/2 11:10:14

LangChain 模型模块使用详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LangChain 模型模块使用详解

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)

工具调用功能允许模型请求执行外部工具(如查询数据库、搜索网络或运行代码),并将结果整合到其响应中。工具由两部分组成:

  1. 模式定义:包含工具名称、描述和参数定义(通常为 JSON 模式)。
  2. 执行函数:实际执行任务的函数或可调用对象。

工具调用流程

  1. 用户向模型提问。
  2. 模型判断是否需要调用工具,并生成工具调用请求。
  3. 系统执行工具。
  4. 将工具执行结果返回给模型。
  5. 模型结合结果生成最终回答。

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 官方文档和相应的集成页面。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/2 6:43:24

Switch音乐播放器TriPlayer完整使用教程:解锁后台播放新体验

Switch音乐播放器TriPlayer完整使用教程:解锁后台播放新体验 【免费下载链接】TriPlayer A feature-rich background audio player for Nintendo Switch (requires Atmosphere) 项目地址: https://gitcode.com/gh_mirrors/tr/TriPlayer 想要在Switch上边玩游…

作者头像 李华
网站建设 2026/1/26 22:40:07

CSANMT模型版本管理:无缝升级翻译服务的实践

CSANMT模型版本管理:无缝升级翻译服务的实践 🌐 AI 智能中英翻译服务 (WebUI API) 在多语言信息交互日益频繁的今天,高质量、低延迟的自动翻译系统已成为企业出海、学术交流和内容本地化的核心基础设施。我们基于 ModelScope 平台推出的 CSA…

作者头像 李华
网站建设 2026/1/28 7:08:18

5分钟终极指南:如何免费获取并使用Plus Jakarta Sans字体

5分钟终极指南:如何免费获取并使用Plus Jakarta Sans字体 【免费下载链接】PlusJakartaSans Jakarta Sans is a open-source fonts. Designed for Jakarta "City of collaboration" program in 2020. 项目地址: https://gitcode.com/gh_mirrors/pl/Plus…

作者头像 李华
网站建设 2026/1/25 22:57:54

终极指南:3步快速提取Unity包资源的完整教程

终极指南:3步快速提取Unity包资源的完整教程 【免费下载链接】unitypackage_extractor Extract a .unitypackage, with or without Python 项目地址: https://gitcode.com/gh_mirrors/un/unitypackage_extractor Unity包提取工具unitypackage_extractor是一款…

作者头像 李华
网站建设 2026/1/27 16:08:07

Ant Design X Vue终极指南:5步构建企业级AI对话应用

Ant Design X Vue终极指南:5步构建企业级AI对话应用 【免费下载链接】ant-design-x-vue Ant Design X For Vue.(WIP) 疯狂研发中🔥 项目地址: https://gitcode.com/gh_mirrors/an/ant-design-x-vue 你是否正在寻找一个简单…

作者头像 李华
网站建设 2026/1/31 16:04:10

AI+CAD创新:工业设计概念图生成工作流

AICAD创新:工业设计概念图生成工作流 作为一名工业设计师,你是否经常遇到灵感枯竭或手绘草图效率低下的问题?AICAD创新工作流正是为解决这一痛点而生。本文将详细介绍如何利用AI快速生成高质量产品概念草图,并直接导入CAD软件进行…

作者头像 李华