记忆增强检索能力的实践

文章目录

    • 记忆增强检索能力的实践
      • 获取外部数据
      • 加入记忆组件

记忆增强检索能力的实践

    本文将深人探讨如何通过集成记忆组件,增强数据增强模块LEDVR工作流的数据检索能力,从而提升QA问答应用的回答质量。

获取外部数据

    首先,使用WebBaseLoader从网络加载文档:

from langchain.document loaders import WebBaseLoader
openai_api_key="填人你的密钥"
loader =WebBaseLoader ("http://developers.minil.cn/wiki/luawh.html")
data =loader.load()

    也可以选择其他的加载器和其他的文档资源。接下来,使用OpenAIEmbeddings创建一个嵌人模型包装器:

from langchain.embeddings.openai import OpenAIEmbeddings
embedding =OpenAIEmbeddings (openai api key=openai_api_key)

    使用RecursiveCharacter TextSplitter将文档切割成一系列的文本块:

from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter =RecursiveCharacterTextSplitter(chunk size=500,chunk overlap=0)
splits= text_splitter.split_documents(data)

    然后,创建一个向量存储库。这里使用FAISS创建向量存储库:

from langchain.vectorstores import FAISS
vectordb =FAISS.from documents (documents=splits,embedding=embedding)

加入记忆组件

    首先导入ConversationBufferMemory类,这是最常见的记忆组件,其工作原理非常简单:仅将所有聊天记录保存起来,而不使用任何算法进行截取或提炼压缩。在提示词模板中,可以看到所有的聊天记录。

from langchain.memory import ConversationBufferMemory
memory=ConversationBufferMemory (memory_key="chat history",return messages=True)

    初始化记忆组件后,可以看到其内部的存储情况。由于刚刚进行了初始化,所以存储的聊天记录为空。然后,通过add_user_message方法添加一条“HumanMessage”信息,向程序介绍“名字”。此时,再次查看记忆组件,就可以看到添加了一条信息。

#打印memory.chat_memory.messages
[]
memory.chat_memory.add_user_message("我是李特丽")

    第一次打印memory…chat_memory.messages时,输出的结果为“[]”。在推送一条自我介绍后,可以看到程序里添加了一条“HumanMessage”信息。

[HumanMessage(content='我是李特丽',additional kwargs=(),example=False)]

    使用memory组件的load_memory_.variables方法,可以查看保存在程序运行内存中的memory对象。该对象的主键是chat history,正如初始化ConversationBufferMemory时设置的:memory_.key=“chat_history”。

#打印memory.load memory_variables({})
('chat_history':[HumanMessage(content:='我是李特丽',additional_kwargs-=(),example=False)]}

    下面使用最直接的方式来演示记忆组件是如何与链组件协同工作的。从提示词模板开始,然后逐步增加组件。这一次使用的链组件是load ga chain。这个链组件专门用于QA问答,这里不必掌握链的使用方法,只要在链上指定类型即可。导入loadqa_chain、ChatOpenAI和PromptTemplate。.当提示词模板用于初始化load ga chain时,需要个性化配置提示词。

from langchain.chat models import ChatopenAI
from langchain.chains.question_answering import load qa_chain
from langchain.prompts import PromptTemplate
#这里需使用聊天模型包装器,并且使用新型号的模型
llm =ChatopenAI(openai_api_key=openai_api_key,temperature=0,
model="gpt-3.5-turbo-0613")

    使用向量存储库实例的similarity search方法,测试是否可以检索到与问题相关的文档。可以打印len(docs),看看关于这个问题,搜索到了几个文档片段。检索到的相关文档,要输入提示词模板包装器中。这一步先测试向量存储库是否正常工作。

query="LUA的宿主语言是什么?"
docs= vectordb.similarity search(query)
docs
输出的结果为4,说明有4个相关文档片段被检索到。
4

    创建提示词是最重要的环节。在创建的过程中你可以理解为什么加入记忆组件后,“聊天备忘录”有了内容,让链组件有了“记忆”。使用提示词模板包装器,自定义一个提示词模板字符串。提示词内容分为四部分:一是对模型的指导词:“请你回答问题的时候,依据文档内容和聊天记录回答,如果在其中找不到相关信息或者答案,请回答不知道。”;二是使用问题检索到的相关文档内容:“文档内容是:{context}”;三是记忆组件输出的记忆内容:“聊天记录是:{chat history}”;四是用户的输入:“Human:{human_input}”。

template="""你是说中文的chatbot.“

    请你回答问题的时候,依据文档内容和聊天记录回答,如果在其中找不到相关信息或者答案,请回答不知道。

文档内容是:{context)
聊天记录是:{chat history】
Human:(human input)
Chatbot:
prompt =PromptTemplate(
input_variables=["chat history","human input","context"],
template=template)

    除了需要指定记忆组件存储对象的键值,还要指定input key。load_qa_chain链组件在运行时,解析input key,并将值对应到模板字符串的用户输人human_input占位符中。

memory=ConversationBufferMemory
memory_key="chat_history",input_key="human_input")
chain= load qa_chain(
llm=llm,chain_type="stuff",memory=memory,prompt=prompt)

    上面代码把记忆组件加人load_qa_chain链组件中,于是这个链组件就有了记忆能力。向这个链组件发出第一个问题:

“LUA的宿主语言是什么?
query="LUA的宿主语言是什么?"
docs= vectordb.similarity search(query)
chain({"input documents":docs,"human input":query),
return_only_outputs=True)

    不出意外,运行链组件后,得到了正确的答案。这个答案正是来源于之前检索到的四个文档片段。

('output_text':'LUA的宿主语言通常是C或C++。·)

    接着可以相互之间来个自我介绍。

query="我的名字是李特丽。你叫什么?"
docs= vectordb.similarity_search(query)
chain (("input documents":docs,"human input":query),
return_only_outputs=True)
大语言模型的回答是:“我是一个中文的chatbot。”
('output_text':'我是一个中文的chatbot。')

    继续模拟正常的聊天,问一些别的问题。目的是测试一下,问过几个问题后,它是否还能记得名字,如果它能记得,则证明它有了记忆能力。

query="LUA的循环语句是什么?"
docs =vectordb.similarity_search(query)
chain (("input documents":docs,"human input":query),
return only outputs=True)

    回答依然是正确的。

('output text':'LUA的循环语句有while循环、for循环和repeat.,.until循环。')

    现在可以测试它是不是记住名字了。

query="我的名字是什么?"
docs =vectordb.similarity_search(query)
chain (("input_documents":docs,"human input":query),
return only outputs=True)

    可以看到,它记住名字了。

('output text':'你的名字是李特丽。)

    打印看看它记住的是什么内容。

print (chain.memory.buffer)

    显然,这个记忆组件将多轮对话的用户输人和模型响应都记录了下来。

Human:LUA的宿主语言是什么?
AI:LUA的宿主语言通常是C或C++。
Human:我的名字是李特丽。你叫什么?
AI:我是一个中文的chatbot。
Human:LUA的循环语句是什么?
AI:LUA的循环语句有while循环、for循环和repeat.·.until循环。
Human:我的名字是什么?
AI:你的名字是李特丽。

    在这个代码示例中,同时使用了记忆组件与load ga chain链组件,从而让链组件具有了记忆能力。通过问一系列问题,观察链组件的回答,从而验证其记忆能力。例如,当问了几个关于LUA语言的问题之后,再问聊天机器人“我的名字是什么”,它还能正确回答,这就证明它具有记忆能力了。需要注意的是,这些聊天记录并不会一直被保存着,它们只保留在运行程序的内存中,一旦程序停止运行,这些记录就会消失。这个示例的目的是演示如何让一个QA问答链具备“记忆”的能力,增强检索能力。如果没有记忆的能力,对于用户来说,这个程序就会看起来很木讷,因为凡是“关于人”的问题,它的回答都是“不知道”。通过以上的代码实践,我们了解了如何使用ConversationBufferMemory这个最基本的记忆组件,包括如何实例化记忆组件,如何使用其存储和读取聊天记录,以及如何将其与其他组件(例如load ga_chain链组件)组合使用,来增强程序的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/16653.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用DeepSeek和Kimi快速自动生成PPT

目录 步骤1:在DeepSeek中生成要制作的PPT主要大纲内容。 (1)在DeepSeek网页端生成 (2)在本地部署DeepSeek后,使用chatBox生成PPT内容 步骤2:将DeepSeek成的PPT内容复制到Kimi中 步骤3&…

PADS多层板减少层数

前提 PADS是硬件工程师必备的画图软件,相信很多朋友遇到过为降低成本把6层板改为4层,或8层改为6层的经历,正常是把不需要的两层上所有东西删掉,然后修改层设置,下面举例说明。 首先是将要删除的层上的数据全部删除&a…

Spring 项目接入 DeepSeek,分享两种超简单的方式!

⭐自荐一个非常不错的开源 Java 面试指南:JavaGuide (Github 收获148k Star)。这是我在大三开始准备秋招面试的时候创建的,目前已经持续维护 6 年多了,累计提交了 5600 commit ,共有 550 多位贡献者共同参与…

【LeetCode】689、三个无重叠子数组的最大和

【LeetCode】689、三个无重叠子数组的最大和 文章目录 一、dp1.1 dp 二、多语言解法 一、dp 1.1 dp // go // 输入: nums[] // 计算: 找三段长度为 k 的不重叠的子数组. 要求这 3k 个元素之和最大 // 输出: 三段子数组的 起始位置. 若有多个结果, 返回字典序最小的一个 func …

transformer

导语: 2017年,一篇名为《Attention is All You Need》的论文横空出世,提出了Transformer模型,彻底改变了自然语言处理(NLP)领域的格局。Transformer以其独特的结构和强大的性能,迅速成为NLP领域…

DeepScaleR:仅用 1.5B 参数超越 OpenAI O1-Preview 的强化学习模型

1. 项目概述 1.1 项目目标与意义 DeepScaleR 项目旨在通过强化学习技术推动人工智能模型的性能提升,以更低的成本实现更优的推理能力。其核心目标是开发出在特定任务上超越现有模型的高效模型,同时为开源社区提供技术参考,促进技术的普惠和创新。 技术突破:DeepScaleR-1.…

深入理解指针初阶:从概念到实践

一、引言 在 C 语言的学习旅程中,指针无疑是一座必须翻越的高峰。它强大而灵活,掌握指针,能让我们更高效地操作内存,编写出更优化的代码。但指针也常常让初学者望而生畏,觉得它复杂难懂。别担心,本文将用通…

八、OSG学习笔记-

前一章节: 七、OSG学习笔记-碰撞检测-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145558132?spm1001.2014.3001.5501 一、了解OSG图元加载显示流程 本章节代码: OsgStudy/wids CuiQingCheng/OsgStudy - 码云 - 开源中国https:…

在 ARM64 架构系统离线安装 Oracle Java 8 全流程指南

在 ARM64 架构系统离线安装 Oracle Java 8 全流程指南 文章目录 在 ARM64 架构系统离线安装 Oracle Java 8 全流程指南一、引言二、下载前的准备2.1 确认系统架构2.2 注册 Oracle 账号 三、从 Oracle 官方下载 Java 8 for ARM643.1 访问 Oracle Java 存档页面3.2 选择合适的版本…

栈的简单介绍

一.栈 栈是一种先进后出的结构:(先出来的是45,要出12就必须先把前面的数据全部出完。) 2.实例化一个栈对象: 3.入栈: 4.出栈:(当走完pop就直接弹出45了。) 5.出栈的…

java韩顺平最新教程,Java工程师进阶

简介 HikariCP 是用于创建和管理连接,利用“池”的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制、连接可靠性测试、连接泄露控制、缓存语句等功能,另外,和 druid 一样,HikariCP 也支持监控…

HCIA项目实践--RIP相关原理知识面试问题总结回答

9.4 RIP 9.4.1 补充概念 什么是邻居? 邻居指的是在网络拓扑结构中与某一节点(如路由器)直接相连的其他节点。它们之间可以直接进行通信和数据交互,能互相交换路由信息等,以实现网络中的数据转发和路径选择等功能。&am…

【ThreeJS Basics 1-3】Hello ThreeJS,实现第一个场景

文章目录 环境创建一个项目安装依赖基础 Web 页面概念解释编写代码运行项目 环境 我的环境是 node version 22 创建一个项目 首先,新建一个空的文件夹,然后 npm init -y , 此时会快速生成好默认的 package.json 安装依赖 在新建的项目下用 npm 安装依…

【JavaEE进阶】依赖注入 DI详解

目录 🌴什么是依赖注入 🎄依赖注入的三种方法 🚩属性注⼊(Field Injection) 🚩Setter注入 🚩构造方法注入 🚩三种注⼊的优缺点 🌳Autowired存在的问题 🌲解决Autowired存在的…

在Mac arm架构终端中运行 corepack enable yarn 命令,安装yarn

文章目录 1. 什么是 Corepack?2. 运行 corepack enable yarn 的作用3. 如何运行 corepack enable yarn4. 可能遇到的问题及解决方法问题 1:corepack 命令未找到问题 2:Yarn 未正确安装问题 3:权限问题 5. 验证 Yarn 是否启用成功6…

16.React学习笔记.React更新机制

一. 发生更新的时机以及顺序## image.png props/state改变render函数重新执行产生新的VDOM树新旧DOM树进行diff计算出差异进行更新更新到真实的DOM 二. React更新流程## React将最好的O(n^3)的tree比较算法优化为O(n)。 同层节点之间相互比较,不跨节点。不同类型的节…

SQL数据清理:去除字段值中的多余符号(Demo例子)

目录 前言1. 基础2. 进阶 前言 Excel中有大量不合法的符号,导入到系统之后,数据库有很多脏数据,对此下述展开sql的清洗教程 在数据库的文本字段中,可能会存在多余的逗号或符号,如,销售,, 或 二手车,销售,,这种情况 希…

计算机组成原理

观看地址如下【2019版】1.3.2 性能指标2——速度_哔哩哔哩_bilibili 第一章 计算机系统概述 了解 #低电平高电平 #计算机的发展 主要是因为逻辑元件的限制 选择题 微处理器的发展 这里的机器字长为 软硬件的发展 几种指令和数据流 计算机的系统结构 需求产生变化 电信号…

基于MATLAB的沥青试样孔隙率自动分析——原理详解与代码实现

摘要 在材料科学与土木工程领域,沥青孔隙率是评价其耐久性和稳定性的重要指标。本文提出一种基于图像处理的孔隙率自动计算方法,通过MATLAB实现灰度化、对比度增强、形态学处理等关键步骤,最终输出试样孔隙率。代码注释清晰,可直…

【嵌入式Linux应用开发基础】open函数与close函数

目录 一、open函数 1.1. 函数原型 1.2 参数说明 1.3 返回值 1.4. 示例代码 二、close函数 2.1. 函数原型 2.2. 示例代码 三、关键注意事项 3.1. 资源管理与泄漏防范 3.2. 错误处理的严谨性 3.3. 标志(flags)与权限(mode&#xff…