公司动态
LangChain:ChatModel 聊天模型与可配置模拟器
目录一、什么是聊天模型1.1 什么是消息1.2 模型的分类1.2.1 真实聊天模型1.2.2 可配置模拟器模型1.3 与LLM的区别1.4 注意事项二、通过API来定义聊天模型2.1 ChatDeepSeek2.2 init_chat_model2.2.1 函数定义2.2.2 实例1创建无配置模型2.2.3 实例2创建可配置模型2.2.4 实例3创建带有默认值的可配置模型一、什么是聊天模型在 LangChain 体系里聊天模型 ChatModel是专门面向对话场景的模型抽象区别于老式的大文本 LLM。老式LLM输入字符串输出字符串ChatModel聊天模型输入消息对象列表输出消息对象AIMessage这就调用.invoke()拿到的返回值。1.1 什么是消息聊天模型不拿裸字符串当完整输入使用消息对象区分角色SystemMessage系统提示设定角色、规则HumanMessage用户输入人类说的话AIMessageAI 模型返回的消息ToolMessage工具调用返回结果from langchain_core.messages import HumanMessage, SystemMessage chat_model ChatDeepSeek( modeldeepseek-chat, # 或 deepseek-reasoner temperature0, max_tokensNone, timeoutNone, max_retries2, ) messages [ SystemMessage(content你是助手), HumanMessage(content你叫什么名字) ] res chat_model.invoke(messages) # res 得到 AIMessage 对象res.content 才是文本 print(res.content)1.2 模型的分类1.2.1 真实聊天模型代表ChatOpenAI、ChatAnthropic、ChatZhipuAI实例化的时候就创建底层 http 客户端构造时填入model、temperature、api_key、max_tokens直接向真实大模型服务发网络请求如果想要运行时动态修改参数需要混入RunnableConfigurable配置configurable_fields。chat_model ChatDeepSeek( modeldeepseek-chat, # 或 deepseek-reasoner temperature0, max_tokensNone, timeoutNone, max_retries2, )1.2.2 可配置模拟器模型init_chat_model()不传入model参数时返回它只是占位包装器不是真正的聊天模型。不会创建底层模型客户端不会发起网络请求实现了BaseChatModel全部接口对外 API 和真实模型一模一样。invoke 调用阶段读取config[configurable]里的运行时配置用拿到的model、model_provider和其他参数现场构建真实聊天模型实例。特例不传入model时model、model_provider无需写进configurable_fields就可以运行时配置其余所有参数必须加入configurable_fields白名单运行时才允许修改。使用场景开发通用框架把选用什么模型推迟到业务请求到来时才确定避免代码硬编码模型modelinit_chat_model(configurable_fields{model,model_provider, temperature, max_tokens}) aimessmodel.invoke( 你是谁, config{configurable:{ model:deepseek-chat,model_provider:deepseek,temperature:0.6,max_tokens:100}} ) print(aimess.content)1.3 与LLM的区别项目ChatModel聊天模型老式 LLM输入消息对象列表[HumanMessage,SystemMessage]原始字符串输出AIMessage对象.content拿文本原始字符串原生支持system 提示、工具调用、多轮对话需要手动拼接字符串代表ChatOpenAIOpenAI1.4 注意事项返回值是对象不是字符串直接打印对象会看到完整对象必须取.content工具调用场景AIMessage.content可以为空工具调用数据放在additional_kwargs[tool_calls]_ConfigurableModel模拟器只是包装只有 invoke 那一刻才创建真实模型模拟器本身没有 api_key、model 这些真实客户端属性模拟器仅model/model_provider享有默认可配置特权其余参数必须写进configurable_fields。简单总结聊天模型是 LangChain 针对对话任务的抽象接收结构化消息返回结构化消息对象模拟器是它的延迟实例化包装变体专门用于运行时动态选定模型。二、通过API来定义聊天模型2.1 ChatDeepSeekChatDeepSeek 是 LangChain 官方维护的 DeepSeek 云 API 聊天模型包装器属于 langchain-deepseek 包基类是 BaseChatOpenAIBaseLanguageModel └── BaseChatModel └── BaseChatOpenAI └── ChatDeepSeek # langchain-deepseek 提供参数说明model模型名如deepseek-v4-flash/deepseek-v4-protemperature采样温度默认 1max_tokens生成上限timeout/max_retries客户端超时与重试api_key不传则读系统环境变量DEEPSEEK_API_KEY代码示例from langchain_deepseek import ChatDeepSeek from langchain_core.messages import HumanMessage, SystemMessage from langchain_core.output_parsers import StrOutputParser #直接定义模型自动读取系统环境变量中的 DEEPSEEK_API_KEY model ChatDeepSeek( modeldeepseek-chat, # 或 deepseek-reasoner temperature0, max_tokensNone, timeoutNone, max_retries2, ) messages[ SystemMessage(content), HumanMessage(contenthi!), ] parserStrOutputParser() 定义链 chainmodel | parser chainmodel.pipe(parser) 执行链 print(chain.invoke(messages))其中StrOutputParserLangChain是LangChain 最简单的输出解析器把大模型返回的AIMessage对象提取里面的文本.content输出普通 Python 字符串 str。关于的invoke() 调用。该方法是将单个输入转换为对应的输出。例如对于聊天模型来说就是根据用户的问题输入并输出相应的答案。2.2 init_chat_model上面的ChatDeepSeek 用于明确创建 DeepSeek 聊天模型的实例。而init_chat_model()是一个工厂函数它可以初始化多种支持的聊天模型如 OpenAI、Anthropic、FireworksAI 等不仅仅是 DeepSeek 的聊天模型。2.2.1 函数定义langchain.chat_models.base.init_chat_model( model: str, *, model_provider: str | None None, configurable_fields: Literal[None] None, config_prefix: str | None None, **kwargs: Any, ) - BaseChatModel参数名参数描述model要使用的模型的名称model_provider模型提供方。支持的 model_provider 值和相应的集成包有• openai - langchain-openai• anthropic - langchain-anthropic• google_genai - langchain-google-genai• ollama - langchain-ollama• deepseek - langchain-deepseek如果未指定将尝试从模型推断 model_providerconfigurable_fields设置哪些模型参数是可配置的。若配置为・None: 没有可配置的字段。・any所有字段都是可配置的类似 api_key、base_url 等可以在运行时更改。・Union [List [str], Tuple [str, …]]: 指定的字段是可配置的。config_prefix配置为非空字符串则模型将在运行时通过查找config[configurable][{config_prefix}_{param}]字段设置配置项。配置为空字符串那么模型将可以通过config[configurable][{param}]字段设置配置项。temperature采样温度温度值越高AI 回答越天马行空温度越低回答越保守靠谱。max_tokens要生成的最大令牌数timeout请求超时时间max_retries最大重试次数openai_api_key / api_keyOpenAI API 密钥。如果未传入将从环境变量中读取OPENAI_API_KEY。base_urlAPI 请求的基本 URL。……其他拓展参数init_chat_model() 返回值说明函数返回一个与指定的 model_name 和 model_provider 相对应的 BaseChatModel如 ChatOpenAIChatAnthropic 等。注意要是模型可配置则返回一个聊天模型模拟器该模拟器在传入配置后于运行时才会初始化底层模型。2.2.2 实例1创建无配置模型使用不同的模型提供方需要安装为其各自包与设置各自的 API Key 环境变量例如OpenAI 环境变量配置为OPENAI_API_KEY your_openai_api_key安装命令pip install -U langchain-openaiAnthropic 环境变量配置为ANTHROPIC_API_KEY your_anthropic_api_key安装命令pip install -U langchain-anthropicDeepSeek 环境变量配置为DEEPSEEK_API_KEY your_deepseek_api_key安装命令pip install -U langchain-deepseekGoogle VertexAI 环境变量配置为GOOGLE_API_KEY your_google_api_key安装命令pip install -U langchain-google-vertexai使用init_chat_model创建一个聊天模型deepseek_modeldeepseek_modelinit_chat_model(deepseek-chat,model_providerdeepseek,temperature0) print(deepseek_model.invoke(你是谁).content\n)2.2.3 实例2创建可配置模型以通过指定configurable_fields来创建一个运行时可配置的模型。如果不指定model值则“model”和“model_provider”将默认可配置。也就是说在使用init_chat_model()创建可配置模型时可以通过configurable_fields指定运行时可配置的参数未指定的参数默认不可配置。但model与model_provider这两个参数除外如果在调用init_chat_model()时未传递且未通过configurable_fields指定它们仍然可以在运行时进行配置。#这里我们没有事先指定model也没有通过configurable_fields将其指定为可配置项 modelinit_chat_model(temperature0) #但是我们在运行的时候依然可以配置model字段,且编译时会自动按照model推到provider print(model.invoke( 你是谁, config{configurable:{model:deepseek-chat}} ))除了model与model_provider之外的其他参数如果需要运行时配置必须在调用init_chat_model接口的时候通过参数configurable_fields来指定。modelinit_chat_model(modeldeepseek-chat,configurable_fields{model_provider, temperature, max_tokens}) #参数model_provider, temperature, max_tokens运行时指定 aimessmodel.invoke( 你是谁, config{configurable:{model_provider:deepseek,temperature:0.6,max_tokens:100}} ) print(aimess.content)2.2.4 实例3创建带有默认值的可配置模型如果我们在调用init_chat_model()接口的时候给参数添加了默认值我们还希望该参数在后续运行时也要动态配置与变化那么我们就可以创建出带有默认值的可配置模型。具体做法就是将该参数也添加到configurable_fields中.modelinit_chat_model(modeldeepseek-chat, temperature0.5, max_tokens50, configurable_fields{model_provider, temperature, max_tokens} ) #参数model_provider, temperature, max_tokens运行时指定 aimessmodel.invoke( 你是谁, config{configurable:{model_provider:deepseek,temperature:0.6,max_tokens:100}} ) print(aimess.content)