这里说的模型,完整叫法是大语言模型(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