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

【Agent学习】Day03

昨天在忙组会的事情没有时间学习,今天继续开始。(P.S.我发现DDL真的是第一生产力,调用一个大模型的时候才发现组内的服务器已经部署好了不需要我直接下载了,之前一直忙活这个显得我很呆)

1 LangChain的记忆模块

记忆(Memory)模块用于存储人机互动的历史信息。当用户输入一个新的问题,首先从Memory中读取相关的上文信息组装成一个Prompt,再调用大模型,大模型的回复将作为历史对话信息报错在Memory中供以后的对话使用。

1-1 对话上下文ConversationBufferMemory

使用方式:

  • save_context 将信息保存到memory中
  • chat_memory.add_user_message和chat_memory.add_user_message 将信息保存到memory中
  • load_memory_variables 获取memory中的信息
#===================================================== #01:记忆模块功能展示 #===================================================== from langchain.memory import ConversationBufferMemory history = ConversationBufferMemory(memory_key="chat_with_研究生小林") history.save_context({"input":"你好👋!"},{"output":"你好。"}) print(history.load_memory_variables({})) history.save_context({"input":"最近感觉怎么样"},{"output":"还算不错"}) print(history.load_memory_variables({})) history.chat_memory.add_user_message("我现在感到心烦意乱") history.chat_memory.add_ai_message("我很了解你现在的心情,可以告诉是为什么心烦嘛?我可以帮你分析原因!") print(history.load_memory_variables({}))

运行结果:

1-2 只保留k个窗口的上下文ConversationBufferWindowMemory

#==================================================== #02:只保留k个窗口的上下文:ConversationBufferWindowMemory #==================================================== from langchain.memory import ConversationBufferWindowMemory window = ConversationBufferWindowMemory(k=3) #通过设置k参数限定每次从记忆中读取最近的k条记忆 window.save_context({"input":"第1轮问"},{"input":"第1轮答"}) window.save_context({"input":"第2轮问"},{"input":"第2轮答"}) window.save_context({"input":"第3轮问"},{"input":"第3轮答"}) window.save_context({"input":"第4轮问"},{"input":"第4轮答"}) window.save_context({"input":"第5轮问"},{"input":"第5轮答"}) window.save_context({"input":"第6轮问"},{"input":"第6轮答"}) print(window.load_memory_variables({}))

运行结果:

1-3 通过Token控制上下文长度ConversationTokenBufferMemory

#==================================================== #03:通过token控制上下文长度:ConversationTokenBufferMemory #==================================================== from langchain.memory import ConversationTokenBufferMemory #ConversationTokenBufferMemory允许用户指定最大的token长度,使得从记忆中读取上文时不会超过token限制 from langchain_openai import OpenAI #此处导入OENAI是用于计算token llm = OpenAI( api_key="sk-xxxxx", base_url="https://api.fe8.cn/v1" ) memory = ConversationTokenBufferMemory( llm = llm, max_token_limit =45 ) memory.save_context({"input":"最近感觉怎么样"},{"output":"还算不错"}) memory.save_context({"input":"有什么开心事吗?"},{"output":"有的,感到很愉快"}) print(memory.load_memory_variables({}))

运行结果:

LangChain的链式设计

使用LangChain链式模块重新实现昨天从文本中提取相关内容回答用户问题的功能

## 1. 文档加载 from langchain_community.document_loaders import PyPDFLoader loader = PyPDFLoader("/home/user/szt/Agent/【梅园密令无声战场】活动方案.pdf") pages = loader.load_and_split() ## 2. 文档切分 from langchain.text_splitter import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter( chunk_size=200, chunk_overlap=100, length_function=len, add_start_index=True, ) paragraphs = [] for page in pages: paragraphs.extend(text_splitter.create_documents([page.page_content])) ## 3. 文档向量化,向量数据库存储 from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma db = Chroma.from_documents(paragraphs, OpenAIEmbeddings( api_key="sk-xxxxx", base_url="https://api.fe8.cn/v1" )) ## 4. 向量检索 retriever = db.as_retriever() ## 5. 组装Prompt模板 from langchain_openai import ChatOpenAI llm = ChatOpenAI( api_key="sk-xxxxxx", base_url="https://api.fe8.cn/v1" ) # 默认是gpt-3.5-turbo prompt_template = """ 你是一个问答机器人。 你的任务是根据下述给定的已知信息回答用户问题。 确保你的回复完全依据下述已知信息。不要编造答案。 如果下述已知信息不足以回答用户的问题,请直接回复"我无法回答您的问题"。 已知信息: {info} 用户问: {question} 请用中文回答用户问题。 """ from langchain.prompts import PromptTemplate template = PromptTemplate.from_template(prompt_template) from langchain_core.runnables import RunnableParallel,RunnablePassthrough #RunnableParallel允许将输入数据不经修改地传递给下一个步骤,常与RunnablePassthrough一起使用 setup_and_retrieval = RunnableParallel( {"info":retriever,"question":RunnablePassthrough()} ) ## 6. 执行chain chain = setup_and_retrieval | template | llm response = chain.invoke("什么是摩斯电码?") print(response.content)

以下是对代码的框架介绍:

今天的学习就先到这里啦!

http://www.jsqmd.com/news/550830/

相关文章:

  • 突破设备限制:Xiaomusic重构智能家居音乐体验
  • 在Ubuntu 22.04上,用Docker搞定PaddleOCR-VL多版本CUDA部署(含FlashAttention避坑)
  • 别再被中文路径坑了!用OpenCV的imdecode/imencode搞定图片读写(附完整代码)
  • AD9361参考时钟到底怎么选?手把手教你配置外部40MHz时钟(附寄存器详解)
  • 『IMA™ 前沿连载03』全局高光谱成像解锁下一代先进材料:IMA™ 实现GaAs准费米能级成像
  • awk实战:从基础语法到高效文本处理技巧
  • Fast DDS实战指南:从零构建C++分布式通信应用
  • 2026礼品采购手工桑蚕丝被优质厂家指南 - 优质品牌商家
  • 永磁同步电机无位置传感器控制:除了龙伯格+PLL,还有哪些观测器方案可以选?
  • 华为ACL实战:从基础分类到精细化访问控制策略
  • Spring Cloud微服务实战:服务注册、网关、负载均衡全家桶指南
  • 从智能电池到服务器风扇:手把手解析SMBus的15种通信协议与应用实例
  • ISP图像处理 - YUV域降噪与边缘增强实战解析
  • 从干涉仪到Zernike系数:一文搞懂Zemax中那些‘表面公差’到底在测什么
  • 别再只抄代码了!手把手教你调试YOLOv5模型输出,彻底搞懂每个数字的含义
  • 高尔夫/跑步爱好者必看:用Xsens DOT传感器优化运动表现的3种方法
  • 4个AI字幕优化技巧:如何用VideoCaptioner实现专业级字幕纠错
  • 2026医药招商平台白皮书及优质服务商推荐 - 优质品牌商家
  • 从AST节点设计到递归下降解析:图解编译原理实验中的语法树构建
  • 别再只当数据包了!用Python的nibabel库拆解.nii.gz文件,手把手教你提取MRI图像的元数据和三维数组
  • 小白也能懂!CosyVoice2-0.5B API调用全攻略,快速生成克隆语音
  • Android应用配置避坑指南:如何正确使用ApplicationInfo flags提升应用性能
  • 从不同角度看,智能安全带的出现带来了什么意义
  • Logisim实战:8位模型计算机从零搭建指南(附完整.circ文件)
  • Akagi:麻将智能决策的创新辅助方法——从牌局困境到战术精通的实践指南
  • Obsidian数据迁移终极指南:3小时完成跨平台笔记无损转移
  • Fluent Meshing周期性界面设置避坑指南:从自动识别失效到手动配置成功的完整流程
  • Rockchip Linux SDK编译配置实战:从板级到内核的精准定制
  • dddd实战指南:从资产测绘到精准漏洞挖掘的一体化红队工作流
  • 告别OOM:用HuggingFace Tokenizers的train_from_iterator分批训练超大语料库