[Agent]开发---ConversationalRetrievalAgent开发

news2024/11/27 10:36:18

参考资料[langchain官方文档]:

tool retrieval agent::::https://python.langchain.com/docs/modules/agents/how_to/custom_agent_with_tool_retrieval
retrieval memory:::https://python.langchain.com/docs/modules/memory/types/vectorstore_retriever_memory
conversatrionalRetrievalAgent:::https://blog.langchain.dev/conversational-retrieval-agents/
实例:https://python.langchain.com/docs/use_cases/question_answering/how_to/conversational_retrieval_agents?ref=blog.langchain.dev#the-retriever
在具有open_api_key的情况下实现

基本想法或概念:代理在对话过程中优化检索,根据过去的对话回答问题

刚开始的思路:
将memory组件retrieval化,同时将每次的聊天记录也更新到当前文档中,实现对过去的对话检索,这个方法使用vectorestoreRetrievalMemory,这个方法适用于与chain结合使用。因为不需要创建tool去进行调用,但这个方法无法上传文件用来获取之前的历史信息。

后续思路(参考了上述链接3):
ConversationalRetrievalAgent组件核心:使用OpenAIFunctionsAgent代理、tools工具,采用的是retrieval工具、新型的记忆工具AgentTokenBufferMemory
步骤:
第一步:创建检索器工具,这里使用Chroma向量库

from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
import chromadb
from chromadb import Settings
persist_directory = os.getenv("chroma保存地址", "/chromadb保存地址")
chromadb_client = chromadb.Client(
    Settings(
        chroma_db_impl='*****',
        chroma_server_host=os.getenv("chroma的host", "localhost"),
        chroma_server_http_port=os.getenv("chroma的host", "8000"),
        persist_directory=persist_directory
    )
)
# Load the document, split it into chunks, embed each chunk and load it into the vector store.
raw_documents = TextLoader('../../state_of_the_union.txt').load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)
vectorstore = Chroma.from_documents(client=chromadb_client,documents=documents, embedding=embeddings)
retriever = vectorstore.as_retriever()


from langchain.agents.agent_toolkits import create_retriever_tool
tool = create_retriever_tool(
    retriever, 
    name="search_state_of_union",
    description="Searches and returns documents regarding the state-of-the-union."
)

第二步,创建记忆组件,这里使用AgentTokenBufferMemory,记忆ai–human的输入输出和human-ai的输入输出

from langchain.agents.openai_functions_agent.agent_token_buffer_memory import AgentTokenBufferMemory
memory = AgentTokenBufferMemory(memory_key='chat_history',llm=大模型)

第三步,定义openAIFunctionsAgent组件,
方法一:直接通过langchain封装方法直接使用,其他值为已设置好的默认值

from langchain.agents.agent_toolkits import create_conversational_retrieval_agent
agentExcutor = create_conversational_retrieval_agent(llm=llm模型,tools=[tool],memory_key='chat_history')

方法二:通过OpenaiFunction类自定义一个agent,这里return_intermediate_steps需要设置为true,用来保存聊天记录中间步骤的信息。

MEMORY_KEY = memory.memory_key
prompt = OpenAIFunctionsAgent.create_prompt(system_message=SystemMessage(content=template),extra_prompt_messages=[MessagesPlaceholder(variable_name=MEMORY_KEY)])
agent = OpenAIFunctionsAgent(
            llm=llm,
            tools=tools,
            prompt=prompt
        )
agentExecutor = AgentExecutor(agent=agent,tools=tools,memory=memory,verbose=True,return_intermediate_steps=True)

自定义方法时,会出现outputkey----[‘output’,‘intermediate_steps’]的输出错误

`run` not supported when there is not exactly one output key.  Got ['output', 'intermediate_steps'].

,这是由于我们将return_intermediate_steps开关被打开,会返回两个输出key值,需要在他执行时,将return_only_outputs设置为true,该字段在链中

agentExecutor({"input" : query['question']},return_only_outputs=True)

最后,分三次询问

query={
    'question':'What did the president say about Ketanji Brown Jackson'
}

resp = agentExcutor.run(query=query)
print(resp)
query={
    'question':'My name is bob'
}
resp = agentExcutor.run(query=query)
print(resp)
query={
    'question':'whats your name ?'
}
resp = agentExcutor.run(query=query)
print(resp)

结果:
在这里插入图片描述
在这里插入图片描述
完成ConversationalRetrievalAgent的开发。

想法:最开始使用vectorstoreretrievalMemory来做记忆的保存与检索,与chain结合使用。但是这种方法首先每次检索都需要去检索库里查询,其次查询结果的分数并不一定是正确的。
而该Agent出现的好处就是在进入向量库查询之前先用agent判断是否需要进入,结果是否满足回答,从而得到更准确的回答数据,同时也能减少连接查询。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

科技巨擘:探索中国机器人产业的腾飞之路

原创 | 文 BFT机器人 引言 今年4月,特斯拉宣布在德州建造全球最大的电池工厂,这一举措进一步实现了马斯克对于“机器制造机器”的大目标。这座工厂不像过去依靠传统的工人模式,而是采用大量机器人完成生产任务。 机器人已成「刚需」。 机器人…

Mybatis小记

目录 Mybatis第一个程序 xml文件 测试类 错误排查 Mybatis第一个程序 1.搭建实验数据库 2.导入MyBatis相关jar包 3.编写MyBatis核心配置文件 4.编写MyBatis工具类 5.创建实体类、 6.编写Mapper接口类 7.编写Mapper.xml配置文件 8.编写测试类 对象传参只引用需要的属性就可…

突破连接壁垒,火山引擎边缘云网络的先行之路

在万物互联时代,信息不局限于人与人之间的交流,大量的机器设备也需要进行信息交流。就在去年,我国率先迎来了“物超人”的历史性时刻,即物联网连接数超越了人联网连接数。边缘云的发展进入到“黄金十年”。 “要致富,…

多线程(一)

一.什么是线程 一个线程就是一个执行流,多个线程就是多个执行流,多线程就是让多个执行流分别执行自己的代码。 比如:利用多线程在控制台上循环交替打印A和B package demo; public class Main {static class SubThread extends Thread{Over…

Webgl利用缓冲区绘制三角形

什么是attribute 变量 它是一种存储限定符&#xff0c;表示定义一个attribute的全局变量&#xff0c;这种变量的数据将由外部向顶点着色器内传输&#xff0c;并保存顶点相关的数据&#xff0c;只有顶点着色器才能使用它 <!DOCTYPE html> <html lang"en"&g…

Blender界面学习02

学习视频 【基础篇】1.3 认识界面_哔哩哔哩_bilibili 基本的3d建模的流程是什么&#xff1f; 四个角现出加号时可以拆分窗口&#xff0c;也可以合并窗口 向自己的方向拉是合并&#xff0c;向不是自己的方向拉是合并 如果界面搞乱后需要回到原来的布局 然后在新建的布局上右击 …

CSRF漏洞场景复现

文章目录 CSRF漏洞是什么&#xff1f;场景复现get方式攻击post方式攻击 原理分析 CSRF漏洞是什么&#xff1f; 跨站请求伪造(Cross Site Request Forgery&#xff0c;CSRF)是一种攻击&#xff0c;它强制浏览器客户端用户在当前对其进行身份验证后的Web 应用程序上执行非本意操作…

手把手教你用R优雅地绘制研究区地图

用R语言绘制研究区图和地图 引言 在地理信息系统和数据可视化领域&#xff0c;绘制研究区图和地图是非常重要的任务。R语言是一种功能强大的统计分析和可视化工具&#xff0c;也可以用于绘制各种类型的地图。本文将介绍如何使用R语言绘制研究区图和地图。 准备工作 在使用R语…

skywalking agent监控java服务

一、前言 skywalking agent可以监控的服务类型有多种&#xff0c;python、go、java、nodejs服务等都可以监控&#xff0c;现在通过java服务来演示skywalking agent的使用&#xff0c;并且是使用容器的方式实现 二、部署skywalking agent监控 需要注意&#xff0c;skywalking…

高忆管理:什么叫满仓?

满仓是股市术语之一&#xff0c;指出资者将所有资金用于股票出资&#xff0c;即持有的股票数量到达最大值。满仓出资是一种高风险高回报的出资战略&#xff0c;存在着带来高收益的或许性&#xff0c;但也或许面对巨大的亏本风险。 从理财视点来看&#xff0c;满仓出资是不明智…

Leetcode适合新手吗?0基础怎么较短时间得到算法数据结构提升?揭秘大牛都在用的刷题工具!...

别再用leetcode无脑刷题了&#xff01; 刷题不应该量化为“刷多少道题”&#xff0c;对于刷题来说&#xff0c;永远不是追求数量的堆叠。 你想&#xff0c;LeetCode 上的题难度不等&#xff0c;有简单、中等、困难。 刷100道简单题倒是快&#xff0c;一个星期保证完事&#xff…

具有优异导电性能且抑制了准饱和效应的1200V 4H-SiC沟槽MOSFET

标题&#xff1a;1200V 4H-SiC trench MOSFET with superior figure of merit and suppressed quasi-saturation effect 摘要 本文提出一种具有部分被埋层n区包围的p屏蔽区的优异性能(FoM)1200V 4H-SiC沟槽MOSFET。在准饱和(QS)状态下&#xff0c;埋层n区抑制由p屏蔽区形成的耗…

SharedPreference

Android中的SharedPreference是轻量级的数据存储方式&#xff0c;能够保存简单的数据类型。比如String、int、boolean值等。其内部是以XML结构保存在/data/data/包名/shared_prefs文件夹下&#xff0c;数据以键值对的形式保存。是线程安全的&#xff0c;但不是进程安全的。 1.…

electron globalShortcut 快捷键,在焦点移到其他软件上时,调用快捷键报错

用 electron 开发软件&#xff0c;在设置了 globalShortcut 快捷键后&#xff0c;在当前开发的软件上调用快捷键正常&#xff0c;但是当焦点不在当前软件时&#xff0c;在使用快捷键&#xff0c;好些时候会报错。大概率与系统快捷键产生冲突或者快键键控制的回调里获取的内容&a…

全新UI站长在线工具箱系统源码带后台开源版

该系统的全开源版本可供下载&#xff0c;并且支持暗黑模式。 系统内置高达72种站长工具、开发工具、娱乐工具等功能。此系统支持本地调用API&#xff0c;同时还自带免费API接口&#xff0c; 是一个多功能性工具程序&#xff0c;支持后台管理、上传插件、添加增减删功能。 环…

行业追踪,2023-08-28

自动复盘 2023-08-28 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

LNMT与动静分离

目录 前言 一、简要思路 二、NGINX的配置参考 1、location 2、rewirte 三、动静分离配置&#xff08;单机配置&#xff09; 1、Tomcat配置 2、配置NGINX 3、安装mariadb 4、测试 Tomcat8080​编辑 Tomcat8081 访问不存在的页面 前言 LNMT&#xff08;Linux Nginx MySQL Tom…

什么是网络取证(Network Forensics)

企业采用新技术来检查其网络安全是否存在零日漏洞&#xff0c;与立即指示问题的物理层不同&#xff0c;黑客攻击尝试可能会被忽视并变得严重&#xff0c;直到对网络流量有一个整体的可见性。通过实时监控来跟踪其源和目标的流量&#xff0c;以查明问题或潜在问题的根源。 什么…

CY3-DBCO活性荧光染料-星戈瑞

​欢迎来到星戈瑞荧光stargraydye&#xff01;小编带您盘点&#xff1a; CY3-DBCO是一种活性荧光染料&#xff0c;它是由Cyanine3&#xff08;CY3&#xff09;荧光染料与DBCO&#xff08;dibenzocyclooctyne&#xff09;官能团共轭而成的化合物。 活性荧光染料通常是指具有特定…

Android RecyclerView 之 列表宫格布局的切换

前言 RecyclerView 的使用我就不再多说&#xff0c;接下来的几篇文章主要说一下 RecyclerView 的实用小功能&#xff0c;包括 列表宫格的切换&#xff0c;吸顶效果&#xff0c;多布局效果等&#xff0c;今天这篇文章就来实现一下列表宫格的切换&#xff0c;效果如下 一、数据来…