链载Ai

标题: (二)12个RAG痛点及其解决方案 [打印本页]

作者: 链载Ai    时间: 昨天 20:33
标题: (二)12个RAG痛点及其解决方案

痛点 5:格式错误

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

更好的提示词

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

输出解析

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

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

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

fromllama_indeximportVectorStoreIndex,SimpleDirectoryReader
fromllama_index.output_parsersimportLangchainOutputParser
fromllama_index.llmsimportOpenAI
fromlangchain.output_parsersimportStructuredOutputParser,ResponseSchema

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

#defineoutputschema
response_schemas=[
ResponseSchema(
name="Education",
description="Describestheauthor'seducationalexperience/background.",
),
ResponseSchema(
name="Work",
description="Describestheauthor'sworkexperience/background.",
),
]

#defineoutputparser
lc_output_parser=StructuredOutputParser.from_response_schemas(
response_schemas
)
output_parser=LangchainOutputParser(lc_output_parser)

#AttachoutputparsertoLLM
llm=OpenAI(output_parser=output_parser)

#obtainastructuredresponse
fromllama_indeximportServiceContext

ctx=ServiceContext.from_defaults(llm=llm)

query_engine=index.as_query_engine(service_context=ctx)
response=query_engine.query(
"Whatareafewthingstheauthordidgrowingup?",
)
print(str(response))

Pydantic 程序

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

OpenAI JSON 模式

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

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

痛点 6:不正确的特异性

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

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

高级检索策略

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

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

痛点 7:不完整

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

查询转换

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

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

#loaddocuments,buildindex
documents=SimpleDirectoryReader("../paul_graham_essay/data").load_data()
index=VectorStoreIndex(documents)

#runquerywithHyDEquerytransform
query_str="whatdidpaulgrahamdoaftergoingtoRISD"
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]了解更多详情。

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

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

#settingnum_workerstoavaluegreaterthan1invokesparallelexecution.
nodes=pipeline.run(documents=documents,num_workers=4)







欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5