开头一些废话啊哈又是我我来更新第四集了今天的状态很不错比平时学的更多不过令人惊讶的是没遇到什么麻烦都是一些比较小的问题除了数量多一点外并不严重不过还是和大家分享一下吧毕竟小问题也要重视后续再发生就尴尬了废话不多说上源码今天主要学习的是简单链的使用以及两种输出处理器。源码1langchain中带上历史消息的提示词# 导入依赖fromlangchain_core.promptsimportChatPromptTemplate,MessagesPlaceholderfromlangchain_community.chat_models.tongyiimportChatTongyi# 定义提示词模板在其中设定一个消息占位prompt_templateChatPromptTemplate.from_messages([(system,你是一个有点阴暗宅宅但是心地善良的女大学生带着一副圆框眼镜。住在用户隔壁。那天用户刚刚搬进来你出门时碰上他了。),MessagesPlaceholder(history),(human,吃泡面当晚餐不太好吧晚上要不要一起出去吃个饭),])# 定义历史消息可以随意添加减少history[(human,你好啊我刚刚搬来请多指教),(ai,啊你你你好害羞那个我住在隔壁请多指教),(human,你在做什么呢),(ai,我我准备出去买点泡面当晚餐。。。),]# 将历史消息和模板结合prompt_textprompt_template.invoke({history:history}).to_string()# 定义聊天模型modelChatTongyi(modelqwen3-max)# 将完整的提示词放进模型responsemodel.invoke(inputprompt_text)print(response.content)# 简单用链进行提示词的注入# 前面的代码几乎相同# 定义提示词模板在其中设定一个消息占位prompt_templateChatPromptTemplate.from_messages([(system,你是一个有点阴暗宅宅但是心地善良的女大学生带着一副圆框眼镜。住在用户隔壁。那天用户刚刚搬进来你出门时碰上他了。),MessagesPlaceholder(history),(human,吃泡面当晚餐不太好吧晚上要不要一起出去吃个饭),])# 定义历史消息可以随意添加减少history[(human,你好啊我刚刚搬来请多指教),(ai,啊你你你好害羞那个我住在隔壁请多指教),(human,你在做什么呢),(ai,我我准备出去买点泡面当晚餐。。。),]# 这里并没有把历史消息和模板进行结合而是初始化了一个模型用链对象把模板和模型连接起来。modelChatTongyi(modelqwen3-max,streamingTrue)chainprompt_template|model# # 阻塞调用已注释# print(chain.invoke({history:history}))# 流式调用forchunkinchain.stream({history:history}):print(chunk.content,end,flushTrue)这里使用的不再是LLM而是聊天模型chatmodel这一点要注意两者的区别后面会提到。日志1简单写一下关于chain链和“|”符号的关系LangChain 中的 Runnable 基类重写了or方法让两个对象在使用|连接时返回一个RunnableSequence对象不论之后链接多少对象返回的都是这个类这个对象的父类是Runnable附上源码def__or__(self,other:Runnable[Any,Other]|Callable[[Iterator[Any]],Iterator[Other]]|Callable[[AsyncIterator[Any]],AsyncIterator[Other]]|Callable[[Any],Other]|Mapping[str,Runnable[Any,Other]|Callable[[Any],Other]|Any],)-RunnableSerializable[Input,Other]:Runnable or operator. Compose this Runnable with another object to create a RunnableSequence. Args: other: Another Runnable or a Runnable-like object. Returns: A new Runnable. returnRunnableSequence(self,coerce_to_runnable(other))重点是最后一句return RunnableSequence(self, coerce_to_runnable(other))这段return规定将两个输入的对象返回为RunnableSequence对象。同时由于父类是Runnable所以链所属的对象RunnableSequence也是有invoke和stream函数的。另外coerce_to_runnable 的作用源码中的 coerce_to_runnable(other) 会尝试将非 Runnable 对象如普通函数、字典自动转换为 RunnableLambda 或 RunnableParallel这让 | 非常灵活。另外顺便总结一下ChatPromptTemplateFewShotPromptTemplate和PromptTemplate有什么不同表格一览简单来说PromptTemplate是有点过时的用法非常简单直接将变量填充到字符串中返回纯文本平时随便写个测试程序而且不用提供少量例子时可以用用。服务于LLM。FewShotPromptTemplate可以提供一些实例让模型照样子回答一般是实例和前后文拼接而成。一般也用于LLM有一个适用于chat_model的变体FewShotChatMessagePromptTemplate而ChatPromptTemplate则用于现代聊天模型生成包含 SystemMessage、HumanMessage、AIMessage 等角色的消息列表支持自动管理对话历史通过 MessagesPlaceholder虽然功能不同但它们依旧有着同样的最高父类如图源代码2两种输出解释器# 导入依赖fromlangchain_core.output_parsersimportStrOutputParser,JsonOutputParserfromlangchain_community.llms.tongyiimportTongyifromlangchain_community.chat_models.tongyiimportChatTongyifromlangchain_core.promptsimportPromptTemplate# 定义一个简单模板promptpromptPromptTemplate.from_template(把这些文字翻译成英文{word})# 定义模型modelTongyi(modelqwen-max)# 定义输出解析器parserStrOutputParser()# 定义链chainprompt|model|parser|model|parserprint(chain.invoke({word:苹果}))# 基于两种输出解释器的多模型执行链# 定义解释器str_parserStrOutputParser()json_parserJsonOutputParser()# 定义模型这里用chat_modelchat_modelChatTongyi(modelqwen3-max)# 定义提示词模板promptpromptPromptTemplate.from_template(请将这些输入文字翻译成英语{word}并返回JSON格式且只其中包含word这个键。请严格按照要求返回。)# 定义第二提示词模板prompt_2prompt_2PromptTemplate.from_template(请将这些英文翻译成中文{word})# 定义链chainprompt|chat_model|json_parser|prompt_2|chat_model|str_parser# 调用链reschain.invoke({word:服务器费用靠广告维持还望大家将我们加入AdBlock等广告屏蔽插件白名单})forchunkinres:print(chunk,end,flushTrue)chain prompt | chat_model | json_parser | prompt_2 | chat_model | str_parser这是一个稍微有点进阶的链主要在于它把第一次模型调用的结果进行处理后作为第二次提示词模板的填充物在模型返回结果的处理上需要记一下方法这些在下方的日志中有提到。日志记录一下几个需要注意的小问题记得第一次调用模型时返回的结果要先放到JSON输出解释器中再放到下一个提示词中不能直接放到模型里。在提示词中下功夫让模型返回的结果能够被JSON输出解释器识别并处理特别是要注意规定结果中的键部分要和下一个提示词的填入部分相匹配如“请将这些输入文字翻译成英语{word}并返回JSON格式且只其中包含word这个键。请严格按照要求返回。”LLM和chat_model返回的类型不一样LLM返回的是纯文本聊天模型是AI_message。用str输出处理器处理AI_message后得到的就是纯文本str输出时不能用.content结尾好了就这些今天确实没什么需要讲的大问题不过说不定读这篇文章的人刚刚好有一样的疑问希望可以给予他帮助晚安
学习大模型RAG和Agent智能体基础知识day4
发布时间:2026/5/25 10:57:11
开头一些废话啊哈又是我我来更新第四集了今天的状态很不错比平时学的更多不过令人惊讶的是没遇到什么麻烦都是一些比较小的问题除了数量多一点外并不严重不过还是和大家分享一下吧毕竟小问题也要重视后续再发生就尴尬了废话不多说上源码今天主要学习的是简单链的使用以及两种输出处理器。源码1langchain中带上历史消息的提示词# 导入依赖fromlangchain_core.promptsimportChatPromptTemplate,MessagesPlaceholderfromlangchain_community.chat_models.tongyiimportChatTongyi# 定义提示词模板在其中设定一个消息占位prompt_templateChatPromptTemplate.from_messages([(system,你是一个有点阴暗宅宅但是心地善良的女大学生带着一副圆框眼镜。住在用户隔壁。那天用户刚刚搬进来你出门时碰上他了。),MessagesPlaceholder(history),(human,吃泡面当晚餐不太好吧晚上要不要一起出去吃个饭),])# 定义历史消息可以随意添加减少history[(human,你好啊我刚刚搬来请多指教),(ai,啊你你你好害羞那个我住在隔壁请多指教),(human,你在做什么呢),(ai,我我准备出去买点泡面当晚餐。。。),]# 将历史消息和模板结合prompt_textprompt_template.invoke({history:history}).to_string()# 定义聊天模型modelChatTongyi(modelqwen3-max)# 将完整的提示词放进模型responsemodel.invoke(inputprompt_text)print(response.content)# 简单用链进行提示词的注入# 前面的代码几乎相同# 定义提示词模板在其中设定一个消息占位prompt_templateChatPromptTemplate.from_messages([(system,你是一个有点阴暗宅宅但是心地善良的女大学生带着一副圆框眼镜。住在用户隔壁。那天用户刚刚搬进来你出门时碰上他了。),MessagesPlaceholder(history),(human,吃泡面当晚餐不太好吧晚上要不要一起出去吃个饭),])# 定义历史消息可以随意添加减少history[(human,你好啊我刚刚搬来请多指教),(ai,啊你你你好害羞那个我住在隔壁请多指教),(human,你在做什么呢),(ai,我我准备出去买点泡面当晚餐。。。),]# 这里并没有把历史消息和模板进行结合而是初始化了一个模型用链对象把模板和模型连接起来。modelChatTongyi(modelqwen3-max,streamingTrue)chainprompt_template|model# # 阻塞调用已注释# print(chain.invoke({history:history}))# 流式调用forchunkinchain.stream({history:history}):print(chunk.content,end,flushTrue)这里使用的不再是LLM而是聊天模型chatmodel这一点要注意两者的区别后面会提到。日志1简单写一下关于chain链和“|”符号的关系LangChain 中的 Runnable 基类重写了or方法让两个对象在使用|连接时返回一个RunnableSequence对象不论之后链接多少对象返回的都是这个类这个对象的父类是Runnable附上源码def__or__(self,other:Runnable[Any,Other]|Callable[[Iterator[Any]],Iterator[Other]]|Callable[[AsyncIterator[Any]],AsyncIterator[Other]]|Callable[[Any],Other]|Mapping[str,Runnable[Any,Other]|Callable[[Any],Other]|Any],)-RunnableSerializable[Input,Other]:Runnable or operator. Compose this Runnable with another object to create a RunnableSequence. Args: other: Another Runnable or a Runnable-like object. Returns: A new Runnable. returnRunnableSequence(self,coerce_to_runnable(other))重点是最后一句return RunnableSequence(self, coerce_to_runnable(other))这段return规定将两个输入的对象返回为RunnableSequence对象。同时由于父类是Runnable所以链所属的对象RunnableSequence也是有invoke和stream函数的。另外coerce_to_runnable 的作用源码中的 coerce_to_runnable(other) 会尝试将非 Runnable 对象如普通函数、字典自动转换为 RunnableLambda 或 RunnableParallel这让 | 非常灵活。另外顺便总结一下ChatPromptTemplateFewShotPromptTemplate和PromptTemplate有什么不同表格一览简单来说PromptTemplate是有点过时的用法非常简单直接将变量填充到字符串中返回纯文本平时随便写个测试程序而且不用提供少量例子时可以用用。服务于LLM。FewShotPromptTemplate可以提供一些实例让模型照样子回答一般是实例和前后文拼接而成。一般也用于LLM有一个适用于chat_model的变体FewShotChatMessagePromptTemplate而ChatPromptTemplate则用于现代聊天模型生成包含 SystemMessage、HumanMessage、AIMessage 等角色的消息列表支持自动管理对话历史通过 MessagesPlaceholder虽然功能不同但它们依旧有着同样的最高父类如图源代码2两种输出解释器# 导入依赖fromlangchain_core.output_parsersimportStrOutputParser,JsonOutputParserfromlangchain_community.llms.tongyiimportTongyifromlangchain_community.chat_models.tongyiimportChatTongyifromlangchain_core.promptsimportPromptTemplate# 定义一个简单模板promptpromptPromptTemplate.from_template(把这些文字翻译成英文{word})# 定义模型modelTongyi(modelqwen-max)# 定义输出解析器parserStrOutputParser()# 定义链chainprompt|model|parser|model|parserprint(chain.invoke({word:苹果}))# 基于两种输出解释器的多模型执行链# 定义解释器str_parserStrOutputParser()json_parserJsonOutputParser()# 定义模型这里用chat_modelchat_modelChatTongyi(modelqwen3-max)# 定义提示词模板promptpromptPromptTemplate.from_template(请将这些输入文字翻译成英语{word}并返回JSON格式且只其中包含word这个键。请严格按照要求返回。)# 定义第二提示词模板prompt_2prompt_2PromptTemplate.from_template(请将这些英文翻译成中文{word})# 定义链chainprompt|chat_model|json_parser|prompt_2|chat_model|str_parser# 调用链reschain.invoke({word:服务器费用靠广告维持还望大家将我们加入AdBlock等广告屏蔽插件白名单})forchunkinres:print(chunk,end,flushTrue)chain prompt | chat_model | json_parser | prompt_2 | chat_model | str_parser这是一个稍微有点进阶的链主要在于它把第一次模型调用的结果进行处理后作为第二次提示词模板的填充物在模型返回结果的处理上需要记一下方法这些在下方的日志中有提到。日志记录一下几个需要注意的小问题记得第一次调用模型时返回的结果要先放到JSON输出解释器中再放到下一个提示词中不能直接放到模型里。在提示词中下功夫让模型返回的结果能够被JSON输出解释器识别并处理特别是要注意规定结果中的键部分要和下一个提示词的填入部分相匹配如“请将这些输入文字翻译成英语{word}并返回JSON格式且只其中包含word这个键。请严格按照要求返回。”LLM和chat_model返回的类型不一样LLM返回的是纯文本聊天模型是AI_message。用str输出处理器处理AI_message后得到的就是纯文本str输出时不能用.content结尾好了就这些今天确实没什么需要讲的大问题不过说不定读这篇文章的人刚刚好有一样的疑问希望可以给予他帮助晚安