Agent检索增强生成

news2024/11/19 5:48:11

检索增强生成(RAG)设计模式通常用于在特定数据域中开发大语言模型(LLM)应用。然而,RAG的过往的研究重点主要在于提高检索工具的效率,例如嵌入搜索、混合搜索和微调嵌入,而忽视了智能搜索。本文介绍了一种受人类研究方法启发的新方法,该方法涉及多种搜索技术、观察临时结果、精炼以及在提供响应之前在多步骤过程中重试。本文提出基于智能Agent的检索增强方案,突破传统RAG模式的局限性,构建更加智能、更加贴近事实的LLM应用。

1 - 基本RAG模式和限制

标准RAG模式实现概述:

图片

  • 该过程首先根据用户的问题或对话创建查询,通常通过提示语言模型(LLM)。这通常称为查询重写步骤。

  • 然后将该查询分派到搜索引擎,搜索引擎返回相关知识(检索)。

  • 然后,检索到的信息会通过包含用户问题的提示进行增强,并转发给LLM。

  • 最后,LLM对用户的查询(生成)做出回应。

RAG的局限性:

  • 在RAG模式中,检索、增强和生成由单独的进程管理。LLM可能会通过不同的提示来进行每个过程。然而,直接与用户交互的LLM通常最了解回答用户查询所需的内容。检索LLM可能不会以与生成LLM相同的方式解释用户的意图,从而为其提供可能妨碍其响应能力的不必要的信息。

  • 每个问题都会执行一次检索,没有来自LLM的任何反馈循环。如果由于搜索查询或搜索词等因素导致检索结果不相关,LLM缺乏纠正这种情况的机制,可能会诉诸捏造答案。

  • 检索的上下文一旦提供就不可更改且无法扩展。例如,如果研究结果表明需要进一步调查,例如检索到的文档引用了应进一步检索的另一文档,则没有此规定。

  • RAG模式不支持多步骤迭代搜索。

2 - Agent智能RAG模式原理

智能Agent模型在回答缺乏直接知识的问题时从人类的研究方法中汲取灵感。在此过程中,在提供最终答案之前,可以执行一次或多次搜索以收集有用的信息。每次搜索的结果可以确定是否需要进一步调查,如果需要,则确定后续搜索的方向。这个迭代过程一直持续到我们相信我们已经积累了足够的知识来回答,或者得出结论我们无法找到足够的信息来回答。有时,研究结果可以进一步阐明用户的意图和查询范围。

为了复制这种方法,建议开发一个由语言模型(LLM)提供支持的智能Agent,用于管理与用户的对话。Agent自主确定何时需要使用外部工具进行研究,制定一个或多个搜索查询,进行研究,审查结果,并决定是否继续进一步研究或寻求用户的澄清。此过程一直持续到Agent认为自己已准备好向用户提供答案为止。

图片

3 - Agent智能RAG模式实现

可以借助Azure OpenAI的功能调用能力来实现一个能自主使用搜索工具查找所需信息以协助处理用户请求的Agent。仅这一项功能就简化了RAG模式的传统实现方式(如前所述包括查询改写、增强和生成的独立步骤)。

Agent使用系统定义的角色和目标与用户交互,同时了解其可以使用的搜索工具。当Agent需要查找它不具备的知识时,它会制定搜索查询并向搜索引擎发出信号以检索所需的答案。

这个过程不仅让人想起人类行为,而且比RAG模式更有效。在RAG模式中,知识检索是一个单独的过程,无论是否需要都向聊天机器人提供信息。

实现此功能分为以下几步:

(1)定义角色、预期行为和要使用的工具以及何时使用。

PERSONA = """
You are Maya, a technical support specialist responsible for answering questions about computer networking and system.
You will use the search tool to find relavent knowlege articles to create the answer.
Answer ONLY with the facts from the search tool. If there isn't enough information, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.
Each source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brakets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].
If the user is asking for information that is not related to computer networking, say it's not your area of expertise.
"""

(2)定义json格式的函数规范,包含函数和参数描述。

FUNCTIONS_SPEC= [  
    {
        "name": "search_knowledgebase",
        "description": "Searches the knowledge base for an answer to the technical question",
        "parameters": {
            "type": "object",
            "properties": {
                "search_query": {
                    "type": "string",
                    "description": "The search query to use to search the knowledge base"
                },

            },
            "required": ["search_query"],
        },
    },
] 

有趣的是,“用于搜索知识库的搜索查询”的参数描述起着至关重要的作用。它指导LLM根据帮助用户进行对话所需的内容制定合适的搜索查询。此外,可以描述搜索查询参数并将其限制为遵守特定的工具格式,例如Lucene查询格式。还可以结合其他参数来执行过滤等任务。

(3)实现函数调用流程。

图片

此时,我们开发了一种能够进行独立搜索的智能Agent。然而,为了真正创建一个能够承担更复杂的研究任务(例如多步骤和自适应执行)的智能Agent,我们还需要实现一些额外的功能。

为了增加Agent在系统消息中计划、行动、观察和调整的能力,我们需要在角色定义中添加如下信息:

Being smart in your research. If the search does not come back with the answer, rephrase the question and try again.Review the result of the search and use it to guide your next search if needed.If the question is complex, break down to smaller search steps and find the answer in multiple steps.

更新之后的角色定义如下:

PERSONA = """You are Maya, a technical support specialist responsible for answering questions about computer networking and system.You will use the search tool to find relavent knowlege articles to create the answer.Being smart in your research. If the search does not come back with the answer, rephrase the question and try again.Review the result of the search and use it to guide your next search if needed.If the question is complex, break down to smaller search steps and find the answer in multiple steps.Answer ONLY with the facts from the search tool. If there isn't enough information, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.Each source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brakets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].If the user is asking for information that is not related to computer networking, say it's not your area of expertise."""

添加的指令表示机器人应该重试并根据需要更改问题。此外,它还表示机器人应该审查搜索结果以指导下一次搜索,并在需要时采用多步骤方法。这假设可以多次调用搜索工具。

由于LLM无法自行重复此过程,因此我们需要使用应用程序逻辑来管理此过程。我们可以通过将整个过程放在一个循环中来做到这一点。当模型准备好给出最终答案时,循环退出:

while True:
    response = openai.ChatCompletion.create(
        deployment_id=self.engine,  # The deployment name you chose when you deployed the GPT-35-turbo or GPT-4 model.
        messages=conversation,
        functions=self.functions_spec,
        function_call="auto"
    )
    response_message = response["choices"][0]["message"]

    # Step 2: check if GPT wanted to call a function
    if response_message.get("function_call"):
        print("Recommended Function call:")
        print(response_message.get("function_call"))
        print()

        # Step 3: call the function
        # Note: the JSON response may not always be valid; be sure to handle errors

        function_name = response_message["function_call"]["name"]

        # verify function exists
        if function_name not in self.functions_list:
            raise Exception("Function " + function_name + " does not exist")
        function_to_call = self.functions_list[function_name]

        # verify function has correct number of arguments
        function_args = json.loads(response_message["function_call"]["arguments"])

        if check_args(function_to_call, function_args) is False:
            raise Exception("Invalid number of arguments for function: " + function_name)
        search_query = function_args["search_query"]
        print("search_query", search_query)

        # check if there's an opportunity to use semantic cache
        if function_name == "search_knowledgebase":
            if os.getenv("USE_SEMANTIC_CACHE") == "True":
                cache_output = get_cache(search_query)
                if cache_output is not None:
                    print("semantic cache hit")
                    conversation.append({"role": "assistant", "content": cache_output})
                    return False, query_used, conversation, cache_output
                else:
                    print("semantic cache missed")
                    query_used = search_query

        function_response = function_to_call(**function_args)
        print("Output of function call:")
        print(function_response)
        print()

        # Step 4: send the info on the function call and function response to GPT

        # adding assistant response to messages
        conversation.append(
            {
                "role": response_message["role"],
                "name": response_message["function_call"]["name"],
                "content": response_message["function_call"]["arguments"],
            }
        )

        # adding function response to messages
        conversation.append(
            {
                "role": "function",
                "name": function_name,
                "content": function_response,
            }
        )  # extend conversation with function response
        continue
    else:
        break  # if no function call break out of loop as this indicates that the agent finished the research and is ready to respond to the user

完整代码可以参考:
https://github.com/microsoft/OpenAIWorkshop/blob/sephack/scenarios/incubations/copilot/smart_agent/utils.py

以下是演示场景中正在运行的智能Agent:

图片

问题是对两种产品之间的功能进行比较。每个产品的功能都存储在单独的文档中。为此,我们的Agent执行两个搜索查询:

X100 vs Z200 power profile for Radio 0
X100 power profile for Radio 0

第一个查询是一种贪婪方法,因为Agent希望有一个包含比较的文档。情况并非如此,因为搜索查询没有返回有关X100的足够信息,因此添加了专用于X100的第二个查询。

如果将其提供给经典的RAG解决方案,它将无法找到好的答案,因为它会在第一个查询处停止。

4 - 结论

实施Agent模式可以显着增强LLM应用能力。这是由于该模式具有测试各种策略并根据观察到的结果改进其方法的智能能力。 

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

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

相关文章

WordPress企业模板

首页大图wordpress外贸企业模板 橙色的wordpress企业模板 演示 https://www.zhanyes.com/waimao/6250.html

PDF有编辑密码怎么办

目录 注意: windows方法: 1 python 下载 2 打开命令行 3 安装 pikepdf 4 编写python脚本 5 使用py脚本 6解密完成 Linux方法: 注意: 此方法可以用于破解PDF的编辑密码,而不是PDF的打开密码 当遇到类似如下问…

SSC | Blue Prism报告:2024年智能自动化(IA)7大趋势预测

近日,RPA行业领导者SS&C | Blue Prism发布《2024智能自动化(IA)趋势与预测》报告。报告中提到,智能自动化(IA)与流程管理的有效融合,是实现数字化转型成功的核心。采用业务流程管理&#xf…

工业物联网的关键技术——青创智通工业物联网

1. 传感器技术:传感器是实现工业物联网感知层的重要技术之一,能够将物理量、化学量、生物量转化为可处理的数字信号,从而实现对物体状态的实时监测和自动控制。传感器技术是工业物联网应用中的关键核心技术之一,其性能和精度直接影…

Linux--部署 Tomcat 及其负载均衡

1.案例前置知识点 1)Tomcat简介 名称由来:Tomcat最初是由 Sun的软件构架师詹姆斯邓肯戴维森开发的。后来他帮助将其变 为开源项目,并由Sun贡献给Apache软件基金会。由于大部分开源项目OReilly都会出一本相关的 书,并且将其封面设…

走迷宫之推箱子

前言: 在上一篇文章当中我介绍了一个走迷宫的写法,但是那个迷宫没什么可玩性和趣味性,所以我打算在迷宫的基础上加上一个推箱子,使之有更好的操作空间,从而增强了游戏的可玩性和趣味性。 1. 打印菜单 void menu() {…

python绘制热力图-数据处理-VOC数据类别标签分布及数量统计(-代码)

Python是一种功能强大的编程语言,它提供了许多库和工具,用于处理和可视化数据。在本文中,我们将介绍使用Python绘制热力图,并对VOC数据集中的类别标签进行分布及数量统计。 首先,我们需要导入所需的库。使用numpy库来…

【Java】后端开发语言Java和C#,两者对比注解和属性的区别以及作用

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《Java》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握…

SpringBoot 源码解析4:refresh 方法解析

SpringBoot 源码解析4:refresh 方法解析 1. refresh 方法解析2. 准备刷新 AbstractApplicationContext#prepareRefresh3. 获取bean工厂 AbstractApplicationContext#obtainFreshBeanFactory4. 准备bean工厂 AbstractApplicationContext#prepareBeanFactory5. Servle…

Windows解决.conda文件夹占用C盘空间过大的问题

背景:C盘空间被.conda文件占用16G,主要原因是里面存放了python环境,提前进行环境迁移,防止后面环境增长C盘空间不足 解决办法: 1. .conda文件备份 2. 将.conda文件夹中的envs内容复制到Anaconda的安装目录下D:\Softwa…

HNU-编译原理-实验2-Bison

编译原理实验2Bison 计科210X 甘晴void 202108010XXX 实验要求 详细的实验项目文档为 https://gitee.com/coderwym/cminus_compiler-2023-fall/tree/master/Documentations/lab2 实验步骤 本次实验需要在 Lab1 已完成的 flex 词法分析器的基础上,进一步使用 b…

车机联网

通过笔记本电脑,D-link给车机提供网络 因为笔记本用的无线网络上网,将无线网络连接设置为共享 设置后的效果 本地连接属性设置 Dlink连接电脑和车机;获取车机的动态ip(动态ip每次开关机都会变化,注意更新&#xff09…

【python 的各种模块】(9) 在python使用PIL( 即pillow模块 ) 修改图片

目录 1 导入PIL模块(pillow) 1.1 PIL的全称:Python Imaging Library 1.2 导入PIL模块 1.2.1 可用的导入形式 1.2.2 常用的导入形式 1.2.3 PIL下面的常用子模块 2 PIL.Image的方法 (读入,生成和显示图片) 2.1 用 PIL.Image…

《教育》期刊是什么级别的期刊?是正规期刊吗?能评职称吗?

《教育》以教育行业的各类新闻为重点,积极推广各地教育部门改革经验及优秀成果,努力挖掘教育一线先进单位和个人,充分发挥新闻舆论的监督作用。 收录情况:知网收录 投稿方式:教育类|《教育》省级 出版周期&…

GPT2 GPT3

what is prompt 综述1.Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing(五星好评) 综述2. Paradigm Shift in Natural Language Processing(四星推荐) 综述3. Pre-Trained Models: Past, Present and Future Pro…

Vue学习笔记5-- nextTick | Vue封装的过渡与动画

一、nextTick(tick-工作,起作用;下次起作用) 语法: this.$nextTick(回调函数)作用:在下一次DOM更新结束后执行其指定的回调。什么时候用:当改变数据后,要基于更新后的新DOM进行某些…

虾皮电商 电商平台:虾皮(Shopee)东南亚领先的电子商务平台

在当今数字化时代,电子商务平台的兴起改变了人们的购物方式。虾皮(Shopee)作为东南亚地区领先的电子商务平台,为消费者提供了便捷、多样化的购物体验。由新加坡的Sea Group(前称Garena)于2015年创立&#x…

程序员书单|本月有哪些新书值得关注?

2024年的第一个月,看了一下计算机书籍的榜单,本周有这样几本新书上榜。 1、GPT图解 大模型是怎样构建的 带你从0到1构建大模型,突破语言奥秘,开启智能未来!深入探索自然语言处理技术的核心原理,结合实战&a…

【Linux】第二十九站:再谈进程地址空间

文章目录 一、一些疑问二、程序没有加载前的地址(程序)三、程序加载后的地址四、动态库的地址 一、一些疑问 什么是虚拟地址?什么是物理地址?CPU读到的指令里面用的地址,是什么地址?? 我们之前在使用动态…

将web如vue等项目部署到宝塔docker镜像中,以便能在任意浏览器访问

文章目录 一、准备工作二、具体步骤1、从已经推送的镜像中拉取镜像2、切换到宝塔-容器,添加容器3、启动容器4、将刚刚的端口号添加到防火墙白名单5、访问部署好的项目 参考资料 一、准备工作 仅需确认宝塔面板已经有docker镜像容器 目前新版宝塔面板都已经内置了d…