【LangChain】-- 定义聊天模型
1. 方式一直接API调用–DeepSeek这种方式相当于是三方集成包提供的。聊天模型的API KEY可以在定义的时候可以直接写在里面也可以配置在环境变量中推荐配置在环境变量中。![[Pasted image 20260605131142.png]]fromlangchain_core.messagesimportHumanMessage,SystemMessagefromlangchain_deepseekimportChatDeepSeek# 1. 定义 DeepSeek 模型modelChatDeepSeek(modeldeepseek-chat,# api_keysk-34a424135c6d499e91ab32951a4ec0bf)# 2. 定义消息保持不变messages[SystemMessage(content请帮我进行翻译由英文翻译成中文),HumanMessage(contentmy name is xiaobu)]# 3. 调用大模型resultmodel.invoke(messages)print(result)# 输出翻译结果ChatDeepSeek继承了BaseChatOpenAIBaseChatOpenAI实现了标准的Runnable接口。chat DeepSeek常用初始化参数说明fromlangchain_deepseekimportChatDeepSeek modelChatDeepSeek(model...,# 要使用的 OpenAI 模型的名称temperature0,# 采样温度温度值越高AI 回答越天马行空温度越低回答越保守靠谱。有些模型的温度范围是0~1有的是0~2.max_tokensNone,# 输出文本的最大token数英文一个token约等于4个字符或者0.75个单词中文一个汉字约等于1.5-2个tokentimeoutNone,# 请求超时时间max_retries2,# 最大重试次数# api_key..., # API密钥# other params...)2. 方式二init_chat_model相当于是langchain包提供的。Langchain封装了更上层的方法让我们初始化模型。这种方法可以定义所有的大模型这就体现出来了LangChain的封装性所有的大模型都只需要实现一种标准。2.1 基本用法fromlangchain.chat_modelsimportinit_chat_model# 第二种定义聊天模型的方式# 指定厂商 和 模型名称# 返回的是Runnable实例deepseek_modelinit_chat_model(modeldeepseek-chat,model_providerdeepseek)print(fdeepseek-chat:{deepseek_model.invoke(你是谁?).content})可以看到它就是创建了一个ChatDeepSeek。![[Pasted image 20260605140236.png]]上面API调用可以设置的初始化参数这种方式也同样支持。2.2 可配置模型模型模拟器fromlangchain.chat_modelsimportinit_chat_model# 定义可配置模型模型模拟器config_modelinit_chat_model()print(fdeepseek-chat:{config_model.invoke(你是谁?).content})直接这样调用是会报错的。![[Pasted image 20260605142146.png|479]]在调试中可以看到这是一个可配置模型不是一个真正的模型只是初始化了一下并没有实际的定义出来model.![[Pasted image 20260605142446.png]]这个模型模拟器在运行的时候才能被定义出来在进行invoke的时候invoke方法中有一个配置字段可以对其进行配置abstractmethod# 这是一个抽象方法definvoke(self,input:Input,# 输入一个Runnable实例可以Message, 聊天模型也可以直接传入一个字符串config:RunnableConfig|NoneNone,# 是配置runnable实例的选项input选项传入了一个Runnableconfig选项就对这个Runnable进行配置config就相当于是input的一个辅助工具。**kwargs:Any,)-Output:fromlangchain.chat_modelsimportinit_chat_modelfromlangchain_core.messagesimportSystemMessage,HumanMessage# 定义可配置模型模型模拟器config_modelinit_chat_model()# 定义消息messages[SystemMessage(content请帮我进行翻译由英文翻译成中文),HumanMessage(contentmy name is xiaobu)]print(fdeepseek-chat:{config_model.invoke(inputmessages, config{configurable: {model: deepseek-chat}}).content})2.3 可配置模型带默认配置值fromlangchain.chat_modelsimportinit_chat_modelfromlangchain_core.messagesimportSystemMessage,HumanMessage deepseek_modelinit_chat_model(modeldeepseek-chat,model_providerdeepseek,temperature0.3,max_tokens1024,# 无法直接修改已经存在的属性configurable_fields[max_tokens],# 配置可修改的字段当然其他字段都可以配置进去都可以在后续进行修改包括模型config_prefixfirst# 指定可修改字段的前缀)messages[SystemMessage(content请补全一段故事100个字以内),HumanMessage(content一只猫正在 ),]# 我们想一次完成两个版本的的输出1. 原本的版本2. 精简之后的版本resultdeepseek_model.invoke(inputmessages,config{configurable:{first_max_tokens:10,#修改带有默认配置的字段要加上前缀}})# 输出结果一只猫正在窗台上打盹忽然print(result.content)3. 与原生大模型调用的区别![[Pasted image 20260605131825.png]]消息封装LangChain 使用SystemMessage、HumanMessage、AIMessage等标准化消息类型自动管理角色原生调用需要手动构造role: user字典。统一调用接口无论底层是 OpenAI、DeepSeek 还是本地模型都通过model.invoke()调用更换模型无需修改调用逻辑。返回对象invoke返回AIMessage可以直接获取.content还附带response_metadata等额外信息原生调用只返回纯 JSON。与链/Agent 集成LangChain 封装的模型可以直接传入PromptTemplate、Chain、Agent中构成可组合的工作流原生调用需要手动处理每一步的输入输出拼接。对话历史管理LangChain 会自动将消息列表传递并处理多轮对话原生调用需要自行维护并拼接历史消息。流式输出通过model.stream()一句代码实现流式响应原生需要处理 SSE 或分块解析。通俗理解原生调用是“裸调”你得自己拼请求、解响应、管状态LangChain 封装像一个“适配器”把异构的模型服务统一成标准件方便你拼装复杂应用。