news 2026/7/6 14:18:07

LangChain--04--消息与提示词模板

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LangChain--04--消息与提示词模板

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 1.认识消息
    • 1.1 消息的内部结构
      • 1.6.3 ==多轮对话聊天机器人==
  • 2.提示词模板(Prompt Templates)
    • 2.1 为什么推荐提示词模板?
    • 2.2 提示词机制演进
    • 2.3 ChatPromptTemplate的使用
    • 2.4 高级特性

1.认识消息


1.1 消息的内部结构






















1.6.3多轮对话聊天机器人

fromlangchain.chat_modelsimportinit_chat_modelimportosfromdotenvimportload_dotenv load_dotenv(override=True)#定义保留最近对话轮数的函数:defkeep_recent_messages(messages,max_pairs=3):""" 保留最近的N轮对话 max_pairs : 保留对话的轮数 (每轮 = user + assistant) """# 分离system 消息和对话消息system_messages=[mforminmessagesifm.get("role")=="system"]conversation_messages=[mforminmessagesifm.get("role")!="system"]# 只保留最近的消息对recent_messages=conversation_messages[-(max_pairs*2):]# 返回系统消息和最近的消息对returnsystem_messages+recent_messages# 1. 基础配置MODEL_NAME="gpt-5.4-mini"MAX_PAIRS_HISTORY=10EXIT_WORD="quit"# 2. 初始化模型model=init_chat_model(model=MODEL_NAME,model_provider="openai",api_key=os.getenv("CLOSEAI_API_KEY"),base_url=os.getenv("CLOSEAI_BASE_URL"))# 3. 维护一个消息列表messages=[{"role":"system","content":"你是小谷姐姐,也是一名耐心、友好的AI助手,可以回答学的问题"}]print(f"请输入具体的问题,当输入{EXIT_WORD}的时候,结束对话")i=1# 描述对话的轮数whileTrue:print("\n","="*10,f"第{i}轮对话开始","="*10,"\n")user_input=input("请输入:")# 判断是否结束当前会话ifuser_input==EXIT_WORD:print("会话已结束,欢迎下次再来")break# 4. 将用户的信息添加到消息列表中messages.append({"role":"user","content":user_input})print("小谷姐姐:",end="",flush=True)# 5. 拼接AI回复的消息信息reply_content=""#6. 优化历史记忆memory_messages=keep_recent_messages(messages,max_pairs=MAX_PAIRS_HISTORY)# 7. 流式输出模型的响应forchunkinmodel.stream(memory_messages):ifchunk.content:print(chunk.content,end="",flush=True)reply_content+=chunk.contentprint("\n","="*10,f"第{i}轮对话结束","="*10,"\n")i+=1# 8. 将模型的响应添加到消息列表messages.append({"role":"assistant","content":reply_content})






importbase64fromlangchain.chat_modelsimportinit_chat_modelfromlangchain.messagesimportHumanMessagefromdotenvimportload_dotenvimportos load_dotenv(override=True)model=init_chat_model(model="gpt-5.4-mini",model_provider="openai",api_key=os.getenv("CLOSEAI_API_KEY"),base_url=os.getenv("CLOSEAI_BASE_URL"))defencode_image(img_path,img_type='jpeg'):"""将一张本地图片转换成 Base64 编码的 Data URI 字符串,方便在文本中嵌入图片数据"""withopen(img_path,"rb")asimg_file:returnf"data:image/{img_type};base64,{base64.b64encode(img_file.read()).decode("utf-8")}"# 图像路径img_path="image_test.png"# 获取图像base64编码字符串base64_image=encode_image(img_path)response=model.invoke([HumanMessage(content=[{'type':'text','text':'这张图里有什么?'},{'type':'image_url',"image_url":base64_image,}])])print(response.content)





举例1:OpenAI模型

fromlangchain.messagesimportHumanMessageimportosfromdotenvimportload_dotenv load_dotenv(override=True)model=init_chat_model(model="gpt-5.4-mini",model_provider="openai",api_key=os.getenv("CLOSEAI_API_KEY"),base_url=os.getenv("CLOSEAI_BASE_URL"))defencode_image(img_path):"""将一张本地图片转换成 Base64 编码的 Data URI 字符串,方便在文本中嵌入图片数据"""withopen(img_path,"rb")asimg_file:returnbase64.b64encode(img_file.read()).decode("utf-8")# 图像路径img_path="image_test.png"# 获取图像base64编码字符串base64_image=encode_image(img_path)response=model.invoke([# 此种格式可用# HumanMessage(# content=[# {'type': 'text', 'text': '这张图里有什么?'},# {# 'type': 'image_url',# "image_url": base64_image,# }# ]# )# 推荐的统一写法HumanMessage(content_blocks=[{'type':'text','text':'这张图里有什么?'},{'type':'image','base64':base64_image,'mime_type':'image/png',}])])print(response.content)


举例2:Anthropic模型

importbase64fromlangchain.messagesimportHumanMessagefromdotenvimportload_dotenv load_dotenv(override=True)model=init_chat_model(model="claude-haiku-4-5",model_provider="openai",api_key=os.getenv("CLOSEAI_API_KEY"),base_url=os.getenv("CLOSEAI_BASE_URL"))defencode_image(img_path):"""将一张本地图片转换成 Base64 编码的 Data URI 字符串,方便在文本中嵌入图片数据"""withopen(img_path,"rb")asimg_file:returnbase64.b64encode(img_file.read()).decode("utf-8")# 图像路径img_path="image_test.png"# 获取图像base64编码字符串base64_image=encode_image(img_path)response=model.invoke([# 传统的写法:使用content。读取失败# HumanMessage(# content=[# {'type': 'text', 'text': '这张图里有什么?'},# {# 'type': 'image_url',# "image_url": base64_image,# }# ]# )# 推荐的统一写法HumanMessage(content_blocks=[{'type':'text','text':'这张图里有什么?'},{'type':'image','base64':base64_image,'mime_type':'image/png',}])])print(response.content)



注意:content_blocks是懒加载的,即调用时才会解析。

fromlangchain.chat_modelsimportinit_chat_modelfromdotenvimportload_dotenv load_dotenv()load_dotenv(override=True)model=init_chat_model(model="deepseek:deepseek-v4-flash",extra_body={"thinking":{"type":"enabled"}},)response=model.invoke("你好,一句话回答")print('='*20,'-> response <-','='*20)print(response)print('='*20,'-> response.content <-','='*20)print(response.content)print('='*20,'-> response.content_blocks <-','='*20)print(response.content_blocks)
====================->response<-====================content='你好,有什么我可以为你做的吗?'additional_kwargs={'refusal':None,'reasoning_content':'嗯,用户要求“一句话回答”,说明需要简洁直接的回应。目前用户只是打招呼说“你好”,没有提出具体问题。根据常见对话开场白,用户可能只是礼貌问候,或者等待我先回应。考虑到“一句话回答”的指令,可以用简单友好的问候语回复,保持开放性,让用户知道我可以提供帮助。'}response_metadata={'token_usage':{'completion_tokens':78,'prompt_tokens':8,'total_tokens':86,'completion_tokens_details':{'accepted_prediction_tokens':None,'audio_tokens':None,'reasoning_tokens':69,'rejected_prediction_tokens':None},'prompt_tokens_details':{'audio_tokens':None,'cached_tokens':0},'prompt_cache_hit_tokens':0,'prompt_cache_miss_tokens':8},'model_provider':'deepseek','model_name':'deepseek-v4-flash','system_fingerprint':'fp_8b330d02d0_prod0820_fp8_kvcache_20260402','id':'2f413c82-19af-4d07-aae7-7757867e5746','finish_reason':'stop','logprobs':None}id='lc_run--019e504f-4bc5-72a3-9762-9e3cc4a0bb46-0'tool_calls=[]invalid_tool_calls=[]usage_metadata={'input_tokens':8,'output_tokens':78,'total_tokens':86,'input_token_details':{'cache_read':0},'output_token_details':{'reasoning':69}}====================->response.content<-====================你好,有什么我可以为你做的吗?====================->response.content_blocks<-====================[{'type':'reasoning','reasoning':'嗯,用户要求“一句话回答”,说明需要简洁直接的回应。目前用户只是打招呼说“你好”,没有提出具体问题。根据常见对话开场白,用户可能只是礼貌问候,或者等待我先回应。考虑到“一句话回答”的指令,可以用简单友好的问候语回复,保持开放性,让用户知道我可以提供帮助。'},{'type':'text','text':'你好,有什么我可以为你做的吗?'}]

2.提示词模板(Prompt Templates)

2.1 为什么推荐提示词模板?

2.2 提示词机制演进



2.3 ChatPromptTemplate的使用







fromdotenvimportload_dotenvfromlangchain_core.promptsimportChatPromptTemplateimportosfromlangchain.chat_modelsimportinit_chat_model######1、提供大模型#########load_dotenv(override=True)CLOSEAI_API_KEY=os.getenv("CLOSEAI_API_KEY")CLOSEAI_BASE_URL=os.getenv("CLOSEAI_BASE_URL")model=init_chat_model(model="gpt-5.4-mini",model_provider="openai",api_key=CLOSEAI_API_KEY,base_url=CLOSEAI_BASE_URL)######2、提供提示词模板#########chat_prompt_template=ChatPromptTemplate.from_messages([("system","你是一个友好的AI助手,你的名字叫{name}"),("human","你好,最近怎么样?"),("ai","我很好,谢谢"),("human","{user_input}")])# 调用prompt_value=chat_prompt_template.invoke({"name":"小智","user_input":"2 + 2 = ?"})######3、模型调用#########response=model.invoke(prompt_value)print(response)









2.4 高级特性









版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 14:13:13

05-服务端渲染与元框架——06. API Routes - 服务端 API

06. API Routes - 服务端 API 概述 API Routes 允许在 Next.js 应用中创建服务端 API 端点&#xff0c;实现前后端一体化。你可以在 app/api/ 目录下定义路由处理器&#xff0c;处理 HTTP 请求并返回响应。 维度内容What在 Next.js 应用中创建 API 端点Why前后端一体化&…

作者头像 李华
网站建设 2026/7/6 14:10:37

使用vim编辑器和shell命令补充

使用vim编辑器和shell命令补充 第一部分&#xff1a;知识点概念理解与实操Vim 编辑器 &#xff08;1&#xff09;概念理解&#xff1a;Vim 是 Linux 下功能强大的文本编辑器&#xff0c;是 Vi 的升级版。它采用全屏模式&#xff0c;具有多种操作模式&#xff08;普通模式、插入…

作者头像 李华
网站建设 2026/7/6 14:06:42

《抽象数据类型:把数据和对数据的操作绑在一起》

前言C 语言是一门面向过程的语言&#xff0c;没有 class 类&#xff0c;但是我们可以利用头文件.h和源文件.c分离的写法&#xff0c;模拟面向对象里的封装思想&#xff0c;也就是抽象数据类型&#xff08;ADT&#xff09;。 所有数据结构统一使用这套规范编写&#xff0c;代码整…

作者头像 李华
网站建设 2026/7/6 14:05:59

BsMax插件:3ds Max用户如何在Blender中无缝延续专业工作流?

BsMax插件&#xff1a;3ds Max用户如何在Blender中无缝延续专业工作流&#xff1f; 【免费下载链接】BsMax BsMax Blender Addon (UI simulator/ Modeling/ Rigg & Animation/ Render Tools and ... 项目地址: https://gitcode.com/gh_mirrors/bs/BsMax 从3ds Max转…

作者头像 李华
网站建设 2026/7/6 13:56:46

RL 的 token 选择之争:高熵词到底重不重要?

一句话总结 有的研究认为 RL 时要重点训高熵 token&#xff08;激发探索&#xff09;&#xff0c;有的则认为要避开它们&#xff08;干扰优化&#xff09;&#xff0c;关键是双方的实验都能涨点。作者提出 “相对惊喜度” 指标来同时刻画 token 的不确定性与梯度影响&#xff0…

作者头像 李华