LangChain 初探:模型调用、链式编排与运行机制 一Langchain快速上手首先我们需要理解链式结构输入 → 组件1 → 组件2 → 组件3 → 输出并且我们还需要明白一个前提LangChain 不是单纯帮你调接口而是把 AI 开发流程拆成一个个“组件”再把组件串起来。1.正常调用大模型1. 接入并定义大模型2. 定义消息3. 调用大模型4. 输出结果首先我们需要的就是配置环境具体的配置环境我就不多bb了~然后就是写代码调用模型~作参考~~fromlangchain_deepseekimportChatDeepSeekfromlangchain_core.messagesimportSystemMessage,HumanMessage# 1. 定义模型modelChatDeepSeek(modeldeepseek-chat)#这里其实可以天很多其他参数的比如 temperature max_tokens Token# 2. 定义消息列表messages[SystemMessage(content你是一个C学习助手请用简洁中文回答。),HumanMessage(content一加一等于几)]# 3. 调用模型resultmodel.invoke(messages)# 4. 输出结果print(result)#测试用print(--------------)print(result.content)这个apikey是配置到了win的环境变量里面了返回结果整理过后//真正的大模型回答内容。content根据数学定义1 1 2。//额外参数,表示模型可以回答。如果你问一些违规的内容可能会拒绝-》refusal:我无法帮助完成该请求additional_kwargs{refusal:None}//模型返回的元数据 //1.token使用量 //2.提供商 //3.模型response_metadata{token_usage:{completion_tokens:12,prompt_tokens:23,total_tokens:35,...},model_provider:deepseek,model_name:deepseek-v4-flash,system_fingerprint:fp_8b330d02d0_prod0820_fp8_kvcache_20260402,id:e0388115-b15d-4f1e-b073-28762491cd9f,finish_reason:stop,logprobs:None}//LangChain本次运行IDidlc_run--019e8d0a-c9ea-73a2-b4e7-221959f108b5-0//本次没有调用工具所以就是空tool_calls[]//没有错误的工具调用invalid_tool_calls[]//统计费用usage_metadata{input_tokens:23,output_tokens:12,total_tokens:35,...}这个返回结果是AIMessageresult 返回的是一个对象2.esponse_metadata 和 usage_metadata 区别response_metadata它更关注这次响应本身的信息比如请求 ID 模型版本 服务商返回的原始信息 结束原因 调试信息它常用于调试 日志记录 问题排查usage_metadata它更关注资源消耗比如输入用了多少 token输出用了多少 token总共用了多少 token它常用于成本统计预算控制接口调用监控你可以理解为response_metadata这次请求的身份证usage_metadata这次请求的消费账单3.输出解释器把模型返回的复杂对象解析成我们想要的格式。~使用方法fromlangchain_core.output_parsersimportStrOutputParser 。 。 。 。 parserStrOutputParser()final_resultparser.invoke(result)print(final_result)exmaplefromlangchain_deepseekimportChatDeepSeekfromlangchain_core.messagesimportSystemMessage,HumanMessagefromlangchain_core.output_parsersimportStrOutputParser# 1. 定义模型modelChatDeepSeek(modeldeepseek-chat)# 2. 定义消息 列表messages[SystemMessage(content你是一个C学习助手请用简洁中文回答。),HumanMessage(content一加一等于几)]# 3. 调用模型resultmodel.invoke(messages)parserStrOutputParser()fina_resultparser.invoke(result)# 4. 输出结果print(fina_result)print(--------------)print(result.content)二链式结构前面的都是手动执行链式结构是把组件串起来chain model | parser这个 | 很关键。它是管道符。可以理解成前一个组件的输出自动作为后一个组件的输入。1.链式调用大模型fromlangchain_deepseekimportChatDeepSeekfromlangchain_core.messagesimportSystemMessage,HumanMessagefromlangchain_core.output_parsersimportStrOutputParser# 1. 定义模型modelChatDeepSeek(modeldeepseek-chat)# 2. 定义消息 列表messages[SystemMessage(content你是一个C学习助手请用简洁中文回答。),HumanMessage(content一加一等于几)]parserStrOutputParser()chainmodel|parser resultchain.invoke(messages)print(result)运行结果一加一等于二。2.三种构建链的方式第一种管道符 |这是最常用的写法。chainmodel|parser第二种RunnableSequence手动创建fromlangchain_core.runnablesimportRunnableSequence chainRunnableSequence(firstmodel,lastparser)第三种pipe 方法chainmodel.pipe(parser)三LangChain 底层Runnable 和 LCEL1.RunnableRunnable 可以理解成 LangChain 里面的一个标准接口。ChatDeepSeek 继承 BaseChatDeepSeek BaseChatDeepSeek 继承 Runnable 接口model.invoke(...)parser.invoke(...)chain.invoke(...)对象虽然功能不同但它们都遵守同一套调用规范不管你是模型、解析器、Prompt、还是链只要你是 Runnable就可以用统一方式运行LangChain 解决了 原生大模型切换困难 的问题Runnable 接口方法作用invoke()单次调用一个输入对应一个输出batch()批处理多个输入一起处理stream()流式输出一个字/词/token 慢慢返回ainvoke()异步调用astream()异步流式输出2.LCEL -LangChain Expression LanguageLangChain 表达式语言LCEL让各个组件进行管道输出chainprompt|model|parser resultchain.invoke({topic:C RAII})前一个组件的输出自动作为后一个组件的输入底层chain :看起来好像只是把两个对象用 | 连起来但底层其实生成了一个新的对象RunnableSequence 可运行序列 chain model|parser 理解成 chain RunnableSequence(firstmodel,lastparser)林外chain 自己也是一个 Runnable四进阶使用Langchain的接口init_chat_model()这个函数是 ChatDeepSeek的进阶替代。代码fromlangchain.chat_modelsimportinit_chat_modelfromlangchain_core.messagesimportSystemMessage,HumanMessagefromlangchain_core.output_parsersimportStrOutputParser# 1. 定义模型deepseek_modelinit_chat_model(modeldeepseek-chat,model_providerdeepseek)#model ChatDeepSeek(modeldeepseek-chat)messages[SystemMessage(content你是一个数学老师),HumanMessage(content5的负数)]parserStrOutputParser()chaindeepseek_model|parser resultchain.invoke(messages)print(result)它的目的就是用一套写法初始化不同厂商的聊天模型参数参数作用temperature控制回答随机性max_tokens控制最大输出长度timeout控制请求超时时间max_retries控制失败重试次数api_key指定 API Keybase_url指定请求地址五可配置模型写法意思就是在init_chat_model里面不要填模型名称在下面代码进行配置invoke() 两个重要参数参数作用input输入内容比如字符串或消息列表config本次调用的配置信息config 可以理解成对本次 Runnable 调用进行补充配置所以config 给可配置模型补上 model 和 provider代码fromlangchain_deepseekimportChatDeepSeekfromlangchain.chat_modelsimportinit_chat_modelfromlangchain_core.messagesimportSystemMessage,HumanMessagefromlangchain_core.output_parsersimportStrOutputParser# 1. 定义模型deepseek_modelinit_chat_model(temperature0.3)#model ChatDeepSeek(modeldeepseek-chat)messages[SystemMessage(content你是一个数学老师),HumanMessage(content5的负数)]parserStrOutputParser()chaindeepseek_model|parser resultchain.invoke(messages,config{configurable:{model:deepseek-chat,model_provider:deepseek}})print(result)config其他参数字段作用configurable配置模型运行时可变参数run_id本次运行的唯一标识run_name本次运行的名称metadata附加元数据un_id、run_name、metadata 更多用于日志追踪 链路观测 调试分析 LangSmith 追踪六带默认参数的可配置模型初始化时已经有默认模型但调用时想临时改参数。我们需要知道的一个前提就是LangChain 默认不会让你随便在运行时修改已有属性。也就是你在init_chat_model定义的参数在后面就绝对不能修改configurable_fields 和 config_prefix这个其实就是让标记init_chat_model 里面的参数告诉我们哪些可以修改字面意思就是给那些上锁的门解锁configurable_fields声明哪些字段允许运行时修改config_prefix给配置项加前缀老师还加了一个参数上代码fromlangchain_deepseekimportChatDeepSeekfromlangchain.chat_modelsimportinit_chat_modelfromlangchain_core.messagesimportSystemMessage,HumanMessagefromlangchain_core.output_parsersimportStrOutputParser# 1. 定义模型deepseek_modelinit_chat_model(modeldeepseek-chat,model_providerdeepseek,temperature0.3,configurable_fields(max_tokens,),config_prefixfirst########################## )#多次调用configurable_fields(model,model_provider,max_tokens),config_prefixfirst##########################model ChatDeepSeek(modeldeepseek-chat)messages[SystemMessage(content你是一个语文老师),HumanMessage(content小猫在晒太阳 扩写100字)]parserStrOutputParser()chaindeepseek_model|parser resultchain.invoke(messages,config{configurable:{first_max_tokens:10}})print(result)注意(“max_tokens”,)后面的逗号不能少。如果你想让所有字段都能被运行时修改可以设置成类似configurable_fields“any”意思是所有可配置字段都允许运行时修改。不过真实项目里我不建议一上来就这么干。七本地模型前提是你的电脑下载了ollama代码fromlangchain_ollamaimportChatOllama modelChatOllama(modeldeepseek-r1:1.5b,base_urlhttp://127.0.0.1:11434)resultmodel.invoke(你是谁)print(result.content)这里的127.0.0.1表示本机地址也就是 localhost。11434是 Ollama 默认服务端口。远程模型和本地模型的对比对比项远程模型本地模型例子OpenAI、DeepSeek APIOllama DeepSeek R1是否需要 API Key通常需要通常不需要是否依赖网络需要本地运行时不一定需要模型能力通常更强取决于本地模型大小隐私性数据发到远程服务数据留在本机速度受网络和服务影响受本机配置影响成本可能按 token 计费主要消耗本机算力