LLM之RAG实战(十五)| RAG的自动源引文验证技术

​       在过去的一年里,检索增强生成(RAG)已经成为一种基于LLM的流行架构,旨在解决在基于知识的LLM最常见的挑战之一,可怕的幻觉

一、RAG如何解决幻觉?

       RAG Pipeline包括两个关键组件:(1)检索器:选择和过滤数据(2)LLM推理:指示LLM使用过滤后的数据回答问题。这两个步骤对需要利用私人知识(如一组合同、财务分析或客户支持数据)的企业来说尤其有效。

二、证据验证

      RAG工作流程中有一个关键的第三步,最近越来越受到关注,那就是LLM推理后发生的事情,特别是:对于潜在的大规模LLM推理,系统如何验证LLM响应是否与引用的特定来源相对应?最终,这是RAG系统的真正回报,但需要一个集成的管道,该管道捕获导致LLM提示的各种输入,然后集成所有LLM推理数据,以实现后处理、源验证、持续审查和审计,并创建一个持续改进的循环。

       在这个博客中,我们将展示一系列强大的技术,作为RAG工作流中的第三步后处理,提供来源验证和自动来源引用。我们将使用llmware(https://www.github.com/llmware-ai/llmware.git),一个用于开发验证LLM应用程序的领先开源框架,来构建RAG工作流,该工作流提供基本的合同分析,然后与合同中的源段落相比,验证LLM响应的准确性。

       LLMware在Prompt类中提供了几种现成的工具,用于简单直观的验证RAG工作流中的来源和证据,具体如下:

·evidence_check_numbers——检查一组提示响应对象,并验证llm_response中的数字是否在提供的源材料中;

·evidence_check_sources——审查llm响应和整个证据,以“确定”最有可能的文本片段、它们的文档和页码,这些文本片段构成llm响应的“源”参考书目;

·evidence_comparison_stats——提供快速的token比较,来分析响应与证据中的令牌以及已确认和未确认的令牌的总体匹配;

·classification_not_found_response——提供三个不同的函数来评估llm_response是否可能被归类为“未找到”响应,以便在工作流中正确处理(包括丢弃);

·save_state——提示状态可以保存整个管道捕获llm事务的各种信息,可能还有一系列事务,并将其保存到一个包装良好的jsonl字典中进行离线分析,或方便地插入到文档数据存储中。该状态还可以用于快速生成微调数据集。

三、代码实现

3.1 安装llmware包

pip install llmware

3.2 使用Setup()命令来下拉一组数百个有用的示例文档,这些文档打包在llmware公共repo中

from llmware.setup import Setupsample_files_path=Setup().load_sample_files()contracts_path = os.path.join(sample_files_path, "Agreements")

       在本演示中,我们将使用“Agreements”文件夹中的一些高管雇佣协议样本,当然也可以使用客户用户数据

       一旦有了样本合同文件,我们就可以开始构建RAG工作流程了。

       让我们看一下代码的每个组件,然后将所有部分放在一起。

Step1创建Prompt对象——在llmware中,Prompt是处理端到端提示交互的主要类,RAG过程的所有步骤都可以在特定的提示中处理。提示将处理加载模型、包装和过滤源材料、应用提示说明以及后期处理生命周期。

      在第一步中,我们要做的就是实例化一个提示对象,并附加我们选择的模型。

prompter = Prompt().load_model(“gpt-4”, api_key=open_api_key)

       在这个演示中,我们将使用“gpt-4”,您可以直接传递api_key,也可以将其加载到os.environ变量中:

openai_api_key = os.environ.get(“OPENAI_API_KEY”,””)

(顺便说一句,我们鼓励您尝试其他模型,包括基于Huggingface的开源LLM模型,如单独的教程中所述。llmware的功能之一是可以通过简单地更改模型字符串名称并传递其api密钥来快速交换另一个模型。)

Step2创建源材料——这是RAG工作流程中的关键一步,我们将把“add_source_document”方法指向我们的合同文件夹和特定的合同,然后这个方法将找出文档类型,通过解析文档特定的格式(例如PDF或Word文档)来提取内容,对文本进行分组,然后可以应用一个可选的过滤器,然后作为一个“上下文”进行批处理和打包,为推理做好准备,这样我们就不必再考虑它,也不必进行所有的数据操作——所有这些都是在这个强大的方法调用的幕后处理的。Llmware用一句简单的俏皮话让这一步变得轻而易举:

source = prompter.add_source_document(exec_emp_fp, contract, query=”base salary”)

       在这种情况下,我们将分析所选文件夹中的合同,无论文件类型如何,然后我们将基于“base salary”主题进行进一步筛选,并将其打包为具有元数据的源,以包含在LLM的提示中。

Step3运行推理——这是主要的处理步骤,将上一步准备的原料加载到提示中,通过查询提示指令温度设置来调用LLM并获得LLM响应。

responses = prompter.prompt_with_source(“What is the executive’s base salary?”, prompt_name = “just_the_facts”, temperature=0.3)

       推理的输出是一个标准的响应字典,其中包括一个或多个llm响应,根据输入上下文的大小,它将自动将上下文分为多个批,并在需要时运行几个推理。

Step4源数据检查——这是提示完成后的最后一个主要步骤,即响应字典的后期处理。如上所述,提供了几种来源和自动证据检查工具:

ev_numbers = prompter.evidence_check_numbers(responses)ev_sources = prompter.evidence_check_sources(responses)ev_stats = prompter.comparison_stats(responses)not_found_status = prompter.classify_not_found_response(responses,                                                         parse_response=True,                                                         evidence_match=True,                                                        ask_the_model=False)

一旦我们运行代码,我们将查看这些方法中每一个的输出。

综合来看,以下是我们将运行的完整代码(也可以在llmware repo中完整找到):

from llmware.prompts import Promptfrom llmware.configs import LLMWareConfigimport osos.environ["USER_MANAGED_OPENAI_API_KEY"] = "insert-your-openai-key"
def contract_analysis_w_fact_checking (model_name):    contracts_path = "/path/to/your/sample/documents/"    # create prompt object    prompter = Prompt().load_model(model_name)    research = {"topic": "base salary", "prompt": "What is the executive's base salary?"}    for i, contract in enumerate(os.listdir(contracts_path)):        print("\nAnalyzing Contract - ", str(i+1), contract)        print("Question: ", research["prompt"])        # contract is parsed, text-chunked, and then filtered by "base salary'        source = prompter.add_source_document(contracts_path, contract, query=research["topic"])        # calling the LLM with 'source' information from the contract automatically packaged into the prompt        responses = prompter.prompt_with_source(research["prompt"], prompt_name="just_the_facts", temperature=0.3)        # run several fact checks        ev_numbers = prompter.evidence_check_numbers(responses)        ev_sources = prompter.evidence_check_sources(responses)        ev_stats = prompter.evidence_comparison_stats(responses)        z = prompter.classify_not_found_response(responses, parse_response=True, evidence_match=True,ask_the_model=False)        for r, response in enumerate(responses):            print("LLM Response: ", response["llm_response"])            print("Numbers: ",  ev_numbers[r]["fact_check"])            print("Sources: ", ev_sources[r]["source_review"])            print("Stats: ", ev_stats[r]["comparison_stats"])            print("Not Found Check: ", z[r])            # We're done with this contract, clear the source from the prompt            prompter.clear_source_materials()    # Save jsonl report to jsonl to /prompt_history folder    print("\nupdate: prompt state saved at: ", os.path.join(LLMWareConfig.get_prompt_path(),prompter.prompt_id))    prompter.save_state()

       运行脚本并在控制台中,将很快看到与每个合同文档的分析相对应的一系列输出,每个文档的代表性输出类似于以下内容:

Analyzing Contract -  1 Nyx EXECUTIVE EMPLOYMENT AGREEMENT.docxQuestion:  What is the executive's base salary?LLM Response:  $200,000.Numbers:  [{'fact': '$200,000,', 'status': 'Confirmed', 'text': ' ... pay Executive a base salary at the annual rate of $200,000, payable semimonthly in accordance with Employer's normal payroll practices.  ... ', 'page_num': '3', 'source': 'Nyx EXECUTIVE EMPLOYMENT AGREEMENT.docx'}]Sources:  [{'text': 'pay Executive a base salary at the annual rate of $200000 payable semimonthly in accordance with Employer's normal payroll practices ', 'match_score': 1.0, 'source': 'Nyx EXECUTIVE EMPLOYMENT AGREEMENT.docx', 'page_num': '4'}]Stats:  {'percent_display': '100.0%', 'confirmed_words': ['200000'], 'unconfirmed_words': [], 'verified_token_match_ratio': 1.0, 'key_point_list': [{'key_point': '$200,000.', 'entry': 0, 'verified_match': 1.0}]}Not Found Check:  {'parse_llm_response': False, 'evidence_match': False, 'not_found_classification': False}Numbers:  [{'fact': '$200,000,', 'status': 'Confirmed', 'text': ' ... pay Executive a base salary at the annual rate of $200,000, payable semimonthly in accordance with Employer’s normal payroll practices.  ... ', 'page_num': '3', 'source': 'Nyx EXECUTIVE EMPLOYMENT AGREEMENT.docx'}]

让我们更详细地解释每一个事实核查。

Numbers——这将审查LLM响应,识别响应中的任何数字,然后在源材料中查找匹配的数字值,如果提供,则会提供一个包含已确认事实的词典,显示事实、状态,以及提供确认的源和页码文本片段。提供了基本的正则表达式处理(例如,删除“$”、逗号等)以及浮点值比较(例如,12.00与12相同),以增强检查的稳健性。

Sources——该方法审查上下文中提供的所有来源,并根据匹配标记的密度提供统计衍生的审查,以确定llm输出最可能的特定来源,包括来源文档和页码。

Stats–这是一个非常有用的快速检查,也是识别潜在问题响应的最可靠的简单方法之一–它显示了按token匹配的百分比(不包括停止词和基本格式项),并显示了已确认和未确认的关键token的列表。

Not Found Classification——根据经验,这是RAG处理中最重要、也是最不被理解的检查之一。在几乎任何RAG自动化中,都会出现许多情况,其中特定的段落被包含在上下文中,并且该段落不足以回答目标问题或分析。这些时候往往是错误的最高风险,因为模型试图通过结合上下文中的信息来创建答案来“提供帮助”,即使上下文并不具体适用。此外,当工作流最有用的输出是“未找到”的分类时,模型在回答这些问题时往往会冗长地解释为什么它不能提供答案,从而将特定的推理事务排除在进一步分析之外。在这种情况下,“False”表示双重否定,例如,事务“not”是“not found”事务。

Prompt State–最后,所有经过检查的llm响应对象都保存在控制台输出底部链接的提示状态历史记录中。更多信息可以查看此.jsonl文件,该文件提供了特定LLM事务的所有元数据的完整视图,这些元数据可用于多种目的:

·对总体准确性和错误/幻觉率的分析;

·不同模型的比较;

·审计和合规活动;

·持续改进以识别常见问题。

      这五种机制(包括numbers, sources, stats, not-found, and prompt state)的结合为几乎所有RAG工作流提供了一个强大的工具包,可以快速识别潜在的错误和风险暴露。

参考文献:

[1] https://medium.com/@darrenoberst/using-llmware-for-rag-evidence-verification-8611abf2dbeb

[2] https://www.github.com/llmware-ai/llmware.git

[3] https://www.huggingface.co/llmware/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Java SSM框架实现摄影器材租赁系统项目【项目源码+论文说明】

基于java的SSM框架实现摄影器材租赁系统演示 摘要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识&a…

Linux(Centos7)安装 jenkins(jdk11+jenkins2.375),并配置JDK,Maven,Git,GitLab

安装步骤 1. JDK11安装2. Maven安装3. git安装4. Jenkins2.375安装4.1 设置中文显示4.2 端口,用户权限修改4.3 插件下载4.4 全局工具配置4.4.1 Maven配置4.4.2 JDK配置4.4.3 Git配置 4.5 系统配置4.5.1 Gitee配置 4.6 构建测试 1. JDK11安装 #下载 yum -y install fontconfig …

怎样获取power shell 的全部可用命令?2/5(篇幅有点长,分成5份)

在power shell 窗口中,有一个获取全部可用命令的命令:get-command,获取到的命令有1640多个,够学习了吧?那么,power shell 命令有哪些类别呢? PowerShell命令可以分为以下几类: Cmdl…

高可用架构去中心化重要?

1 背景 在互联网高可用架构设计中,应该避免将所有的控制权都集中到一个中心服务,即便这个中心服务是多副本模式。 对某个中心服务(组件)的过渡强依赖,那等同于把命脉掌握在依赖方手里,依赖方的任何问题都可…

开启C++之旅(上):探索命名空间与函数特性(缺省参数和函数重载)

之前浅显的讲解了数据结构的部分内容:数据结构专栏 那么今天我们迎来了新的起点:C的探索之旅 文章目录 1.命名空间1.1引入命名冲突1.2命名空间1.2.1命名空间的定义1.2.2命名空间的使用 2.c的输入与输出3.缺省参数3.1概念3.2缺省参数分类 4.函数重载4.1概…

【深基9.例4】求第 k 小的数#洛谷(MLE)

题目描述 输入 n n n&#xff08; 1 ≤ n < 5000000 1 \le n < 5000000 1≤n<5000000 且 n n n 为奇数&#xff09;个数字 a i a_i ai​&#xff08; 1 ≤ a i < 10 9 1 \le a_i < {10}^9 1≤ai​<109&#xff09;&#xff0c;输出这些数字的第 k k k 小…

吉祥物如何解锁虚拟主持人身份,赋能品牌营销?

在互联网突破时空的整体语境下&#xff0c;一个吉祥物可以解锁虚拟主持人身份&#xff0c;结合动作捕捉技术&#xff0c;活跃于品牌线上线下营销活动场景&#xff0c;让吉祥物虚拟主持人凭借其“萌”、的特征&#xff0c;带给用户亲近感&#xff0c;快速拉近品牌与用户的距离&a…

基于Web的航空航天数字博物馆推荐系统

介绍 项目背景&#xff1a; 航空航天数字博物馆推荐系统是一个基于Web开发的应用&#xff0c;旨在为用户提供一个全面的航空航天领域的数字博物馆体验。通过展品展示、分类筛选和个性化推荐等功能&#xff0c;用户可以更好地了解航空航天知识和文化&#xff0c;并丰富参观体验…

关于git删除仓库中原本应该忽略的文件的研究

开门见山&#xff0c;先抛出一个结论&#xff1a; 任何被提交到远程仓库中的数据&#xff0c;都不能被彻底删除&#xff0c;只要提交上去了&#xff0c;就会永远留存。 任何被提交到远程仓库中的数据&#xff0c;都不能被彻底删除&#xff0c;只要提交上去了&#xff0c;就会…

centos7 arm服务器编译安装gcc 8.2

前言 当前电脑的gcc版本为4.8.5&#xff0c;但是在编译其他依赖包的时候&#xff0c;出现各种奇怪的问题&#xff0c;会莫名其妙的中断编译。本地文章讲解如何自编译安装gcc&#xff0c;替换系统自带的gcc。 环境准备 gcc 需要 8.2&#xff1a;下载地址 开始编译 1、解压gcc…

服务器 conda update 失败解决方法

1. 强制 conda update 租借一台服务器&#xff0c;发现 conda 版本是4.10.3&#xff0c;需要升级&#xff0c;使用了如下命令都没有效果&#xff0c;仍然是一样的版本 conda update conda update --all conda update -n base -c defaults conda最后强制用conda-forge通道更新…

基于Java SSM框架实现学生成绩管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现学生成绩管理系统演示 摘要 学生成绩是高校人才培养计划的重要组成部分&#xff0c;是实现人才培养目标、培养学生科研能力与创新思维、检验学生综合素质与实践能力的重要手段与综合性实践教学环节。而学生所在学院多采用半手工管理学生成绩的方式&#…

linux命令太多记不住吗?怎么办 ?于是推出了这样一套教程。

1.帮助命令 1.1 help命令 #语法格式&#xff1a; 命令 --help #作用: 查看某个命令的帮助信息 # 示例: # ls --help 查看ls命令的帮助信息# netstat --help 查看netstat命令的帮助信息1.2 man命令 #语法格式&#xff1a; man 命令 #作用: 查看某个命令的帮助手册 # 示例: …

Codeforces Round 918 (Div. 4)补题

Odd One Out&#xff08;Problem - A - Codeforces&#xff09; 题目大意&#xff1a;有三个数&#xff0c;其中两个相同&#xff0c;找出不同的那个数。 #include<bits/stdc.h> using namespace std; int main() {int t;scanf("%d",&t);while(t--){vect…

电脑安装 Python提示“api-ms-win-crt-process-l1-1-0.dll文件丢失,程序无法启动”,快速修复方法,完美解决

在windows 10系统安装完python后&#xff0c;启动的时候&#xff0c;Windows会弹出错误提示框“无法启动此程序&#xff0c;因为计算机中丢失了api-ms-win-crt-process-l1-1-0.dll&#xff0c;尝试重新安装该程序以解决此问题。” api-ms-win-crt-process-l1-1-0.dll是一个动态…

TEMU、亚马逊、shein平台崛起迅猛,掌握自养号测评必备运营攻略

2023年12月&#xff0c;SimilarWeb发布的数据显示&#xff0c;TEMU的独立访客数量达到4.67亿&#xff0c;与Aliexpress持平&#xff0c;全球排名第二。亚马逊以26.59亿用户位居第一&#xff0c;而SHEIN则拥有1.723亿用户&#xff0c;排名第三。 然而&#xff0c;仅仅六个月前的…

centos8部署MySQL5.7故障集

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 在centos8系统上安装MySQL&#xff0c;使用的是centos7上安装MySQL的脚本&#xff0c;出现了以下问题&#xff0c;以做记录&…

vue 组件 import make sure to provide the “name“ option.

百度了好多结果&#xff0c;都过时了&#xff0c;例如&#xff1a; 模块引入是否加{} 再比如&#xff1a; 对于递归组件&#xff0c;请确保提供“name”选项。 出现该错误情况之一&#xff1a; 错误由未正确引入组件或子组件引起&#xff0c;如element-ui中form表单组件未引…

simulink之Fixed-Point Numbers

Fixed-Point Numbers 定点数及其数据类型的特征在于它们的字大小&#xff08;以位为单位&#xff09;、二进制点以及它们是有符号的还是无符号的。定点设计器™ 软件支持整数和定点数。这些数据类型之间的主要区别在于它们的二进制点。 注意&#xff1a;定点数字的字大小最多…

redis原理(二)数据结构

redis可以存储键与5种不同数据结构类型之间的映射&#xff1a; String类型的底层实现只有一种数据结构&#xff0c;也就是动态字符串。而List、Hash、Set、ZSet都由两种底层数据结构实现。通常我们把这四种类型称为集合类型&#xff0c;它们的特点是一个键对应了一个集合的数据…