
目錄一、什么是聊天模型1.1 什么是消息1.2 模型的分類1.2.1 真實聊天模型1.2.2 可配置模擬器模型1.3 與LLM的區(qū)別1.4 注意事項二、通過API來定義聊天模型2.1 ChatDeepSeek2.2 init_chat_model2.2.1 函數(shù)定義2.2.2 實例1創(chuàng)建無配置模型2.2.3 實例2創(chuàng)建可配置模型2.2.4 實例3創(chuàng)建帶有默認(rèn)值的可配置模型一、什么是聊天模型在 LangChain 體系里聊天模型 ChatModel是專門面向?qū)υ拡鼍暗哪P统橄髤^(qū)別于老式的大文本 LLM。老式LLM輸入字符串輸出字符串ChatModel聊天模型輸入消息對象列表輸出消息對象AIMessage這就調(diào)用.invoke()拿到的返回值。1.1 什么是消息聊天模型不拿裸字符串當(dāng)完整輸入使用消息對象區(qū)分角色SystemMessage系統(tǒng)提示設(shè)定角色、規(guī)則HumanMessage用戶輸入人類說的話AIMessageAI 模型返回的消息ToolMessage工具調(diào)用返回結(jié)果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實例化的時候就創(chuàng)建底層 http 客戶端構(gòu)造時填入model、temperature、api_key、max_tokens直接向真實大模型服務(wù)發(fā)網(wǎng)絡(luò)請求如果想要運行時動態(tài)修改參數(shù)需要混入RunnableConfigurable配置configurable_fields。chat_model ChatDeepSeek( modeldeepseek-chat, # 或 deepseek-reasoner temperature0, max_tokensNone, timeoutNone, max_retries2, )1.2.2 可配置模擬器模型init_chat_model()不傳入model參數(shù)時返回它只是占位包裝器不是真正的聊天模型。不會創(chuàng)建底層模型客戶端不會發(fā)起網(wǎng)絡(luò)請求實現(xiàn)了BaseChatModel全部接口對外 API 和真實模型一模一樣。invoke 調(diào)用階段讀取config[configurable]里的運行時配置用拿到的model、model_provider和其他參數(shù)現(xiàn)場構(gòu)建真實聊天模型實例。特例不傳入model時model、model_provider無需寫進configurable_fields就可以運行時配置其余所有參數(shù)必須加入configurable_fields白名單運行時才允許修改。使用場景開發(fā)通用框架把選用什么模型推遲到業(yè)務(wù)請求到來時才確定避免代碼硬編碼模型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的區(qū)別項目ChatModel聊天模型老式 LLM輸入消息對象列表[HumanMessage,SystemMessage]原始字符串輸出AIMessage對象.content拿文本原始字符串原生支持system 提示、工具調(diào)用、多輪對話需要手動拼接字符串代表ChatOpenAIOpenAI1.4 注意事項返回值是對象不是字符串直接打印對象會看到完整對象必須取.content工具調(diào)用場景AIMessage.content可以為空工具調(diào)用數(shù)據(jù)放在additional_kwargs[tool_calls]_ConfigurableModel模擬器只是包裝只有 invoke 那一刻才創(chuàng)建真實模型模擬器本身沒有 api_key、model 這些真實客戶端屬性模擬器僅model/model_provider享有默認(rèn)可配置特權(quán)其余參數(shù)必須寫進configurable_fields。簡單總結(jié)聊天模型是 LangChain 針對對話任務(wù)的抽象接收結(jié)構(gòu)化消息返回結(jié)構(gòu)化消息對象模擬器是它的延遲實例化包裝變體專門用于運行時動態(tài)選定模型。二、通過API來定義聊天模型2.1 ChatDeepSeekChatDeepSeek 是 LangChain 官方維護的 DeepSeek 云 API 聊天模型包裝器屬于 langchain-deepseek 包基類是 BaseChatOpenAIBaseLanguageModel └── BaseChatModel └── BaseChatOpenAI └── ChatDeepSeek # langchain-deepseek 提供參數(shù)說明model模型名如deepseek-v4-flash/deepseek-v4-protemperature采樣溫度默認(rèn) 1max_tokens生成上限timeout/max_retries客戶端超時與重試api_key不傳則讀系統(tǒng)環(huán)境變量DEEPSEEK_API_KEY代碼示例from langchain_deepseek import ChatDeepSeek from langchain_core.messages import HumanMessage, SystemMessage from langchain_core.output_parsers import StrOutputParser #直接定義模型自動讀取系統(tǒng)環(huán)境變量中的 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) 執(zhí)行鏈 print(chain.invoke(messages))其中StrOutputParserLangChain是LangChain 最簡單的輸出解析器把大模型返回的AIMessage對象提取里面的文本.content輸出普通 Python 字符串 str。關(guān)于的invoke() 調(diào)用。該方法是將單個輸入轉(zhuǎn)換為對應(yīng)的輸出。例如對于聊天模型來說就是根據(jù)用戶的問題輸入并輸出相應(yīng)的答案。2.2 init_chat_model上面的ChatDeepSeek 用于明確創(chuàng)建 DeepSeek 聊天模型的實例。而init_chat_model()是一個工廠函數(shù)它可以初始化多種支持的聊天模型如 OpenAI、Anthropic、FireworksAI 等不僅僅是 DeepSeek 的聊天模型。2.2.1 函數(shù)定義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參數(shù)名參數(shù)描述model要使用的模型的名稱model_provider模型提供方。支持的 model_provider 值和相應(yīng)的集成包有? openai - langchain-openai? anthropic - langchain-anthropic? google_genai - langchain-google-genai? ollama - langchain-ollama? deepseek - langchain-deepseek如果未指定將嘗試從模型推斷 model_providerconfigurable_fields設(shè)置哪些模型參數(shù)是可配置的。若配置為?None: 沒有可配置的字段。?any所有字段都是可配置的類似 api_key、base_url 等可以在運行時更改。?Union [List [str], Tuple [str, …]]: 指定的字段是可配置的。config_prefix配置為非空字符串則模型將在運行時通過查找config[configurable][{config_prefix}_{param}]字段設(shè)置配置項。配置為空字符串那么模型將可以通過config[configurable][{param}]字段設(shè)置配置項。temperature采樣溫度溫度值越高AI 回答越天馬行空溫度越低回答越保守靠譜。max_tokens要生成的最大令牌數(shù)timeout請求超時時間max_retries最大重試次數(shù)openai_api_key / api_keyOpenAI API 密鑰。如果未傳入將從環(huán)境變量中讀取OPENAI_API_KEY。base_urlAPI 請求的基本 URL?!渌卣箙?shù)init_chat_model() 返回值說明函數(shù)返回一個與指定的 model_name 和 model_provider 相對應(yīng)的 BaseChatModel如 ChatOpenAIChatAnthropic 等。注意要是模型可配置則返回一個聊天模型模擬器該模擬器在傳入配置后于運行時才會初始化底層模型。2.2.2 實例1創(chuàng)建無配置模型使用不同的模型提供方需要安裝為其各自包與設(shè)置各自的 API Key 環(huán)境變量例如OpenAI 環(huán)境變量配置為OPENAI_API_KEY your_openai_api_key安裝命令pip install -U langchain-openaiAnthropic 環(huán)境變量配置為ANTHROPIC_API_KEY your_anthropic_api_key安裝命令pip install -U langchain-anthropicDeepSeek 環(huán)境變量配置為DEEPSEEK_API_KEY your_deepseek_api_key安裝命令pip install -U langchain-deepseekGoogle VertexAI 環(huán)境變量配置為GOOGLE_API_KEY your_google_api_key安裝命令pip install -U langchain-google-vertexai使用init_chat_model創(chuàng)建一個聊天模型deepseek_modeldeepseek_modelinit_chat_model(deepseek-chat,model_providerdeepseek,temperature0) print(deepseek_model.invoke(你是誰).content\n)2.2.3 實例2創(chuàng)建可配置模型以通過指定configurable_fields來創(chuàng)建一個運行時可配置的模型。如果不指定model值則“model”和“model_provider”將默認(rèn)可配置。也就是說在使用init_chat_model()創(chuàng)建可配置模型時可以通過configurable_fields指定運行時可配置的參數(shù)未指定的參數(shù)默認(rèn)不可配置。但model與model_provider這兩個參數(shù)除外如果在調(diào)用init_chat_model()時未傳遞且未通過configurable_fields指定它們?nèi)匀豢梢栽谶\行時進行配置。#這里我們沒有事先指定model也沒有通過configurable_fields將其指定為可配置項 modelinit_chat_model(temperature0) #但是我們在運行的時候依然可以配置model字段,且編譯時會自動按照model推到provider print(model.invoke( 你是誰, config{configurable:{model:deepseek-chat}} ))除了model與model_provider之外的其他參數(shù)如果需要運行時配置必須在調(diào)用init_chat_model接口的時候通過參數(shù)configurable_fields來指定。modelinit_chat_model(modeldeepseek-chat,configurable_fields{model_provider, temperature, max_tokens}) #參數(shù)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創(chuàng)建帶有默認(rèn)值的可配置模型如果我們在調(diào)用init_chat_model()接口的時候給參數(shù)添加了默認(rèn)值我們還希望該參數(shù)在后續(xù)運行時也要動態(tài)配置與變化那么我們就可以創(chuàng)建出帶有默認(rèn)值的可配置模型。具體做法就是將該參數(shù)也添加到configurable_fields中.modelinit_chat_model(modeldeepseek-chat, temperature0.5, max_tokens50, configurable_fields{model_provider, temperature, max_tokens} ) #參數(shù)model_provider, temperature, max_tokens運行時指定 aimessmodel.invoke( 你是誰, config{configurable:{model_provider:deepseek,temperature:0.6,max_tokens:100}} ) print(aimess.content)