LangChain杂记(python版本)

发布时间:2026/9/8 17:45:42
LangChain杂记(python版本) 1.连接大模型先在项目根目录下面建.env文件用于存放一些环境变量连接大模型首先要配置好自己的api key和厂商的base url将这些信息放在.env里面便于统一管理也便于后期上传代码到远程仓库时忽略这个文件从而防止key泄露DEEPSEEK_API_KEYsk-............. DEEPSEEK_BASE_URLhttps://api.xxxxx.com使用init_chat_model依赖来连接大模型import os from dotenv import load_dotenv from langchain.chat_models import init_chat_model load_dotenv(verboseTrue) #从环境变量读取配置 DEEPSEEK_API_KEY os.getenv(DEEPSEEK_API_KEY) DEEPSEEK_BASE_URL os.getenv(DEEPSEEK_BASE_URL) model init_chat_model( model大模型名, api_keyDEEPSEEK_API_KEY, base_urlDEEPSEEK_BASE_URL, )2.模型调用方式invoke() 阻塞式一次性返回完整结果问答、批处理任务、无需实时反馈的场景。ainvoke() 非阻塞式提高系统吞吐量高并发Web应用、IO密集型任务。stream() 流式输出实时返回每个token聊天机器人、长文本生成、需要提升用户体验的交互 应用。for chunk in model.stream(写一首七言律诗总结大模型的发展): print(chunk.text, end, flushTrue) # 逐token输出asteam() 非阻塞式提高系统吞吐量高并发Web应用、IO密集型任务。batch() 批量处理多个输入高并发场景需要同时处理大量请求。abatch() 非阻塞式提高系统吞吐量高并发Web应用、IO密集型任务。3.消息对象字段说明SystemMessage(你是一个善解人意的助手) HumanMessage(你好) AIMessage你好 #ToolMessage的使用 messages [ HumanMessage(content北京天气如何), AIMessage( content, tool_calls[ { name: get_weather, args: {location: 北京}, #必须和ToolMessage里面的tool_call_id一致 id: call_00_nUD2NC9QRN5Cg1GaoIkBJQ4s } ] ), ToolMessage( content今天北京天气晴朗万里无云~, tool_call_idcall_00_nUD2NC9QRN5Cg1GaoIkBJQ4s ) ]4.格式化输出AI的回复信息#1. SystemMessage设定角色告诉模型你叫小智 #2. HumanMessage用户提问 #3. model.invoke(messages)发给智谱 API 拿到返回 #4. rprintrich 库美化格式化输出看得更清晰 #5. response.response_metadata打印 token 消耗、请求元信息 from langchain_core.messages import SystemMessage, HumanMessage from rich import print as rprint # rich库美化打印输出 messages [ SystemMessage(你叫小智是一名助人为乐的助手。), HumanMessage(你好好久不见请介绍下你自己。) ] response model.invoke(messages) rprint(response) print(response.response_metadata)5.对话历史优化保存记忆记住记忆问题对话历史会越来越长消耗大量的token和成本conversation [] # 第一次 conversation.append({role: user, content: 我叫张三}) response1 model.invoke(conversation) # 关键保存 AI 回复 conversation.append({role: assistant, content: response1.content}) # 第二次传递完整历史 conversation.append({role: user, content: 我叫什么}) response2 model.invoke(conversation) # AI 记得对话历史优化只保留最近N轮对话总是保留system消息定义角色只保留最近N轮对话丢弃更早的历史#初始化 long_conversation[{role:system,content:你是python导师}] #第一轮对话 long_conversation.append({role:user,content:什么是列表用一句话解释}) r1model.invoke(long_conversation) long_conversation.append({role:assistant,content:r1.content}) # 第 2 轮 long_conversation.append({role: user, content: 列表和元组有什么区别用一句解释}) r2 model.invoke(long_conversation) long_conversation.append({role: assistant, content: r2.content}) # 第 3 轮 long_conversation.append({role: user, content: 什么是字典呢用一句解释}) r3 model.invoke(long_conversation) long_conversation.append({role: assistant, content: r3.content}) print(f原始消息数: {len(long_conversation)}) def keep_recent_messages(messages, max_pairs3): 保留最近的 N 轮对话 max_pairs: 保留的对话轮数每轮 user assistant # 分离 system 和对话 system_msgs [m for m in messages if m.get(role) system] conversation_msgs [m for m in messages if m.get(role) ! system] # 只保留最近的 [ -N : ]取列表**倒数 N 个元素**从倒数第 N 个一直到列表末尾 #一轮对话包含了user和assistant所以要*2 recent_msgs conversation_msgs[-(max_pairs * 2):] # 返回system 最近对话 return system_msgs recent_msgs # 优化只保留最近 2 轮 optimized keep_recent_messages(long_conversation, max_pairs2) print(f优化后消息数: {len(optimized)}) print(f保留的内容: system 最近2轮对话)6.借助 content_blocks 我们可以用一套标准代码无缝地在不同厂商的模型之间切换content_blocks[ {type: text, text: 这张图里有什么}, {type: image,base64: base64_image,mime_type: image/png,} ]7.ChatPromptTemplate 是用于生成消息列表的核心组件调用invoke()传参是字典列表返回值类型是ChatPromptValueformat()参数是变量值返回值是字符串format_message()传入的参数是变量值发挥类型是消息列表8.提示词模板的高级特性部分变量预填充partial()。预填充某些固定不变的变量创建模板的变体。原始编写的提示词templateChatPromptTemplate.from_messages([ (system,你是{role},目标用户是{audience}), (user,{task}) ]) result1template.invoke({role:导游,audience:游客,task:介绍一下故宫}) result2template.invoke({role:导游,audience:游客,task:介绍一下圆明园}) print(result1) print(result2)使用partial()后templateChatPromptTemplate.from_messages([ (system,你是{role},目标用户是{audience}), (user,{task}) ]) customer_support_templatetemplate.partial(role导游,audience游客) result1customer_support_template.invoke({task:介绍一下故宫}) result2customer_support_template.invoke({task:介绍一下圆明园}) print(result1) print(result2)消息占位符方式一json形式MessagePlaceholder方式

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询