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

【RAG提升技巧】查询改写HyDE

简介

提高 RAG 推理能力的一个好方法是添加查询理解层 ——在实际查询向量存储之前添加查询转换。以下是四种不同的查询转换:

  • 路由:保留初始查询,同时查明其所属的适当工具子集。然后,将这些工具指定为合适的选项。
  • 查询重写:维护选定的工具,但以多种方式重新编写查询,以将其应用于同一组工具。
  • 子问题:将查询分解为几个较小的问题,每个问题针对由其元数据确定的不同工具。
  • ReAct Agent 工具选择:根据原始查询,确定要使用的工具并制定要在该工具上运行的特定查询。

HyDE来自于Precise Zero-Shot Dense Retrieval without Relevance Labels,这篇文章主要做zero-shot场景下的稠密检索,通过借助LLM的力量不需要Relevance Labels,开箱即用。作者提出Hypothetical Document Embeddings (HyDE)方法,即“假设”文档嵌入。具体的做法是通过GPT生成虚构的文档,并使用无监督检索器对其进行编码,并在其嵌入空间中进行搜索,从而不需要任何人工标注数据

模型结构如下图所示,HyDE将密集检索分解为两个任务,即 instruction-following的LM生成任务和对比编码器执行的文档相似性任务。

paper:https://arxiv.org/pdf/2212.10496
code:https://github.com/texttron/hyde

原理以及实现

典型的密集信息检索过程包括以下步骤:

  • 将查询和文档转换为嵌入(向量)
  • 计算查询和文档之间的余弦相似度
  • 返回余弦相似度最高的文档

    通过 HyDE,query embedding我做了一些改进。首先让 LLM 生成回答查询的文档,然后将生成的虚拟答案转换为嵌入,而不是直接将查询转换为嵌入。


我们在LangChain上实际使用一下。

from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import LLMChain, HypotheticalDocumentEmbedder
from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI
from dotenv import load_dotenv
# set the environment variables
load_dotenv()# prepare the prompt template for document generation
Prompt_template = """回答问题。
问题:{question}
回答:”””
llm = ChatOpenAI()
# multi_llm = ChatOpenAI(n=4)
prompt = PromptTemplate(input_variables=["question"], template=prompt_template)
llm_chain = LLMChain(llm=llm, prompt=prompt, verbose=True)# initialize the hypothetical document embedder
base_embeddings = OpenAIEmbeddings()
embeddings = HypotheticalDocumentEmbedder(llm_chain=llm_chain, base_embeddings=base_embeddings)result = embeddings.embed_query("塞尔达传说的主角是谁?")
len(result)
http://www.lryc.cn/news/365491.html

相关文章:

  • 前端面试题日常练-day56 【面试题】
  • 【frp】frpc客户端在ubuntu服务器上的配置
  • 构建LangChain应用程序的示例代码:20、使用LangChain的SQLDatabase包装器连接到Databricks运行时并执行查询操作教程
  • PHP Standards Recommendations(PSR)
  • [word] word2019中制表符的妙用 #媒体#笔记#知识分享
  • 太阳能航空障碍灯在航空安全发挥什么作用_鼎跃安全
  • NineData云原生智能数据管理平台新功能发布|2024年5月版
  • 【Android面试八股文】使用equals和==进行比较的区别?
  • 利用架构挖掘增强云管理
  • 力扣 48.旋转图像
  • 前端角色负责人岗
  • git根据历史某次提交创建新分支
  • 如何评价GPT-4o?GPT-4o和ChatGPT4.0的区别是啥呢?
  • 病理级Polymer酶标二抗IHC试剂盒上线!
  • 动态规划(多重背包问题+二进制优化)
  • AI学习指南机器学习篇-逻辑回归正则化技术
  • Django按照文章ID删除文章
  • Java | Leetcode Java题解之第136题只出现一次的数字
  • 文件系统小册(FusePosixK8s csi)【1 Fuse】
  • Bootstrap 环境安装
  • GWT 与 Python App Engine 集成
  • golang的函数为什么能有多个返回值?
  • 一次 K8s 故障诊断:从 CPU 高负载到存储挂载泄露根源揭示
  • python大作业:实现的简易股票简易系统(含源码、说明和运行截图)
  • python-NLP常用数据集0.1.012
  • 【大事件】docker可能无法使用了
  • 探索Linux中的gzip命令:压缩与解压缩的艺术
  • Shell 输入/输出重定向
  • 为什么RPC要比Http高效?
  • 局域网电脑监控软件是如何监控到内网电脑的?