这里说的模型,完整叫法是大语言模型(LLM)。它能够理解人类语言,使用人类语言生成内容、翻译、提取摘要、回答问题等。
不仅如此,现在大多数的模型还有一些特别能力:

  • Tool calling - 调用外部工具(例如查询数据库或调用 API),并在其回复中使用这些工具返回的结果。
  • Structured output - 将模型的响应结果约束为遵循已定义的格式,例如:json
  • Multimodality - 可以处理和返回文本以外的数据,如图像、音频和视频。
  • Reasoning - 模型可以执行多步推理来得出结论。

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

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

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

1、初始化模型

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

  • 使用init_chat_model函数,由langchain自动创建模型对象
  • 使用不同模型对应的Model类,手动创建模型对象
1.1、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,改变模型名称即可,其它代码不用动。

1.2、自定义模型及参数

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'>

可见,通过参数自定义模型时,模型的类型由model_provider参数类决定。

除了修改模型提供者以外,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,
)
1.3、 使用Model类

其实init_chat_model方法底层就是帮我们利用Model类创建对象。但只支持有限的模型。而在langchain的社区,除了langchain官方提供的Model,还有些类是社区提供,更丰富多样。

具体支持的模型,可以查看官网地址:https://docs.langchain.com/oss/python/integrations/chat

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

  1. 首先,我们需要安装依赖
  2. LangChain社区依赖:
 uv add langchain-community
  1. 阿里云百炼依赖:
 uv add dashscope
  1. 然后,我们就可以使用Model类初始化模型了
from langchain_community.chat_models.tongyi import ChatTongyi

# 使用Model类初始化模型
model = ChatTongyi(
    model="qwen-plus"
    # 其它模型参数...
)
  1. 测试,查看生成的模型类型:
print(type(model)) # <class 'langchain_community.chat_models.tongyi.ChatTongyi'>

2 、访问模型

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

  • invoke:阻塞式访问
  • stream:流式访问
2.1、 invoke

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

# 调用invoke方法
response = model.invoke("月亮的首都是哪里?")

# 查看响应结果
print(response)
2.2、 stream

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

# 通过.stream方法实现流式访问
stream = model.stream("月亮的首都是哪里?")

# stream调用返回的结果是一个generator,方便我们循环获取结果
print(type(stream))

# 遍历stream结果,实时打印AI的回复
for chunk in stream:
    print(chunk.content, end="", flush=True)

3、在Agent中使用模型

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

3.1、 创建智能体
  1. 创建智能体,指定模型名,由Langchain初始化模型
from langchain.agents import create_agent

# 1.指定Model名称,由LangChain自动初始化模型
agent = create_agent(model="deepseek-chat")
  1. 创建智能体,并使用创建好的model
from langchain.agents import create_agent
from langchain_community.chat_models.tongyi import ChatTongyi

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

# 2.使用初始化好的model创建智能体
agent = create_agent(model=model)
3.2、 调用智能体

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

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

print(response)
  1. 流式调用,只需要把调用方式改为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模式即可。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐