解决复杂查询难题:如何通过 Self-querying Prompting 提高 RAG 系统效率?

在现代自然语言处理(NLP)领域,检索增强生成(RAG)系统因其能够结合外部知识库和大语言模型的强大生成能力,成为了提升信息检索质量的主流解决方案之一。然而,传统的 RAG 流程存在诸多挑战,尤其是在查询处理阶段,这可能直接影响检索的准确性和效率。为了解决这些问题,Self-querying prompting(自查询提示)应运而生,作为一种优化 RAG 系统查询过程的技术,显著提升了从向量数据库中检索相关信息的精度与质量。

一、背景

在理解 Self-querying prompting 之前,我们首先需要了解传统的 RAG 系统是如何工作的,以及为什么这一技术变得如此重要。

1、什么是 RAG 系统?

检索增强生成(RAG, Retrieval-Augmented Generation)是一种结合了检索和生成的混合式 NLP 系统。RAG 的优势在于它可以利用外部知识库来帮助大模型回答更复杂的问题。例如,当用户输入问题时,RAG 系统会首先通过检索模块(通常基于向量搜索的方式)从庞大的知识库中获取最相关的文档片段(chunks),然后将这些片段整合到生成模型的输入中,帮助生成模型给出更准确、更符合上下文的回答。

这种方法尤其适合解决知识密集型任务,比如技术支持、客户服务、信息查询等场景。然而,传统的 RAG 流程中直接使用用户的原始查询进行检索可能导致以下问题:

  1. 查询不具体:用户输入的查询可能过于宽泛或模糊,导致检索结果不够精准。
  2. 冗余信息:查询中可能含有与检索任务无关的多余信息,干扰检索效果。
  3. 缺少上下文:部分查询缺乏必要的上下文信息,使得检索效果不佳。

这些问题会导致模型生成的回答不够准确或不够相关。因此,如何优化查询,提升 RAG 系统的检索效率成为了关键。

2、为什么需要 Self-querying prompting?

传统的查询优化方法通常依赖于用户手动调整查询内容,这对于不熟悉系统运作的用户来说并不友好。Self-querying prompting 的出现解决了这一难题,它通过自动优化查询的方式,使得 RAG 系统能够更智能、更高效地获取到准确的相关信息。

二、Self-querying prompting 的步骤与原理

Self-querying prompting 是通过一系列步骤来优化查询的,每一个步骤都与提高检索结果的精度和效率息息相关。下面我们逐一探讨每个步骤的具体细节及其背后的工作原理。

1. 信息抽取

信息抽取Self-querying prompting 的核心步骤之一。在这个阶段,系统利用大语言模型(如 GPT)对用户输入的原始查询进行分析和处理,从中提取出关键的属性和与检索任务相关的信息。

关键属性与非属性类信息:

关键属性(key attributes)是与查询直接相关的内容,通常包括用户的具体需求。例如,当用户查询一款商品时,关键属性可能包括价格、颜色、品牌等;而在查询电影或文章时,关键属性可能是导演、年份、评分等。

非属性类信息指的是那些可能帮助模型更好理解查询的背景信息。这些信息可能不直接属于查询的核心内容,但在上下文理解中扮演着重要角色。例如,用户可能会提供产品描述、使用场景等信息,帮助模型生成更符合预期的查询。

2. 生成过滤条件

在从查询中抽取关键信息后,接下来是生成 过滤条件(filtered fields)。这些过滤条件可以被看作是检索系统的"预筛选器",它们帮助减少与用户查询无关的结果。

过滤条件通常基于元数据(metadata),如产品类别、价格区间、用户评分等。通过对这些条件的设定,向量数据库可以在执行查询之前,先排除掉那些不符合基本需求的文档片段,从而提高整体检索的精度。

例如,在查询一款"价格低于 20 美元的黑色皮革迷你裙"时,过滤条件可以包括:颜色为黑色、材质为皮革、价格在 20 美元以下。这些过滤条件会大大减少数据库中的无关文档,提高检索效率。

3. 生成新的查询

在有了过滤条件之后,系统基于抽取的关键信息和上下文信息生成一个新的、更精准的查询(user query)。这个查询往往比用户的原始输入更加简洁和明确,适合在向量数据库中进行搜索。

生成的新查询不仅具有更高的准确性,而且能够更好地体现用户的真实需求。例如,用户可能输入了很多额外的描述信息,而新查询会去掉这些冗余部分,只保留与检索任务相关的关键信息。

4. 执行检索

使用生成的过滤条件和优化后的查询,系统接下来在向量数据库中执行检索操作。向量数据库会返回一组与新查询最相似的文档片段。

向量检索是一种通过将文本转换为向量表示,并利用相似性度量(如余弦相似度)来搜索数据库的方法。与传统的基于关键词的搜索相比,向量检索可以更好地处理语义相似性,从而提高检索结果的相关性。

5. 排序和返回结果

在完成检索后,系统会对返回的文档片段进行排序,确保最相关的内容优先显示给用户。排序过程中,系统会根据查询中的关键信息和上下文线索,对检索到的文档进行优先级排序。

排序后的文档片段会整合到最终的 prompt 中,供大模型生成回答。通过这种方式,用户可以获得更符合预期的答案。

三、示例应用

为了更好地理解 Self-querying prompting 的实际应用,我们来看一个具体的示例。假设用户输入了以下查询:"I want a black leather mini skirt less than twenty dollars."

步骤 1:信息抽取

  • 关键属性:颜色(black)、材质(leather)、类型(mini skirt)、价格(less than twenty dollars)。
  • 非属性类信息:产品描述(mini skirt)。

步骤 2:生成过滤条件

  • 生成过滤条件:颜色(black)、材质(leather)、价格(< 20美元)。

步骤 3:生成新的查询

  • 生成的新查询:"black leather mini skirt"

步骤 4:执行检索

  • 使用过滤条件(颜色、材质、价格)和新的查询("black leather mini skirt")在向量数据库中进行搜索。
  • 检索结果包含多个与查询匹配的文档片段。

步骤 5:排序和返回结果

  • 对检索到的文档片段进行排序,确保价格在 20 美元以下且符合其他条件的文档片段优先返回。

  • 将排序后的文档片段整合到最终的 prompt 中,供大模型生成回答。

三、Self-querying prompting 的优势

Self-querying prompting 为 RAG 系统带来了以下几方面的显著优势:

  1. 提高检索准确性:通过优化查询,系统能够更好地理解用户需求,确保检索结果更加精准。

  2. 减少冗余信息:过滤掉查询中多余的部分,避免不必要的信息干扰检索。

  3. 增强上下文理解:通过上下文信息生成更合适的查询,帮助大模型生成更具相关性的回答。

  4. 用户友好:无需用户手动优化查询,系统自动处理查询优化,提升了整体用户体验。

四、实现示例

以下是一个使用 LangChainOpenAI API 实现 Self-querying prompting 的 Python 代码示例:

# 导入 openai api key
import os
from dotenv import load_dotenv, find_dotenv

# .env 存储 api_key
load_dotenv(find_dotenv())

# 导入 LangChain 和 OpenAI 相关模块
from langchain_openai import ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings
from langchain.chains.query_constructor.base import AttributeInfo
from langchain.retrievers.self_query.base import SelfQueryRetriever

# 初始化 OpenAI 大模型
llm = ChatOpenAI()

# 示例文档
docs = [
    Document(
        page_content="A bunch of scientists bring back dinosaurs and mayhem breaks loose",
        metadata={"year": 1993, "rating": 7.7, "genre": "science fiction"},
    ),
    Document(
        page_content="Leo DiCaprio gets lost in a dream within a dream within a dream within ...",
        metadata={"year": 2010, "director": "Christopher Nolan", "rating": 8.2},
    ),
    Document(
        page_content="A psychologist / detective gets lost in a series of dreams within dreams within dreams and Inception reused the idea",
        metadata={"year": 2006, "director": "Satoshi Kon", "rating": 8.6},
    ),
    Document(
        page_content="A bunch of normal-sized women are supremely wholesome and some men pine after them",
        metadata={"year": 2019, "director": "Greta Gerwig", "rating": 8.3},
    ),
    Document(
        page_content="Toys come alive and have a blast doing so",
        metadata={"year": 1995, "genre": "animated"},
    ),
    Document(
        page_content="Three men walk into the Zone, three men walk out of the Zone",
        metadata={
            "year": 1979,
            "director": "Andrei Tarkovsky",
            "genre": "thriller",
            "rating": 9.9,
        },
    ),
]

# 创建向量数据库
vectorstore = Chroma.from_documents(docs, OpenAIEmbeddings())

# 定义元数据字段信息
metadata_field_info = [
    AttributeInfo(
        name="genre",
        description="The genre of the movie. One of ['science fiction', 'comedy', 'drama', 'thriller', 'romance', 'action', 'animated']",
        type="string",
    ),
    AttributeInfo(
        name="year",
        description="The year the movie was released",
        type="integer",
    ),
    AttributeInfo(
        name="director",
        description="The name of the movie director",
        type="string",
    ),
    AttributeInfo(
        name="rating", description="A 1-10 rating for the movie", type="float"
    ),
]

# 创建 SelfQueryRetriever 实例
document_content_description = "Brief summary of a movie"
retriever = SelfQueryRetriever.from_llm(
    llm,
    vectorstore,
    document_content_description,
    metadata_field_info,
)

# 执行检索
print(retriever.invoke("I want to watch a movie rated higher than 8.5"))
print(retriever.invoke("Has Greta Gerwig directed any movies about women"))
print(retriever.invoke("What's a highly rated (above 8.5) science fiction film?"))
print(retriever.invoke(
    "What's a movie after 1990 but before 2005 that's all about toys, and preferably is animated"
))

五、总结

Self-querying prompting 在优化 RAG 系统查询的过程中发挥了至关重要的作用。通过信息抽取、过滤条件生成、新查询生成等步骤,系统能够更加准确地理解和满足用户需求,从而提升检索效率和生成质量。在日益复杂的 NLP 应用场景中,这一技术为提高用户体验和系统性能提供了强有力的支持。

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

四、AI大模型商业化落地方案

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

相关推荐
sp_fyf_202410 分钟前
【大语言模型】ACL2024论文-19 SportsMetrics: 融合文本和数值数据以理解大型语言模型中的信息融合
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理
CoderIsArt13 分钟前
基于 BP 神经网络整定的 PID 控制
人工智能·深度学习·神经网络
开源社26 分钟前
一场开源视角的AI会议即将在南京举办
人工智能·开源
FreeIPCC27 分钟前
谈一下开源生态对 AI人工智能大模型的促进作用
大数据·人工智能·机器人·开源
机器之心1 小时前
全球十亿级轨迹点驱动,首个轨迹基础大模型来了
人工智能·后端
z千鑫1 小时前
【人工智能】PyTorch、TensorFlow 和 Keras 全面解析与对比:深度学习框架的终极指南
人工智能·pytorch·深度学习·aigc·tensorflow·keras·codemoss
EterNity_TiMe_1 小时前
【论文复现】神经网络的公式推导与代码实现
人工智能·python·深度学习·神经网络·数据分析·特征分析
机智的小神仙儿1 小时前
Query Processing——搜索与推荐系统的核心基础
人工智能·推荐算法
AI_小站1 小时前
RAG 示例:使用 langchain、Redis、llama.cpp 构建一个 kubernetes 知识库问答
人工智能·程序人生·langchain·kubernetes·llama·知识库·rag
Doker 多克1 小时前
Spring AI 框架使用的核心概念
人工智能·spring·chatgpt