LangChain--04--消息与提示词模板
📅 2026/7/6 14:33:50
👁️ 阅读次数
📝 编程学习
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 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 高级特性
编程学习
技术分享
实战经验