当前位置: 首页 > 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.jsqmd.com/news/1135247/

相关文章:

  • 初识C语言 | 第4篇
  • OBS背景移除插件:无需绿幕的智能抠像解决方案
  • 一条停水通知花了几小时,AI 员工能不能把它压缩到几秒?
  • 51单片机多功能台灯
  • Appium安装遇ERR_TLS_CERT_ALTNAME_INVALID?5步彻底解决证书验证失败
  • 【喵汪星球HarmonyOS 6.0】技术实战 09:健康症状库、关键词匹配与应急就医卡
  • 实体店小程序搭建工具:餐宝盈/BBWEYY/比文云/Instapage/Mobirise实测对比,含零代码SAAS、AI编程、源码定制交付
  • 人生未来的最小单位是什么?
  • 大模型术语:小白程序员必备的六层工程分层架构(收藏版)
  • 计算机毕业设计 BUG管理系统毕业论文
  • iStoreOS网络架构重构:从基础路由到智能家庭网络核心
  • 聚簇索引回表与覆盖索引
  • STM32L4与74HC32实现低功耗多键盘管理方案
  • 4#深萃--全流程深度解析
  • DDIC 的未来,传统 ABAP Dictionary 向 CDS 原生数据模型的迁移路线
  • 【VTG】 VTG-LLM: Integrating Timestamp Knowledge into Video LLMs for Enhanced Video Temporal Ground
  • OpenBMC:Redfish 管理接口
  • Unity 物理系统与 C# 脚本交互:3 种控制小球移动方案的性能与手感对比
  • 3种方法解决Navicat试用到期问题:Mac用户的终极重置指南
  • Windows系统文件autopilot.dll丢失找不到问题解决
  • 掌握Loop Engineering:让AI持续自主完成任务,小白程序员必备收藏指南!
  • 把 Claude Code auto memory 当成一套工程治理开关来看
  • 跨手机微信记录转移教程,再也不怕聊天记录清空避雷省钱向
  • WSA-Pacman:告别ADB命令,Windows安卓应用管理的革命性解决方案
  • Midscene.js:视觉驱动UI自动化,告别脆弱选择器
  • 新手跨境电商独立站搭建工具实测对比:BBWEYY/比文云/Framer/Prismic(2026年7月更新)含零代码SAAS、AI编程、源码定制交付
  • 基于DGN的电工基础-1
  • YOLOv11【第十章:前沿演进与跨界融合篇·第29节】元宇宙 YOLOv11 商业化落地全路径!
  • Scikit-learn 1.5.0 波士顿房价预测:7种回归模型R2对比与过拟合分析
  • 【VTG】T2SGrid: Temporal-to-Spatial Gridification for VTG