langchain简单对话demo

📅 2026/7/19 14:11:25
langchain简单对话demo
前言前面安装了langchain发现了自由线程不支持其中的部分包切为传统的python其实做poc的能力python特别方便各种功能齐全尤其是报表统计代码量真少。先用langchain简单开发一个对话示例demo。demodemo根据最常用的对话模板分类先准备模型笔者本地的模型使用gemma4比较慢mac的配置是丐中丐所以切换qwen3.5试试实测速度快很多。准备模型Qwen3.5-4B-MLX-4bit反正示例demo对效果不要求另外还是使用openai的标准api本身所有建立在llm上的能力其实就是api的调用和生态的建设主要有2大类llm的交互控制调用和测试工具的使用让大模型使用工具字符串对话模板其实也很简单主要是2点链式调用debug设置from langchain_core.globals import set_debug, set_verbose from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import PromptTemplate from langchain_core.tracers import langchain from langchain_openai import ChatOpenAI # langchain.debug True set_debug(True) #只有这个有效 # set_verbose(True) def init_openai_chat(): # return ChatOpenAI(api_keyxxx, base_urlhttp://127.0.0.1:8000/v1, modelgemma-4-e4b-it-4bit) return ChatOpenAI(api_keyxxx, base_urlhttp://127.0.0.1:8000/v1, modelQwen3.5-4B-MLX-4bit) def init_prompt_template(): return PromptTemplate(template你是专业的翻译人才翻译{content} 这块文本成{language}除了翻译的内容其他信息使用中文回答, input_variables[content, language]) # 变量占位符可能其他框架也可以使用{{}}类似freemarker 其实就是模板langchain这里只能使用{},两个不识别 if __name__ __main__: client init_openai_chat() prompt_template init_prompt_template() # cn_prompt prompt_template.format_prompt(contenthello world, language中文) # en_prompt prompt_template.format_prompt(content统计信息结果报表, language英文) # # hello prompt_template.format(content打个招呼, language英文) # resp client.invoke(hello) out_parser StrOutputParser() # 链式调用这个写法简单其实问题也不少不能发现过程出现的问题需要开启debug模式 chain prompt_template | client | out_parser print(chain.invoke({content:打个招呼, language:英文})) # resp client.invoke(cn_prompt) # print(resp) # resp client.invoke(en_prompt) # print(resp)这里的链式调用其实对于promptTemplate而言与直接调用函数的方式使用的函数是不一样的使用的是invoke函数继承自BasePromptTemplatePython有了面向对象的能力当然命名也可以驼峰式以前Python主要是下划线的方式。查看结果关于链式调用1. 整条链条使用同一个函数比如invoke2. 开始的对象执行输入参数需要传入然后把输出的结果作为下一个对象函数的输入返回最终结果3. 调试困难需要代码开启debug调试当然可以使用langsmith langfuse之类的监控平台能力类似美团开源的CAT监控埋点上报聊天模板前面试了最简单的模板其实实际上使用的是聊天模板需要区分上下文上下文会形成记忆体agent这个上下文一般会被llm上层agent存储然后使用比如前3轮的对话或者根据权重区分当然也可以不使用毕竟场景不一样需求不一样from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import PromptTemplate, ChatPromptTemplate, SystemMessagePromptTemplate, \ ChatMessagePromptTemplate, HumanMessagePromptTemplate, AIMessagePromptTemplate from langchain_openai import ChatOpenAI def init_openai_chat(): return ChatOpenAI(api_keyxxx, base_urlhttp://127.0.0.1:8000/v1, modelQwen3.5-4B-MLX-4bit) def init_prompt_template(): # ChatMessagePromptTemplate.from_template() return ChatPromptTemplate.from_messages([ SystemMessagePromptTemplate.from_template(template你是专业的翻译人才,请按用户的要求翻译除了翻译的内容其他信息使用中文回答), HumanMessagePromptTemplate.from_template(template除了翻译的内容其他信息使用中文回答翻译如下内容为{language}{content}), # HumanMessagePromptTemplate.from_template(template翻译如下内容为{language}{content}), # AIMessagePromptTemplate.from_template({content}), #收集上下文形成记忆体经常使用的时候出现用户前面提问xxx根据xxx之类的就是这个实现的也可以一键清除 ]) if __name__ __main__: client init_openai_chat() prompt_template init_prompt_template() out_parser StrOutputParser() chain prompt_template | client | out_parser print(chain.invoke({content: 打个招呼, language: 英文}))试试效果这里有个系统提示词发现继承的很不好比如用户提示词如果不说使用中文作答显得系统提示词鸡肋当然可能是笔者的模型比较小能力较差示例模板为了解决上面的问题有时候我们可以给出示例给大模型参考给出步骤之类的其实就是skills的雏形使用示例模板我们给出示例和步骤内容然后让大模型执行工具这就是herness agent的能力先看示例模板from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import PromptTemplate, ChatPromptTemplate, SystemMessagePromptTemplate, \ ChatMessagePromptTemplate, HumanMessagePromptTemplate, AIMessagePromptTemplate, FewShotPromptTemplate from langchain_openai import ChatOpenAI def init_openai_chat(): return ChatOpenAI(api_keyxxx, base_urlhttp://localhost:11434/v1, modelmodelscope.cn/unsloth/Qwen3.5-9B-GGUF:Q4_0) def init_prompt_template(): examples [ {content:打个招呼, language:英文, result:say hi}, {content:hello, language:中文, result:你好} ] prompt PromptTemplate.from_template(template你是专业的翻译人才,翻译如下内容为{language}{content}) return FewShotPromptTemplate(examplesexamples, example_promptprompt, prefix你是专业的翻译人才,按照示例简洁作答, suffix翻译如下内容为{language}{content}只显示最常用的翻译内容的结果, input_variables[content, language],) if __name__ __main__: client init_openai_chat() prompt_template init_prompt_template() out_parser StrOutputParser() chain prompt_template | client | out_parser print(chain.invoke({content: 你是谁, language: 英文}))使用NVIDIA 4060ti 8G显卡跑了9b模型在使用示例demo明显效果好转果然再怎么优化不如模型强4b还是不太行据说qwen 3.6 27b已经可以执行大部分生产应用了不过笔者的显存太小至少24G显存是需要的或者类似苹果的统一内存aimax 395之类的可以自己用来做一些并发不高的应用。实际过程可以使用流式输出stream其实streamablehttp就是最新的技术方式这样的好处是模型是生成式模型生成一个token输出一个tokenfrom langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate from langchain_openai import ChatOpenAI def init_openai_chat(): return ChatOpenAI(api_keyxxx, base_urlhttp://localhost:11434/v1, modelmodelscope.cn/unsloth/Qwen3.5-9B-GGUF:Q4_0, streamingTrue) def init_prompt_template(): examples [ {content: 我要用电饭煲做饭, 步骤: 1、打开电饭煲盖子从米袋往电饭煲加米2、加适量水3、盖盖子插电按煮饭按钮}, {content: 我要公交车出行, 步骤: 1、准备出行目的地2、打开地图软件看看适合坐那辆公交车3、找到最近的公交站台单车或者步行去4、等车上车出发5、目的地下车} ] prompt PromptTemplate.from_template(template你是专业的计划规划师,做如下的规划{content}) return FewShotPromptTemplate(examplesexamples, example_promptprompt, prefix你是专业的计划规划师,按照示例简洁作答, suffix规划如下的事情{content}列出详细的步骤, input_variables[content], ) if __name__ __main__: client init_openai_chat() prompt_template init_prompt_template() out_parser StrOutputParser() chain prompt_template | client | out_parser for chunk in chain.stream({content:我要网上购物买一个小风扇需要多平台价格最优}): print(chunk, end, flushTrue)看结果录屏可能效果明显总结其实所有的AI能力都是通过各种api交互的最常用的是对话本质就是提示词交互当然对话不仅仅是每个人书写通过写skills可以把一些列的提示词封装包括角色示例步骤工具等多次的对话就有了上下文即记忆体同事通过工作流或者循环的方式把各个推理步骤串起来调用工具然后使用AI分析各种数据就是现在的主流应用方式。