AI知识库 AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


(二)12个RAG痛点及其解决方案
浏览次数: 1645

痛点 5:格式错误

当 LLM 忽略了以特定格式(如表格或列表)提取信息的指令时,我们有四个建议的解决方案可供探索:

更好的提示词

您可以采用以下几种策略来改进提示并纠正此问题:

  • 澄清指令
  • 简化请求并使用关键字
  • 举例说明
  • 反复提示并提出后续问题

输出解析

输出解析可以通过以下方式帮助确保所需的输出:

  • 为任何提示/查询提供格式化说明
  • 为 LLM 输出提供 "解析"

LlamaIndex 支持与其他框架提供的输出解析模块的集成,如 Guardrails[10] 和 LangChain[11]。

请参阅下面的 LangChain 输出解析模块的示例代码片段,您可以在 LlamaIndex 中使用。有关更多详细信息,请查看有关输出解析模块的 LlamaIndex 文档。

from llama_index import VectorStoreIndex, SimpleDirectoryReader
from llama_index.output_parsers import LangchainOutputParser
from llama_index.llms import OpenAI
from langchain.output_parsers import StructuredOutputParser, ResponseSchema

# load documents, build index
documents = SimpleDirectoryReader("../paul_graham_essay/data").load_data()
index = VectorStoreIndex.from_documents(documents)

# define output schema
response_schemas = [
    ResponseSchema(
        name="Education",
        description="Describes the author's educational experience/background.",
    ),
    ResponseSchema(
        name="Work",
        description="Describes the author's work experience/background.",
    ),
]

# define output parser
lc_output_parser = StructuredOutputParser.from_response_schemas(
    response_schemas
)
output_parser = LangchainOutputParser(lc_output_parser)

# Attach output parser to LLM
llm = OpenAI(output_parser=output_parser)

# obtain a structured response
from llama_index import ServiceContext

ctx = ServiceContext.from_defaults(llm=llm)

query_engine = index.as_query_engine(service_context=ctx)
response = query_engine.query(
    "What are a few things the author did growing up?",
)
print(str(response))

Pydantic 程序

Pydantic 程序是一个通用框架,用于将输入字符串转换为结构化 Pydantic 对象。LlamaIndex 提供了几类 Pydantic 程序:

  • LLM 文本补全 Pydantic 程序:这些程序处理输入文本,并使用文本补全 API 结合输出解析将其转换为用户定义的结构化对象。
  • LLM 函数调用 Pydantic 程序:这些程序通过利用函数调用 API 的 LLM,将输入文本转换为用户指定的结构化对象。
  • 预打包的 Pydantic 程序:这些程序旨在将输入文本转换为预定义的结构化对象。

OpenAI JSON 模式

OpenAI JSON 模式使我们能够将 response_format 设置为{"type":"json_object"},以启用响应的 JSON 模式。启用 JSON 模式时,模型被约束为仅生成解析为有效 JSON 对象的字符串。虽然 JSON 模式强制输出的格式,但它对针对指定模式的验证没有帮助。

更多详细信息,请查看 LlamaIndex 关于 OpenAI JSON 模式与函数调用数据提取的文档[12]。

痛点 6:不正确的特异性

回答可能缺乏必要的细节或特异性,通常需要后续查询才能澄清。答案可能过于模糊或笼统,无法有效满足用户的需求。

我们求助于高级检索策略来寻找解决方案。

高级检索策略

当答案不在您期望的正确粒度级别时,您可以改进检索策略。一些可能有助于解决这个痛点的主要高级检索策略包括:

  • 从小到大检索[13]
  • 句子窗口检索[14]
  • 递归检索[15]

查看我的上一篇文章 Jump-start Your RAG Pipelines with Advanced Retrieval LlamaPacks and Benchmark with Lighthouz AI[16],了解有关七种高级检索 LlamaPack 的更多详细信息。

痛点 7:不完整

部分回答没有错;然而,它们并没有提供所有细节,尽管信息在上下文中是存在且可访问的。例如,如果有人问 "文件 A、B 和 C 中讨论的主要方面是什么?" 单独询问每个文档以确保得到全面的答案可能会更有效。

查询转换

比较问题在朴素的 RAG 方法中表现尤其差。提高 RAG 推理能力的一个好方法是添加查询理解层——在实际查询向量存储之前添加查询转换。以下是四种不同的查询转换:

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

请参阅下面的示例代码片段,了解如何使用 HyDE(假设文档嵌入),这是一种查询重写技术。给定自然语言查询,首先生成一个假设的文档/答案。然后将此假设文档而不是原始查询用于嵌入查找。

# load documents, build index
documents = SimpleDirectoryReader("../paul_graham_essay/data").load_data()
index = VectorStoreIndex(documents)

# run query with HyDE query transform
query_str = "what did paul graham do after going to RISD"
hyde = HyDEQueryTransform(include_original=True)
query_engine = index.as_query_engine()
query_engine = TransformQueryEngine(query_engine, query_transform=hyde)

response = query_engine.query(query_str)
print(response)

查看 LlamaIndex 的查询转换手册[17],了解所有详细信息。

另外,请查看 Iulia Brezeanu 撰写的这篇精彩文章《改进 RAG 的高级查询转换》[18],了解有关查询转换技术的详细信息。

以上痛点均来自论文。现在,让我们探讨一下 RAG 开发中常见的另外五个痛点,以及它们提出的解决方案。

痛点 8:数据摄取的可扩展性

RAG 流水线中的数据摄取可伸缩性问题是指当系统难以有效管理和处理大量数据时出现的挑战,从而导致性能瓶颈和潜在的系统故障。这样的数据摄取可伸缩性问题可能会导致摄取时间延长、系统过载、数据质量问题和可用性有限。

并行化摄取管道

LlamaIndex 提供摄取管道并行处理,这一功能使 LlamaIndex 中的文档处理速度提高了 15 倍。 请参阅下面的示例代码片段,了解如何创建 IngestionPipeline 并指定 num_workers 以调用并行处理。查看 LlamaIndex 的完整笔记本[19]了解更多详情。

# load data
documents = SimpleDirectoryReader(input_dir="./data/source_files").load_data()

# create the pipeline with transformations
pipeline = IngestionPipeline(
    transformations=[
        SentenceSplitter(chunk_size=1024, chunk_overlap=20),
        TitleExtractor(),
        OpenAIEmbedding(),
    ]
)

# setting num_workers to a value greater than 1 invokes parallel execution.
nodes = pipeline.run(documents=documents, num_workers=4)


推荐新闻
RAG系列04:使用ReRank进行重排序
本文介绍了重排序的原理和两种主流的重排序方法:基于重排模型和基于 LLM。文章指出,重排序是对检索到的上下文进行再次筛选的过程,类似于排序过程中的粗排和精排。在检索增强生成中,精排的术语就叫重排序。文章还介绍了使用 Cohere 提供的在线模型、bge-reranker-base 和 bge-reranker-large 等开源模型以及 LLM 实现重排序的方法。最后,文章得出结论:使用重排模型的方法轻量级、开销较小;而使用 LLM 的方法在多个基准测试上表现良好,但成本较高,且只有在使用 ChatGPT 和 GPT-4 时表现良好,如使用其他开源模型,如 FLAN-T5 和 Vicuna-13B 时,其性能就不那么理想。因此,在实际项目中,需要做出特定的权衡。
LangGPT论文:面向大语言模型的自然语言编程框架(中文版)
大语言模型 (Large Language Models, LLMs) 在不同领域都表现出了优异的性能。然而,对于非AI专家来说,制定高质量的提示来引导 LLMs 是目前AI应用领域的一项重要挑战。
第三篇:要真正入门AI,OpenAI的官方Prompt工程指南肯定还不够,您必须了解的强大方法论和框架!!!
自从ChatGPT(全名:Chat Generative Pre-trained Transformer)于2022年11月30日发布以来,一个新兴的行业突然兴起,那就是提示工程(Prompt engineering),可谓如日冲天。从简单的文章扩写,到RAG,ChatGPT展现了前所未有的惊人能力。
(三)12个RAG痛点及其解决方案
痛点9:结构化数据QA 痛点10:从复杂 PDF 中提取数据 痛点11:后备模型 痛点12:LLM安全
(一)12个RAG痛点及其解决方案
痛点1:内容缺失 痛点2:错过关键文档 痛点3:不在上下文中——整合策略的局限性 痛点4:没有获取正确内容

联系我们

售前咨询
186 6662 7370
产品演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询