news 2026/9/27 17:18:54

LangChain核心组件 == 模型(Models)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LangChain核心组件 == 模型(Models)

这里说的模型,完整叫法是大语言模型(LLM)。它能够理解人类语言,使用人类语言生成内容、翻译、提取摘要、回答问题等。

不仅如此,现在大多数的模型还有一些特别能力:

  • Tool calling - 调用外部工具(例如查询数据库或调用 API),并在其回复中使用这些工具返回的结果。

  • Structured output - 将模型的响应结果约束为遵循已定义的格式,例如:json

  • Multimodality - 可以处理和返回文本以外的数据,如图像、音频和视频。

  • Reasoning - 模型可以执行多步推理来得出结论。

可以说LLM就是Agent的大脑,是Agent的推理引擎。它驱动Agent做出每个决定:何时调用工具、调用哪个工具、如何解释结果,以及何时提供最终答案。

LangChain支持现在市面上大部分的大语言模型(LLM),并且提供了统一的模型调用接口。使您可以轻松访问许多不同的模型提供者,并且在模型之间进行试验和切换也变得很容易。

有关模型提供者(Model Providers)的信息和功能,请参阅langchain官网的 chat model page.

初始化模型

langchain提供了两种常见方法用来初始化模型:

  • 使用init_chat_model函数,由langchain自动创建模型对象

  • 使用不同模型对应的Model类,手动创建模型对象

init_chat_model

在LangChain中开始使用独立模型的最简单方法是使用init_chat_model函数。

调用init_chat_model函数时,你需要从langchain支持的模型提供者(Model Provider)中选择一个模型,而langchain会自动初始化这个模型,非常方便。

例如,我们要使用Deepseek这个模型。

首先,我们需要安装模型依赖:

uv add langchain-deepseek

然后,我们要确保在项目的.env环境中配置好api_key:

最后,就可以直接使用init_chat_model初始化模型了:

# 导入Langchain的初始化模型的函数 from langchain.chat_models import init_chat_model # 加载环境变量 from dotenv import load_dotenv load_dotenv() # 调用init_chat_model函数初始化模型,参数model用来指定模型名称,Langchain会根据模型名字自动设定base_url,并从环境变量中获取api_key model = init_chat_model(model="deepseek-chat")

测试,我们可以通过打印model的类型,查看生成的结果:

print(type(model)) # <class 'langchain_deepseek.chat_models.ChatDeepSeek'>

可见,采用init_chat_model自动初始化模型时,模型的类型由LangChain通过模型名称自动推断。

如果要切换其它模型,我们只需要安装其它模型依赖,然后配置API_KEY,改变模型名称即可,其它代码不用动。

自定义模型及参数

init_chat_model默认会根据模型名称自动确定模型的提供者、其base_url,并从env读取api_key,但前提是必须是langchain支持的模型提供者(支持模型参考链接),例如:

  • Openai

  • Deepseek

  • Google

  • Anthropic

  • ...

对于其它不支持的模型,我们必须自定义模型参数来访问。

例如,我们要访问阿里云百炼的qwen-max,它就是不被langchain支持的模型,我们必须自定义模型参数来访问。

  • 我们需要在环境变量中定义api_key和base_url

  • 然后在init_chat_model中指定model、model_provider、base_url和api_key

具体步骤如下:

首先,在.env中配置好api_key和base_url:

然后,手动读取环境变量中的api_key和base_url:

# 非支持模型无法自动加载环境遍历,我们需要自己加载环境变量中的base_url和api_key import os base_url = os.getenv("DASHSCOPE_BASE_URL") api_key = os.getenv("DASHSCOPE_API_KEY")

最后,调用init_chat_model,初始化模型:

# 初始化模型 model = init_chat_model( model="qwen-max", # 模型名称,这里可以自定义,我们用的是阿里的qwen-max model_provider="openai", # 如果是Langchain不支持的模型,需要指定模型提供者(虽然我们用的是阿里,但是阿里兼容openai,所以这里用openai,就是默认采用openai的API规范) base_url=base_url, api_key=api_key )

测试,查看生成的模型类型:

print(type(model)) # <class 'langchain_openai.chat_models.base.ChatOpenAI'>

除了修改模型提供者以外,init_chat_model方法允许我们调整模型参数,例如:

  • temperature: 控制生成文本的随机性,值越小越确定,值越大越随机

  • max_tokens: 控制生成文本的最大长度

  • top_p: 控制生成文本的多样性,值越小越多样,值越大越确定

  • timeout: 控制生成文本的超时时间

  • max_retries: 控制生成文本的最大重试次数

  • ...

# 调用init_chat_model函数初始化模型,并设定模型参数 model = init_chat_model( model="qwen-max", model_provider="openai", base_url=base_url, api_key=api_key, temperature=1.5, )

使用Model类

其实init_chat_model方法底层就是帮我们利用Model类创建对象。但只支持有限的模型。而在langchain的社区,除了langchain官方提供的Model,还有些类是社区提供,更丰富多样。
具体支持的模型,可以查看官网地址:https://docs.langchain.com/oss/python/integrations/chat

例如,我们使用社区版本的Model类来访问阿里云百炼的通义千问模型:

首先,我们需要安装依赖

LangChain社区依赖:

uv add langchain-community

阿里云百炼依赖:

uv add dashscope

然后,我们就可以使用Model类初始化模型了

from langchain_community.chat_models.tongyi import ChatTongyi # 使用Model类初始化模型 model = ChatTongyi( model="qwen-plus" # 其它模型参数... )

测试,查看生成的模型类型:

print(type(model)) # <class 'langchain_community.chat_models.tongyi.ChatTongyi'>

访问模型

LangChain提供了两个不同的方法来访问模型:

  • invoke:阻塞式访问

  • stream:流式访问

invoke

invoke方法是阻塞式调用,需要等待模型生成全部结果才会返回,等待时间较长。

# 调用invoke方法 response = model.invoke("月亮的首都是哪里?") # 查看响应结果 print(response)

stream

阻塞式调用需要等待较长时间才能看到AI返回的结果,而流式调用则可以实时看到AI返回的一个个词。

# 通过.stream方法实现流式访问 stream = model.stream("月亮的首都是哪里?") # stream调用返回的结果是一个generator,方便我们循环获取结果 print(type(stream)) # 遍历stream结果,实时打印AI的回复 for chunk in stream: print(chunk.content, end="", flush=True)

在Agent中使用模型

Langchain提供了一个create_agent方法用来快速创建智能体。当我们创建Agent的时候,可以直接使用创建好的Model,也可以指定模型名,让Langchain自动初始化模型。

创建智能体

创建智能体,指定模型名,由Langchain初始化模型

from langchain.agents import create_agent # 1.指定Model名称,由LangChain自动初始化模型 agent = create_agent(model="deepseek-chat")

创建智能体,并使用创建好的model

import os from dotenv import load_dotenv from langchain.agents import create_agent from langchain_openai import ChatOpenAI # 1. 加载环境变量 load_dotenv() # 2. 使用 Model 类初始化 DeepSeek 模型 model = ChatOpenAI( model="deepseek-chat", api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com", ) # 3. 使用初始化好的 model 创建智能体 agent = create_agent(model=model)

调用智能体

智能体也分为阻塞调用和流式调用两种。

阻塞式调用,使用invoke方法:

# 2.调用模型,需要传入一个消息列表 response = agent.invoke({ "messages": [{"role": "user", "content": "月亮的首都是哪里?"}] }) print(response)

流式调用,只需要把调用方式改为stream:

for token, metadata in agent.stream( {"messages": [{"role": "user", "content": "月亮的首都是哪里?"}]}, stream_mode="messages" ): if token.content: # Check if there's actual content print(token.content, end="", flush=True) # Print token

要注意,Agent的stream模式同样返回一个generator,但是其结构由stream_mode参数决定:

  • messages: 返回LLM生成的每一个片段,是一个包含token和metadata的元组(Tuple)

  • updates: 返回Agent运行过程中的每一次事件,例如与LLM的对话、工具的调用等

  • custom: 返回通过stream writer记录的每一次自定义的输出

如果是为了流式输出AI返回的结果,使用messages模式即可。

总结

目前为止,我们学习了:

  • 如何使用init_chat_model初始化模型

  • 如何使用Model类初始化模型

  • 如何调用模型

  • 如何创建Agent,并在Agent中使用模型

  • 如何调用Agent

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

OpenClaw 阿里云部署实战:从轻量应用服务器搭建到 QQ 端接入使用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 17:12:20

Claude Code 的记忆术:用 Auto-Memory 与 MEMORY.md 给 AI 装上长期记忆

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 17:10:30

AI编程工具Trae Tab-Cue配置TaoToken:settings.json骨架与代码补全验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华