当前位置: 首页 > news >正文

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 高级特性









http://www.gsyq.cn/news/1647238.html

相关文章:

  • 初识C语言 | 第4篇
  • 高级java每日一道面试题-2026年03月22日-实战篇[Docker]-如何长期存储海量容器日志?
  • 10 个示例快速入门 Go-Spring|v1.3.0 正式发布
  • 大模型术语:小白程序员必备的六层工程分层架构(收藏版)
  • 基于SGM62111和PIC18F57Q43的智能DC-DC降压电源设计
  • Midscene.js:视觉驱动UI自动化,告别脆弱选择器
  • 3个技巧解决跨平台多媒体开发难题:SFML实战指南
  • 基于DGN的电工基础-1
  • 多设备传动改造:盖茨工业皮带的工程应用经验复盘
  • ICM-42688-P与PIC24FV16KA302在工业自动化中的应用解析
  • Spring4Shell漏洞深度剖析:从数据绑定到RCE的完整攻击链复现
  • AI进入下半场:模型不再稀缺,真正稀缺的是算力、场景和信任
  • 踩坑半年总结:C#部署YOLO最容易忽略的8个工业级细节
  • 毕业证登报挂失去哪办理?价格是多少?声明怎么写?
  • 基于INA196与STM32的4-20mA电流信号采集系统设计
  • VLC媒体播放器:技术深度解析与实战应用指南
  • 【2026收藏级】AI大模型零基础入门全攻略!小白程序员保姆级学习指南
  • Auto memory,把 Claude Code 从临时搭档变成项目老同事
  • 问答解惑|okbiye AI写作,一站式搞定毕业论文所有难题
  • OpenClaw AI代理安全危机:从漏洞分析到自动化审计与加固实践
  • 《抽象数据类型:把数据和对数据的操作绑在一起》
  • 别小看这张“钢丝网”,它一不高兴,你的生产线就得停工!
  • 基础到企业应用系列3——WPF开发漫谈
  • 把 Claude Code 的 plan mode 设为项目默认模式,先想清楚,再让它动手
  • 300个摄像头的化工园区,怎么管才高效?国标GB28181视频平台EasyGBS视频监控模块为企业构建起可视化防线
  • 小程序商城制作流程详解:附2026阿里开发者社区评分最高的3款小程序商城制作工具
  • 为什么你越努力优化,供应链反而越脆弱?
  • 《天龙八部》主要角色人生结局对比:当系统宕机时,谁能优雅退出
  • Java工程师资格证,到底值不值?别被忽悠了,真相扎心
  • SiamFC 到 SiamRPN++:5个关键改进点对比分析,FPS与精度提升路径