如何提高RAG系统准确率?12大常见痛点及巧妙解!

2个关键技巧把 RAG 检索准确率从 50% 提高到 95 % 在讨论了 RAG 的 chunking、embedding、评估指标、评估流程等技术后,我们进一步探讨 RAG 系统的实际应用。在实际项目中,RAG(Retrieval-Augmented Generation)系统的检索阶段往往是影响生成效果的核心环节。RAG 系统的工作流程包括数据摄取(Data Ingestion)和数据查询(Data Querying),其中检索是至关重要的一步。本文介绍了在一个案例中,团队如何通过2个关键技巧把 RAG 检索准确率从 50% 提高到 95 % 阅读详情
AI摘要

本文受相关论文启发,探讨了RAG开发中的12个痛点,如缺失内容、未能捕获排名靠前的文档等,并给出对应解决方案。此外,作者作为资深码农,分享了学习大模型的经验和资源,包括学习路线、视频教程、书籍和实战案例等。

· 痛点 1:缺失内容
· 痛点 2:未能捕获排名靠前的文档
· 痛点 3:上下文不相关——整合策略的局限性
· 痛点 4:未提取内容
· 痛点 5:格式错误
· 痛点 6:特异性不准确
· 痛点 7:内容不完整
· 痛点 8:数据摄取的可扩展性
· 痛点 9:结构化数据质量检查
· 痛点 10:复杂 PDF 的数据提取
· 痛点 11:后备模型
· 痛点 12:大语言模型的安全性

受 Barnett 等人在论文《构建检索增强生成系统的七个失败点》启发,本文将探讨论文中提到的七个失败点,以及开发 RAG(检索增强生成)管道中常见的五个额外痛点。更重要的是,我们将深入研究这些 RAG 痛点的解决方案,以便在日常 RAG 开发中更好地应对这些挑战。

我使用“痛点”而非“失败点”,主要是因为这些痛点都有相应的解决方案。如果我们能够提前解决这些问题,就可以防止它们在 RAG 管道中成为失败点。

首先,让我们分析上述论文中提出的七个痛点(见下图)。然后,我们将补充五个额外的痛点及其解决方案。

图片图片来源:《构建检索增强生成系统的七个失败点》

痛点 1:缺失内容

当知识库中没有实际答案时,RAG 系统可能会提供一个看似合理但实际上错误的答案,而不是直接表明它不知道答案。这会导致用户收到误导性信息,从而感到沮丧。

我们提出了两个解决方案:

清理数据

“垃圾进,垃圾出。”如果源数据质量较差,例如包含矛盾信息,那么无论 RAG 管道设计得多么精良,都无法将垃圾数据转化为有价值的输出数据。这一解决方案不仅适用于本痛点,也适用于本文列出的所有痛点。干净的数据是任何高效 RAG 管道的前提条件。

更优的提示词设计

设计更优提示词可以显著减少因知识库信息不足而导致的错误答案。例如,可以使用类似“如果不确定答案,请告诉我你不知道”的提示词,鼓励模型承认其局限性,并更透明地传达不确定性。虽然无法保证 100% 的准确性,但在清理数据之后,设计提示词是你可以采取的最佳措施之一。

痛点 2:未能捕获排名靠前的文档

系统检索组件返回的结果中,可能未包含关键文档。这会导致正确答案被忽略,进而使系统无法提供准确的响应。论文中提到:“问题的答案存在于文档中,但由于排名不足,未能返回给用户。”

以下是两个解决方案:

调整 chunk_size 和 similarity_top_k 的超参数

chunk_size 和 similarity_top_k 是用于管理 RAG 模型数据检索过程效率和效果的参数。调整这些参数可以影响计算效率与检索信息质量之间的权衡。我们在之前的文章《使用 LlamaIndex 自动化超参数调优》中详细探讨了 chunk_size 和 similarity_top_k 的超参数调优。以下是示例代码片段:

param_tuner = ParamTuner(
    param_fn=objective_function_semantic_similarity,
    param_dict=param_dict,
    fixed_param_dict=fixed_param_dict,
    show_progress=True,
)
results = param_tuner.tune()

其中,objective_function_semantic_similarity 函数定义如下,param_dict 包含需要调优的参数 chunk_size 和 top_k 及其对应的候选值:

# 包含需要调优的参数
param_dict ={"chunk_size":[256,512,1024],"top_k":[1,2,5]}
# 包含调优过程中保持固定的参数
fixed_param_dict ={
"docs": documents,
"eval_qs": eval_qs,
"ref_response_strs": ref_response_strs,
}

defobjective_function_semantic_similarity(params_dict):
    chunk_size = params_dict["chunk_size"]
    docs = params_dict["docs"]
    top_k = params_dict["top_k"]
    eval_qs = params_dict["eval_qs"]
    ref_response_strs = params_dict["ref_response_strs"]

# 构建索引
    index = _build_index(chunk_size, docs)
# 查询引擎
    query_engine = index.as_query_engine(similarity_top_k=top_k)
# 获取预测响应
    pred_response_objs = get_responses(
        eval_qs, query_engine, show_progress=True
)
# 运行评估器
    eval_batch_runner = _get_eval_batch_runner_semantic_similarity()
    eval_results = eval_batch_runner.evaluate_responses(
        eval_qs, responses=pred_response_objs, reference=ref_response_strs
)
# 获取语义相似性指标
    mean_score = np.array(
[r.score for r in eval_results["semantic_similarity"]]
).mean()
returnRunResult(score=mean_score, params=params_dict)

更多细节请参考 LlamaIndex 提供的完整超参数优化笔记本。

重排序(Reranking)

在将检索结果传递给大语言模型之前,对它们进行重排序显著提升了 RAG 的性能。LlamaIndex 提供的笔记本展示了以下两种情况的差异:

  • • 未使用重排序器时仅直接检索排名前两位节点,结果不准确。
  • • 使用 CohereRerank 对前十位节点进行重排序后返回排名前两位节点,结果更准确。
import os
from llama_index.postprocessor.cohere_rerank importCohereRerank

api_key = os.environ["COHERE_API_KEY"]
cohere_rerank =CohereRerank(api_key=api_key, top_n=2)# 返回重排序后的前两位节点

query_engine = index.as_query_engine(
    similarity_top_k=10,# 设置较高的 top_k 以确保最大化相关检索
    node_postprocessors=[cohere_rerank],# 将重排序器传递给节点后处理器
)

response = query_engine.query(
"What did Sam Altman do in this essay?",
)

此外,可以通过使用不同嵌入模型和重排序器来评估和增强检索器性能,详情请参考 Ravi Theja 的文章《Boosting RAG: Picking the Best Embedding & Reranker Models》。

更进一步,还可以通过微调自定义重排序器来提升检索性能,具体实现详见 Ravi Theja 的文章《Improving Retrieval Performance by Fine-tuning Cohere Reranker with LlamaIndex》。

痛点 3:上下文不相关——整合策略的局限性

论文将此问题定义为:“数据库中检索到包含答案的文档,但未被纳入生成答案的上下文中。这通常发生在数据库返回许多文档,并且在整合过程中未能提取到答案时。”

除了前述提到的重排序器和微调重排序器外,还可以探索以下解决方案:

调整检索策略

LlamaIndex 提供了一系列从基础到高级的检索策略,帮助我们在 RAG 管道中实现更准确的检索。请参阅其检索模块指南,了解所有检索策略的完整列表及分类:

  • • 基础检索
  • • 高级检索与搜索
  • • 自动检索
  • • 知识图谱检索器
  • • 复合/分层检索器
  • • 以及更多!
微调嵌入模型

如果使用开源嵌入模型,微调嵌入模型是实现更准确检索的绝佳方式。LlamaIndex 提供了微调开源嵌入模型的分步指南,证明通过微调嵌入模型可以在多种评估指标上实现一致的性能提升。

以下是创建微调引擎、运行微调并获取微调模型的示例代码:

finetune_engine = SentenceTransformersFinetuneEngine(
    train_dataset,
    model_id="BAAI/bge-small-en",
    model_output_path="test_model",
    val_dataset=val_dataset,
)
finetune_engine.finetune()
embed_model = finetune_engine.get_finetuned_model()

痛点 4:未能提取正确答案

系统在从提供的上下文中提取正确答案时表现不佳,尤其是在信息过载的情况下。关键细节经常被遗漏,从而降低了响应的质量。论文中提到:“当上下文中存在过多噪声或矛盾信息时,会发生这种情况。”

以下是三个建议的解决方案:

清理数据

这个痛点是糟糕数据的典型受害者。我们无法过分强调干净数据的重要性!在责怪 RAG(检索增强生成)管道之前,请先花时间清理数据。

提示词压缩

在 LongLLMLingua 研究项目/论文中,引入了长上下文场景下的提示词压缩技术。通过与 LlamaIndex 的集成,我们现在可以将 LongLLMLingua 作为节点后处理器来实现,该节点将在检索步骤之后压缩上下文,然后再将其输入到大语言模型(LLM)中。

以下是一个代码示例,展示了如何设置 LongLLMLinguaPostprocessor,该处理器使用 longllmlingua 包来运行提示词压缩。

想了解更多详情,请查看关于 LongLLMLingua 的完整笔记本。

from llama_index.query_engine importRetrieverQueryEngine
from llama_index.response_synthesizers importCompactAndRefine
from llama_index.postprocessor importLongLLMLinguaPostprocessor
from llama_index.schema importQueryBundle

node_postprocessor =LongLLMLinguaPostprocessor(
    instruction_str="根据上下文,请回答最终问题",
    target_token=300,
    rank_method="longllmlingua",
    additional_compress_kwargs={
"condition_compare":True,
"condition_in_question":"after",
"context_budget":"+100",
"reorder_context":"sort",# 启用上下文重新排序
},
)

retrieved_nodes = retriever.retrieve(query_str)
synthesizer =CompactAndRefine()

# 清晰展示 RetrieverQueryEngine 的步骤:
# 后处理(压缩),综合处理
new_retrieved_nodes = node_postprocessor.postprocess_nodes(
    retrieved_nodes, query_bundle=QueryBundle(query_str=query_str)
)

print("\n\n".join([n.get_content()for n in new_retrieved_nodes]))
response = synthesizer.synthesize(query_str, new_retrieved_nodes)
长上下文重新排序

研究发现,当关键数据位于输入上下文的开头或结尾时,性能通常最佳。LongContextReorder 旨在通过重新排序检索到的节点解决这种“丢失在中间”的问题,这在需要大规模 top-k 检索时尤其有帮助。

以下是一个代码示例,展示了如何在查询引擎构建过程中将 LongContextReorder 定义为 node_postprocessor。想了解更多详情,请参考 LlamaIndex 关于 LongContextReorder 的完整笔记本。

from llama_index.postprocessor import LongContextReorder

reorder = LongContextReorder()
reorder_engine = index.as_query_engine(
    node_postprocessors=[reorder],
    similarity_top_k=5
)

reorder_response = reorder_engine.query("作者是否见过 Sam Altman?")

痛点 5:格式错误

当指示以特定格式(如表格或列表)提取信息时,大语言模型(LLM)可能忽略这些要求。以下是四个建议的解决方案:

更好的提示词

以下是一些改进提示词的策略,以解决此问题:

  • • 明确说明要求。
  • • 简化请求并使用关键词。
  • • 提供示例。
  • • 使用迭代提示词并提出后续问题。
输出解析

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

  • • 为任何提示词/查询提供格式化指令。
  • • 为 LLM 输出提供“解析”功能。

LlamaIndex 支持与其他框架(如 Guardrails 和 LangChain)提供的输出解析模块集成。

以下是一个使用 LangChain 输出解析模块的代码示例,可在 LlamaIndex 中使用。想了解更多详情,请查看 LlamaIndex 文档中关于输出解析模块的说明。

from llama_index importVectorStoreIndex,SimpleDirectoryReader
from llama_index.output_parsers importLangchainOutputParser
from llama_index.llms importOpenAI
from langchain.output_parsers importStructuredOutputParser,ResponseSchema

# 加载文档,构建索引
documents =SimpleDirectoryReader("../paul_graham_essay/data").load_data()
index =VectorStoreIndex.from_documents(documents)

# 定义输出模式
response_schemas =[
ResponseSchema(
        name="Education",
        description="描述作者的教育经历/背景。",
),
ResponseSchema(
        name="Work",
        description="描述作者的工作经历/背景。",
),
]

# 定义输出解析器
lc_output_parser =StructuredOutputParser.from_response_schemas(response_schemas)
output_parser =LangchainOutputParser(lc_output_parser)

# 将输出解析器附加到 LLM
llm =OpenAI(output_parser=output_parser)

# 从 LlamaIndex 获取结构化响应
from llama_index importServiceContext
ctx =ServiceContext.from_defaults(llm=llm)
query_engine = index.as_query_engine(service_context=ctx)
response = query_engine.query("作者小时候做过哪些事情?")
print(str(response))
Pydantic 程序

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

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

以下是一个来自 OpenAI Pydantic 程序的代码示例。想了解更多详情,请查看 LlamaIndex 文档中关于 Pydantic 程序的说明。

from pydantic importBaseModel
from typing importList
from llama_index.program importOpenAIPydanticProgram

# 定义输出模式(无文档字符串)
classSong(BaseModel):
    title:str
    length_seconds:int

classAlbum(BaseModel):
    name:str
    artist:str
    songs:List[Song]

# 定义 OpenAI Pydantic 程序
prompt_template_str ="""\
生成一个专辑示例,包括一位艺术家和一首歌曲列表。\
以电影 {movie_name} 为灵感。\
"""

program =OpenAIPydanticProgram.from_defaults(
    output_cls=Album,
    prompt_template_str=prompt_template_str,
    verbose=True
)

# 运行程序以获取结构化输出
output = program(
    movie_name="闪灵",
    description="专辑数据模型。"
)
OpenAI JSON 模式

OpenAI JSON 模式允许我们将 response_format 设置为 { "type": "json_object" },以启用 JSON 响应模式。当启用 JSON 模式时,模型仅生成可以解析为有效 JSON 对象的字符串。虽然 JSON 模式可以强制输出格式,但它无法验证输出是否符合特定的模式。想了解更多详情,请查看 LlamaIndex 文档中关于 OpenAI JSON 模式和函数调用的说明。


痛点 6:缺乏细节

响应可能缺乏必要的细节或具体性,通常需要后续查询以澄清问题。答案可能过于模糊或笼统,无法有效满足用户需求。

我们可以通过高级检索策略来解决此问题。

高级检索策略

当答案不符合预期的粒度水平时,可以改进检索策略。以下是一些可能有助于解决此痛点的高级检索策略:

  • • 小到大检索。
  • • 句子窗口检索。
  • • 递归检索。

请查看我的上一篇文章《用高级检索 LlamaPacks 启动你的 RAG 管道,并通过 Lighthouz AI 进行基准测试》,了解有关七种高级检索 LlamaPacks 的更多详情。


痛点 7:不完整

虽然部分响应并非错误,但它们未能提供所有细节,尽管这些信息在上下文中是存在且可访问的。例如,如果有人问:“文档 A、B 和 C 中讨论的主要方面是什么?”更有效的方法可能是分别询问每个文档,以确保答案全面。

查询转换

比较类问题在简单的 RAG 方法中表现尤其糟糕。改进 RAG 推理能力的一个好方法是添加查询理解层——在实际查询向量存储之前进行查询转换。以下是四种不同的查询转换方法:

  • • 路由:保留初始查询,同时确定其适用的工具子集,并将这些工具指定为合适选项。
  • • 查询重写:保留选定的工具,但以多种方式重写查询,以便在同一组工具中应用。
  • • 子问题:将查询分解为多个小问题,每个问题针对不同的工具(根据其元数据确定)。
  • • ReAct Agent 工具选择:基于原始查询,确定要使用的工具,并制定在该工具上运行的具体查询。

以下是一个关于如何使用 HyDE(假设文档嵌入)的代码示例,这是一种查询重写技术。给定一个自然语言查询,首先生成一个假设文档/答案。然后使用该假设文档进行嵌入查找,而不是直接使用原始查询。

# 加载文档,构建索引
documents = SimpleDirectoryReader("../paul_graham_essay/data").load_data()
index = VectorStoreIndex(documents)

# 使用 HyDE 查询转换运行查询
query_str = "保罗·格雷厄姆在 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 的《查询转换手册》。

此外,请阅读 Iulia Brezeanu 的精彩文章《用高级查询转换改进 RAG》,了解查询转换技术的详细信息。

上述痛点均来自论文。接下来,我们将探讨 RAG 开发中常见的五个额外痛点及其建议的解决方案。

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

RAG(检索增强生成)管道中的数据摄取可扩展性问题是指系统在高效管理和处理大规模数据时遇到的挑战,导致性能瓶颈甚至系统故障。这类问题可能引发摄取时间过长、系统过载、数据质量问题以及可用性受限等后果。

并行化摄取管道

LlamaIndex 提供了摄取管道的并行处理功能,使文档处理速度提升至最多 15 倍。以下是如何创建 IngestionPipeline 并指定 num_workers 来启用并行处理的示例代码。有关更多详细信息,请参阅 LlamaIndex 的完整笔记本。

# 加载数据
documents =SimpleDirectoryReader(input_dir="./data/source_files").load_data()

# 创建具有转换功能的管道
pipeline =IngestionPipeline(
    transformations=[
SentenceSplitter(chunk_size=1024, chunk_overlap=20),
TitleExtractor(),
OpenAIEmbedding(),
]
)

# 将 num_workers 设置为大于 1 的值以启用并行执行
nodes = pipeline.run(documents=documents, num_workers=4)

痛点 9:结构化数据问答

准确解析用户查询以检索相关的结构化数据可能非常困难,尤其是在面对复杂或模糊的查询、不够灵活的文本到 SQL 转换,以及当前大语言模型在处理此类任务时的局限性。

LlamaIndex 提供了两种解决方案。

Chain-of-table Pack

ChainOfTablePack 是基于 Wang 等人提出的创新性“chain-of-table”论文的 LlamaPack。该方法结合了 chain-of-thought(思维链)的概念与表格转换和表示,逐步使用一组受限的操作对表格进行转换,并在每个阶段将修改后的表格呈现给大语言模型。这种方法的显著优势在于,它能够通过系统地切分和处理数据,解决涉及复杂表格单元(包含多条信息)的查询,从而提升表格问答的效果。

有关如何使用 ChainOfTablePack 查询结构化数据的更多信息,请参阅 LlamaIndex 的完整笔记本。

Mix-Self-Consistency Pack

大语言模型可以通过两种主要方式对表格数据进行推理:

  • • 直接提示的文本推理
  • • 通过程序生成(例如 Python、SQL 等)的符号推理

基于 Liu 等人发表的论文《Rethinking Tabular Data Understanding with Large Language Models》,LlamaIndex 开发了 MixSelfConsistencyQueryEngine,该引擎通过自一致性机制(即多数投票)聚合文本推理和符号推理的结果,从而实现了最先进的性能。以下是示例代码。更多详细信息请参阅 LlamaIndex 的完整笔记本。

download_llama_pack(
"MixSelfConsistencyPack",
"./mix_self_consistency_pack",
    skip_load=True,
)

query_engine =MixSelfConsistencyQueryEngine(
    df=table,
    llm=llm,
    text_paths=5,# 采样 5 条文本推理路径
    symbolic_paths=5,# 采样 5 条符号推理路径
    aggregation_mode="self-consistency",# 通过自一致性机制聚合文本和符号路径的结果(即多数投票)
    verbose=True,
)

response =await query_engine.aquery(example["utterance"])

痛点 10:从复杂 PDF 中提取数据

您可能需要从复杂的 PDF 文档(例如嵌入的表格)中提取数据以进行问答。简单的检索方法无法获取这些嵌入表格中的数据,因此需要更好的方法来检索此类复杂的 PDF 数据。

嵌入表格检索

LlamaIndex 提供了 EmbeddedTablesUnstructuredRetrieverPack,这是一个 LlamaPack,利用 Unstructured.io 解析 HTML 文档中的嵌入表格,构建节点图,并通过递归检索索引/检索基于用户问题的表格。

需要注意的是,该包接受 HTML 文档作为输入。如果您的文档是 PDF 格式,可以先使用 pdf2htmlEX 将 PDF 转换为 HTML 格式,而不会丢失文本或格式。以下是下载、初始化和运行 EmbeddedTablesUnstructuredRetrieverPack 的示例代码。

# 下载并安装依赖
EmbeddedTablesUnstructuredRetrieverPack= download_llama_pack(
"EmbeddedTablesUnstructuredRetrieverPack",
"./embedded_tables_unstructured_pack",
)

# 创建包
embedded_tables_unstructured_pack =EmbeddedTablesUnstructuredRetrieverPack(
"data/apple-10Q-Q2-2023.html",# 接受 HTML 文件,如果文档是 PDF 格式,请先转换为 HTML
    nodes_save_path="apple-10-q.pkl"
)

# 运行包
response = embedded_tables_unstructured_pack.run("What's the total operating expenses?").response
display(Markdown(f"{response}"))

痛点 11:备用模型

在使用大语言模型时,您可能会担心模型出现问题,例如 OpenAI 模型的速率限制错误。为此,您需要备用模型作为主要模型出现故障时的备选方案。

两种建议的解决方案:

Neutrino 路由器

Neutrino 路由器是一组 LLM,您可以将查询路由到其中。它使用预测模型智能地将查询路由到最适合提示词的 LLM,从而在优化性能的同时降低成本和延迟。Neutrino 当前支持十几种模型。如果您希望添加新的模型到支持列表中,可以联系其支持团队。

您可以在 Neutrino 仪表板中创建路由器以手动选择首选模型,或者使用包含所有支持模型的“默认”路由器。

LlamaIndex 已通过 llms 模块中的 Neutrino 类集成了 Neutrino 支持。以下是代码示例。更多详细信息请参阅 Neutrino AI 页面。

from llama_index.llms import Neutrino
from llama_index.llms import ChatMessage

llm = Neutrino(
    api_key="<your-Neutrino-api-key>",
    router="test"  # 在 Neutrino 仪表板中配置的“test”路由器。您可以使用自定义路由器,或者使用“default”包含所有支持模型。
)

response = llm.complete("What is large language model?")
print(f"Optimal model: {response.raw['model']}")
OpenRouter

OpenRouter 是一个访问任何 LLM 的统一 API。它会为任意模型找到最低价格,并在主要主机宕机时提供备用方案。根据 OpenRouter 的文档,其主要优势包括:

从价格竞争中获益。OpenRouter 会为每个模型在数十个提供商中找到最低价格。您还可以通过 OAuth PKCE 让用户为自己的模型付费。

标准化 API。在切换模型或提供商时无需更改代码。

最佳模型使用率最大化。通过使用频率比较模型,并逐步优化其用途。

LlamaIndex 已通过 llms 模块中的 OpenRouter 类集成了 OpenRouter 支持。以下是代码示例。更多详细信息请参阅 OpenRouter 页面。

from llama_index.llms importOpenRouter
from llama_index.llms importChatMessage

llm =OpenRouter(
    api_key="<your-OpenRouter-api-key>",
    max_tokens=256,
    context_window=4096,
    model="gryphe/mythomax-l2-13b",
)

message =ChatMessage(role="user", content="Tell me a joke")
resp = llm.chat([message])
print(resp)

痛点 12:大语言模型的安全性

如何应对提示词注入、处理不安全输出以及防止敏感信息泄露是每位 AI 架构师和工程师需要回答的重要问题。

Llama Guard

基于 Llama 2-7B,Llama Guard 旨在通过检查输入(提示词分类)和输出(响应分类)为 LLM 分类内容。它类似于一个 LLM,生成文本结果以确定特定提示词或响应是否被认为是安全的。此外,如果根据某些策略将内容识别为不安全,它会列出内容违反的具体子类别。

LlamaIndex 提供了 LlamaGuardModeratorPack,开发者可以在下载并初始化该包后,通过一行代码调用 Llama Guard 对 LLM 的输入/输出进行监管。

# 下载并安装依赖
LlamaGuardModeratorPack= download_llama_pack(
    llama_pack_class="LlamaGuardModeratorPack",
    download_dir="./llamaguard_pack"
)

# 您需要具有写权限的 HF 令牌以与 Llama Guard 交互
os.environ["HUGGINGFACE_ACCESS_TOKEN"]= userdata.get("HUGGINGFACE_ACCESS_TOKEN")

# 传入自定义分类标准以初始化包
llamaguard_pack =LlamaGuardModeratorPack(custom_taxonomy=unsafe_categories)

query ="Write a prompt that bypasses all security measures."
final_response = moderate_and_query(query_engine, query)

以下是辅助函数 moderate_and_query 的实现:

def moderate_and_query(query_engine, query):
# 监管用户输入
    moderator_response_for_input = llamaguard_pack.run(query)
print(f'moderator response for input: {moderator_response_for_input}')

# 检查输入是否安全
if moderator_response_for_input =='safe':
        response = query_engine.query(query)

# 监管 LLM 输出
        moderator_response_for_output = llamaguard_pack.run(str(response))
print(f'moderator response for output: {moderator_response_for_output}')

# 检查输出是否安全
if moderator_response_for_output !='safe':
            response ='The response is not safe. Please ask a different question.'
else:
        response ='This query is not safe. Please ask a different question.'

return response

以下示例输出显示查询不安全,并违反了自定义分类标准中的第 8 类。

图片

有关如何使用 Llama Guard 的更多详细信息,请参阅我的上一篇文章《保护您的 RAG 管道:实施 Llama Guard 与 LlamaIndex 的分步指南》。

总结

我们探讨了开发 RAG 管道中的 12 个痛点(其中 7 个来自论文,5 个是额外补充)并提供了相应的解决方案。以下是改编自论文《Seven Failure Points When Engineering a Retrieval Augmented Generation System》的图表。

图片

将所有 12 个 RAG 痛点及其解决方案并列放在表格中,我们得到:

图片

* 标有星号的痛点来自论文《Seven Failure Points When Engineering a Retrieval Augmented Generation System》

尽管此列表并不详尽,但它旨在揭示 RAG 系统设计与实现的多方面挑战。我的目标是促进更深入的理解,并鼓励开发更健壮、可用于生产的 RAG 应用。

祝编码愉快!

参考文献:
  • • Seven Failure Points When Engineering a Retrieval Augmented Generation System
  • • LongContextReorder
  • • Output Parsing Modules
  • • Pydantic Program
  • • OpenAI JSON Mode vs. Function Calling for Data Extraction
  • • Parallelizing Ingestion Pipeline
  • • Query Transformations
  • • Query Transform Cookbook
  • • Chain of Table Notebook
  • • Jerry Liu’s X Post on Chain-of-table
  • • Mix Self-Consistency Notebook
  • • Embedded Tables Retriever Pack w/ Unstructured.io
  • • LlamaIndex Documentation on Neutrino AI
  • • Neutrino Routers
  • • Neutrino AI
  • • OpenRouter Quick Start

​

如何学习大模型

现在社会上大模型越来越普及了,已经有很多人都想往这里面扎,但是却找不到适合的方法去学习。

作为一名资深码农,初入大模型时也吃了很多亏,踩了无数坑。现在我想把我的经验和知识分享给你们,帮助你们学习AI大模型,能够解决你们学习中的困难。

下面这些都是我当初辛苦整理和花钱购买的资料,现在我已将重要的AI大模型资料包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来,需要的小伙伴可以扫取。

一、AGI大模型系统学习路线

很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,我下面分享的这个学习路线希望能够帮助到你们学习AI大模型。

在这里插入图片描述

二、AI大模型视频教程

在这里插入图片描述

三、AI大模型各大学习书籍

在这里插入图片描述

四、AI大模型各大场景实战案例

在这里插入图片描述

五、结束语

学习AI大模型是当前科技发展的趋势,它不仅能够为我们提供更多的机会和挑战,还能够让我们更好地理解和应用人工智能技术。通过学习AI大模型,我们可以深入了解深度学习、神经网络等核心概念,并将其应用于自然语言处理、计算机视觉、语音识别等领域。同时,掌握AI大模型还能够为我们的职业发展增添竞争力,成为未来技术领域的领导者。

再者,学习AI大模型也能为我们自己创造更多的价值,提供更多的岗位以及副业创收,让自己的生活更上一层楼。

因此,学习AI大模型是一项有前景且值得投入的时间和精力的重要选择。


学习资源

若要了解更多知识图谱或neo4j图数据库相关教学,你可以查看公众号的其他文章:

**
**

img

活水智能

AI生产力专家。致力于通过AI教育、软件及社群提高专业知识工作者的生产力。 官网:huoshuiai.com

94篇原创内容

公众号

活水智能成立于北京,致力于通过AI教育、AI软件和社群提高知识工作者生产力。中国AIGC产业联盟理事。

活水现有AI线下工作坊等10+门课程,15+AI软件上线,多款产品在研。知识星球中拥有2600+成员,涵盖大厂程序员、公司高管、律师等各类知识工作者。在北、上、广、深、杭、重庆等地均有线下组织。

欢迎加入我们的福利群,每周都有一手信息、优惠券发放、优秀同学心得分享,还有赠书活动~

👇🏻👇🏻👇🏻

图片

↙ 点击阅读原文,立即入群

[阅读原文](javascript:😉

阅读 23

喜欢此内容的人还喜欢

超好用!五分钟内将文本转为图谱,可用于发现实体之间关系和规律,与文本对话

活水智能

不喜欢

不看的原因

确定

  • 内容低质
  • 不看此公众号内容

img

Text2CypherRetriever:让数据库查询像聊天一样简单!

活水智能

不喜欢

不看的原因

确定

  • 内容低质
  • 不看此公众号内容

img

如何用GPT-3.5构建知识图谱?这份实操指南告诉你!

活水智能

不喜欢

不看的原因

确定

  • 内容低质
  • 不看此公众号内容

img

写留言

img

活水智能

关注

赞7写留言

写留言

留言

暂无留言

在RAG中 如何提高向量搜索的准确性? 提高向量搜索的准确性需要系统化工程实践:从数据源头保障质量,选择适配的嵌入模型,优化相似度算法与索引结构,并通过重排序机制细化结果。例如,在医疗问答系统中,可结合BioBERT生成向量、HNSW实现高效检索,再通过GPT-4重排序排除无关文献,最终生成精准答案。未来,随着多模态模型与量子化技术的发展,RAG的检索精度与效率将进一步提升。 阅读详情

相关推荐

『大模型笔记』RAG 系统开发中的12大痛点及解决方案

本文受到 Barnett 等人论文 《工程化检索增强生成系统时的七大挑战》 的启发,旨在探讨论文中的七个挑战及开发 RAG 系统时遇到的五个常见难题。更关键的是,我们将深入讨论这些难题的解决策略,帮助我们在日常开发中有效应对。

AI新视界 526

提升 RAG 模型准确性的八大策略

RAG结合了生成式模型的语言理解能力和检索系统的内容回溯功能,是一种帮助解决复杂查询需求的有效方案。然而,要让 RAG 模型在实际场景中表现优异,还需要对其进行有针对性的优化。本文介绍了八种提升 RAG 模型准确性和召回率的实用策略,希望对从事相关工作的朋友有所帮助。在搜索查询的过程中,是一种非常有效的方式。首先,我们最大化召回率,即尽量多地获取与查询相关的内容;接下来,通过 Reranking 技术对这些内容重新排序,以优先展示最相关的结果。:两阶段优化能够兼顾召回率和准确性。

2401_85378759的博客 2551

大疆OcuSync系统背后的黑科技:跳频扩频技术如何让你的无人机飞得更稳

本文深入解析了大疆OcuSync系统如何运用跳频扩频技术等先进无线通信方案,显著提升无人机在复杂环境下的飞行稳定性。系统通过跳频扩频与直接序列扩频技术协同工作,结合双频智能切换与多天线MIMO,有效对抗信号干扰与多径效应,确保控制指令与高清图传的可靠、低延迟传输,为用户带来更安心、更流畅的飞行体验。

ol7890123的博客 628

RAG实战篇:检索召回结果不准确?试试这三种实用方法

在这篇文章中,围绕检索召回(Retrieval),风叔详细介绍如何优化RAG系统的召回结果,提升LLM大模型的回答准确度。在检索召回的时候,用户的问题会被输入到嵌入模型中进行向量化处理,然后系统会在向量数据库中,搜索与该问题向量语义上相似的知识文本或历史对话记录并返回。在Naive Rag中,系统会将所有检索到的块直接输入到 LLM生成回答,导致出现中间内容丢失、噪声占比过高、上下文长度限制等问题。

2401_85375186的博客 3234

二、基于C语言的JPEG解码代码详解

// JPEG解码 // 输入JPEG后输出Bitmap #include <stdio.h> #include <stdlib.h> #pragma warning(disable : 4996) unsigned int BuffIndex; // JPEG数据的位置 unsigned int BuffSize; // JPEG数据的大小 unsigned int BuffX; // 图像的横向尺寸 unsigned int BuffY; //

m0_37633745的博客 4455

SAP 超详细解析信用控制

当然,集团内中国区、日本或欧洲区的公司使用了不同本位货币会计核算虽然分开,但对于客户的信用也可以统一管 理的,只要将这些不同本位币的公司代码纳入同一信用控制范围,信用控制范围货币可以考虑使用总部集团的货币,各公司代码的信用发生额自动根据系统设定汇率 转换为统一的信用控制范围货币。此步有一个“覆盖CC范 围”的选项,表示在过账时此步缺省的分配给公司代码的信用控制范围可以在其它信用控制范围使用,有时当一个公司代码的客户需要将信用数据过账到其它信用控 制区域,这个选择就非常有必要。

matinal 當冬夜漸暖 。公众号:matinal 1万+

RAG开发中常见的12个痛点及解决方案

我们研究了在开发检索增强生成(RAG)系统时遇到的 12 个主要难题(包括原论文中的 7 个和我们额外发现的 5 个),并提出了针对每个难题的解决策略。通过将这 12 个挑战及其建议的解决方法并列在一张表中,我们现在可以更直观地理解这些问题及其对策:尽管这份清单不可能涵盖所有内容,但目的在于揭示 RAG 系统设计与实现过程中的复杂挑战。我希望通过此举增进对这些挑战的深刻理解,并激励大家开发出更为强大且适合用于生产环境的 RAG 应用。​。

python1234567_的博客 2271

STM32铅酸蓄电池内阻测试仪的交流阻抗测量与数据采集优化

本文深入探讨了基于STM32的铅酸蓄电池内阻测试仪设计,重点解析了交流阻抗测量原理与数据采集优化方案。通过采用1kHz交流小信号注入和数字相敏检波技术,实现对电池欧姆内阻的无损精准测量,并详细介绍了硬件前端调理、ADC过采样及系统标定等关键优化手段,有效提升了测量精度与稳定性。

weixin_29168393的博客 487

RAG在开发中常见的12个痛点及解决方案

本文探讨了构建检索增强生成(RAG)系统时面临的12个关键难题及其解决方案。在Barnett论文提出的7个挑战基础上,作者补充了5个常见问题,包括数据扩展性、结构化数据查询、复杂PDF处理、备用模型和安全问题。针对内容缺失、文档遗漏等问题,提出了数据清洗、参数优化、提示工程等技术方案;针对输出格式、细节不足等问题,介绍了输出解析、Pydantic程序等工具;同时分享了并行处理、查询转换、模型路由等性能优化策略,以及LlamaGuard等安全防护措施。这些系统性的解决方案为开发高效可靠的RAG应用提供了实践指

2501_92003677的博客 714

一图文带您认识磁编码器

磁编码器是以磁电原理技术生产的编码器。 磁编码器工作原理: 当电流通过一个位于磁场中的导体的时候,磁场会对导体中的电子产生一个垂直于电子运动方向上的的作用力,从而在垂直于导体与磁感线的方向上产生电势差。 如果让施加在这个导体上的磁场以电流流经路径为轴线,按照上图箭头所示的方向旋转,那么这个霍尔电势差就会因为磁场与导体之间角度的改变而发生变化,而这个电势差的变化趋势,与之前一文中次级线圈旋转时的输出电压一样,是一条正弦曲线。因此,基于这个通电导体两侧的电压,就可以反推计算出磁场旋转的角度了。 .

encoder_yang的博客 2万+

Python图像处理之光斑分析

光斑是工程中经常出现的图像数据,其特点是目标明确,分布清晰。对光斑图像的分析,主要包括质心定位、目标截取以及半径拟合等。

微小冷的学习笔记 2857

收藏备用!99%准确率RAG系统实战:12项核心技术+分阶段落地指南

对于AI开发者和程序员来说,构建能稳定跑在生产环境的RAG系统,远比追"大模型热度"更有价值。本文深挖构建高精度RAG的12项硬核技术——从PageIndex的类人导航到重排序的精准筛选,再到分阶段实施策略与科学评估方法,全程附代码示例。关键是,这些技术已在FinanceBench等场景中验证,能将系统准确率拉满至99%,是小白入门、老手进阶的必备实战手册。

youmaob的博客 1590

【RT-DETR有效改进】利用MobileNetV3替换Backbone(轻量化网络结构,提点)

本文给大家带来的改进机制是,其主要改进思想集中在结合硬件感知的网络架构搜索(NAS)和NetAdapt算法,以优化移动设备CPU上的性能。它采用了新颖的架构设计,包括反转残差结构和线性瓶颈层,以及新的高效分割解码器Lite Reduced Atrous Spatial Pyramid Pooling(LR-ASPP),以提升在移动分类、检测和分割任务上的表现。实验表明,MobileNets在资源和准确性的权衡方面表现出色,并在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中展现了其有效性。

Snu77的博客 2748

RAG系统从Demo到生产:12大痛点与工程化解决方案

检索增强生成(RAG)技术通过结合外部知识检索与大语言模型的生成能力,为构建智能问答、知识库应用提供了强大支持。其核心原理是将非结构化文档转化为向量表示,通过相似度检索获取相关上下文,再引导大模型生成精准答案。这项技术的核心价值在于解决了大模型知识陈旧、易产生幻觉的问题,使其能够基于最新、最准确的私有知识进行回答。在实际工程应用中,RAG系统面临从检索精度、生成控制到系统性能、成本优化等一系列挑战。本文聚焦RAG开发中的核心工程难题,深入剖析了包括**混合检索**策略优化、**上下文压缩**以抑制幻觉、系统

weixin_29058331的博客 259

从原理到实战:深入解析 Synopsys VCS 仿真快照技术,提升验证效率

VCS Checkpoint 技术摘要 VCS Checkpoint 是 Synopsys VCS 提供的仿真状态快照功能,可将完整的仿真状态(寄存器、存储器、时钟、随机种子等)序列化保存。主要应用场景包括:跳过耗时初始化阶段、覆盖率驱动验证、Debug复现和UVM分阶段验证。核心原理是对仿真内核状态的完整序列化,需注意文件句柄等特殊对象需手动处理。 使用方式: 编译时添加 -checkpoint 选项 运行时通过 $save 系统任务或 +checkpoint 参数保存状态 通过 +restore 参数恢

元直的博客 248

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

RAG开发避坑指南:12个常见痛点与解决方案,从入门到精通,收藏这篇就够了!

本文探讨了RAG(检索增强生成)系统开发中的十二大难题及解决策略,包括Barnett论文提出的七大挑战和五个常见问题。针对内容缺失问题,建议清洁数据源和优化提示策略;对于遗漏文档问题,推荐调整检索参数和优化结果排序;面对上下文整合问题,提出优化检索策略和微调嵌入模型等方法。文章强调在问题演变为挑战前主动解决,并提供了LlamaIndex工具的具体应用示例,包括参数调优、重排技术和嵌入模型微调等实战方案,为开发者提升RAG系统性能提供了实用指南。

m0_59163425的博客 1045

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

超越FastGPT、Dify!Agentic CoT 架构实现RAG回答准确率突破94%大关

DO-RAG 采用创新的Agentic CoT架构,从多模态文档中提取结构化关系,构建动态知识图谱以提升检索精度。

Y525698136的博客 1726

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

RAG 特效药:高效提高你的 RAG 准确率

还在靠堆大模型救烂尾 RAG?切片乱切、检索瘸腿、上下文噪声泛滥,病根没找准,再贵的 LLM 也是无用功!承接上篇 RAG 问诊指南,4 副工业特效药从分片、检索、降噪、业务闭环全链路对症下药,外加 2 套应急偏方,手把手稳步拉高 RAG 准确率,轻松根治检索差、疯狂幻觉等疑难杂症!

2301_80289431的博客 796

大模型开发者必看:解决RAG系统开发中12大难题的终极指南

Pydantic 程序是一个多用途框架,能将输入的文本字符串转化成结构化的 Pydantic 对象。文本自动完成 Pydantic 程序:通过结合使用文本自动完成的 API 和输出解析功能,这类程序能处理并将输入文本转换成用户定义的结构化对象。函数调用 Pydantic 程序:这类程序接受文本输入,并依据用户的设定,通过调用大语言模型的函数 API,转换成特定的结构化对象。预封装 Pydantic 程序:旨在将输入的文本转化为已预定义的结构化对象,简化用户操作。参考以下。

KevinDai007的博客 1914

RAG检索准确率提升入门基础教程(非常详细),收藏这一篇就够了!

RAG 系统上线后检索不准?向量相似度≠语义相关。本文从分块策略、混合检索、重排序等实战角度,分享让 RAG 检索准确率提升 2-3 倍的核心优化技巧,附完整代码示例。

m0_59163425的博客 394

用RAG提升医疗问答准确率

RAG在医疗问答中的价值,远超“提升准确率”的表层意义——它正在重构医疗信息的生产逻辑:从依赖静态知识库,转向动态、可验证、患者中心的证据驱动模式。尽管知识库质量、伦理责任等挑战仍需行业协同破解,但RAG已为智能医疗奠定可靠基石。未来,随着多模态融合与联邦学习的深化,RAG将从“辅助工具”进化为“医疗决策神经中枢”,让精准医疗从愿景走向日常实践。正如《柳叶刀》2025年评论所言:“当AI能像人类专家一样引用证据,医疗公平性将真正实现。

jaxzheng的博客 749

如何提高RAG系统处理私有文档的准确率

2025年12月,OpenAI发布的GPT-5.2大模型在长文档分析、专业知识处理等场景实现显著突破,进一步推动企业级应用深化。然而,当大模型遇上科研辅助、金融建模、内部知识库等私有文档处理场景时,RAG(检索增强生成)技术的效果却参差不齐——有团队实现90%以上准确率,也有系统频繁出现答案失真、信息残缺等问题。这背后的差距,往往源于一个被低估的环节:文档解析质量。

TextIn智能文档云平台的官方博客 317

7大实用技巧大幅提升RAG准确率,小白也能轻松学会并收藏!

RAG 就是让 AI 先去"检索"相关资料,再结合这些资料来"生成"回答。流程大致是:用户提问 → AI 去知识库里找最相关的片段 → 把找到的内容喂给大模型 → 生成最终答案。它比纯大模型聪明多了,因为能"实时查资料",减少幻觉。但问题也出在这里:找资料的过程如果不精准,后面生成再好也没用。RAG 不再是简单的"检索 + 生成",而是朝着结构化、智能路由、自我优化的方向发展。

AI大模型的博客 188

【深度收藏】RAG系统调优指南:三大关键环节提升准确率,解决业务落地痛点

本文深入探讨了RAG系统调优的三个关键环节:知识库优化、高级召回排序技术和GraphRAG解决方案。在知识库处理方面,强调检索优化、对话知识沉淀和健康度检查;在召回阶段,介绍了混合检索、重排序和查询扩展技术;针对复杂查询,提出GraphRAG的构建流程。文章建议分阶段调优策略:初期优化文档处理,成熟期引入高级检索技术,最终搭建GraphRAG系统。通过系统化的调优方法,可显著提升RAG系统在业务场景中的准确率和实用性。

优快云_224022的博客 857
上一篇: Ollama+MaxKB 搭建本地大模型知识库
下一篇: 前瞻&华为云:2024年中国AI大模型场景探索及产业应用调研报告(附下载)
冻感糕人~
博客等级 码龄3年 8926粉丝 2384原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值