链载Ai

标题: 基于 Milvus LlamaIndex 实现高级 RAG [打印本页]

作者: 链载Ai    时间: 前天 09:54
标题: 基于 Milvus LlamaIndex 实现高级 RAG

随着大语言模型(LLM)技术的发展,RAG(Retrieval Augmented Generation)技术得到了广泛探讨和研究,越来越多的高级 RAG 检索方法也随之被人发现,相对于普通的 RAG 检索,高级 RAG 通过更深化的技术细节、更复杂的搜索策略,提供出了更准确、更相关、更丰富的信息检索结果。本文首先讨论这些技术,并基于 Milvus 给出一个实现案例。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.544px;background-color: rgb(255, 255, 255);visibility: visible;text-align: left;">

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.544px;background-color: rgb(255, 255, 255);visibility: visible;text-align: left;">ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 32px;letter-spacing: 0.544px;text-wrap: wrap;background-color: rgb(255, 255, 255);outline: 0px;">01.

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.544px;background-color: rgb(255, 255, 255);visibility: visible;text-align: left;">初级 RAG

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.544px;background-color: rgb(255, 255, 255);visibility: visible;text-align: left;">

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.544px;background-color: rgb(255, 255, 255);visibility: visible;text-align: left;">

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.544px;background-color: rgb(255, 255, 255);visibility: visible;text-align: left;">初级 RAG 研究范式代表了最早的方法论,在 ChatGPT 广泛采用后不久就取得了重要地位。初级 RAG 遵循传统的流程,包括索引创建(Indexing)、检索(Retrieval)和生成(Generation),常常被描绘成一个“检索—读取”框架,其工作流包括三个关键步骤:

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.544px;background-color: rgb(255, 255, 255);visibility: visible;text-align: left;">



初级 RAG 在三个关键领域面临着显著挑战:"检索"、"生成"和"增强"。


初级 RAG 的检索质量存在许多问题,例如低精度和低召回率等。低精度会导致检索到的块无法对齐,以及幻觉等潜在问题。低召回率会导致无法检索到所有的相关块,从而导致LLM的回复不够全面。此外,使用老旧的信息进一步加剧了问题,可能导致不准确的检索结果。


生成回复质量面临着幻觉挑战,即 LLM 生成的答案并没有基于所提供的上下文,和上下文不相关,或者生成的回复存在着包含有害或歧视内容的潜在风险。


在增强过程中,初级 RAG 在如何有效地将检索到的段落的上下文与当前生成任务进行整合方面也面临着不小的挑战。低效的整合可能导致输出不连贯或破碎化。冗余和重复也是一个棘手的问题,特别是当多个检索到的段落包含相似信息时,生成的回复中可能会出现重复的内容。


02.

高级 RAG


为了解决初级 RAG 的不足,高级 RAG 诞生了,并有针对性地进行了功能增强。首先讨论这些技术,这些技术可被归类为检索前优化、检索中优化和检索后优化。



检索前的优化关注数据索引优化以及查询优化,数据索引优化技术旨在以提高检索效率的方式存储数据:




检索阶段主要是识别最相关的上下文。通常,检索是基于向量搜索,它计算查询和索引数据之间的语义相似性。因此,大多数检索优化技术都围绕着 embedding 模型:




对检索到的上下文内容,我们会遇到如上下文超出窗口限制或上下文引入的噪音,它们会分散对于关键信息的注意力:



检索后优化技术包括:


03.

基于 Milvus + LlamaIndex 实现高级 RAG


我们实现的高级 RAG,使用了 OpenAI 的语言模型,托管于 Hugging Face的 BAAI重排模型,以及 Milvus 向量数据库。


fromllama_index.coreimportVectorStoreIndex
fromllama_index.vector_stores.milvusimportMilvusVectorStore
fromllama_index.coreimportStorageContext

vector_store=MilvusVectorStore(dim=1536,
uri="http://localhost:19530",
collection_name='advance_rag',
overwrite=True,
enable_sparse=True,
hybrid_ranker="RRFRanker",
hybrid_ranker_params={"k":60})

storage_context=StorageContext.from_defaults(vector_store=vector_store)

index=VectorStoreIndex(
nodes,
storage_context=storage_context
)



我们使用 LlamaIndex里的 SentenceWindowNodeParser 实现句子窗口检索技术。


fromllama_index.core.node_parserimportSentenceWindowNodeParser

node_parser=SentenceWindowNodeParser.from_defaults(
window_size=3,
window_metadata_key="window",
original_text_metadata_key="original_text",
)

SentenceWindowNodeParser 执行两项操作:


它将文档分隔成单独的句子,这些句子进行embedding。


对每个句子,它创建一个上下文窗口。如果指定 window_size = 3,那么生成的窗口将包含三个句子,从嵌入句子的前一个句子开始,跨越到之后的一个句子。该窗口将作为元数据存储。在检索期间,将返回与查询最匹配的句子。检索后,你需要通过定义一个 MetadataReplacementPostProcessor 并在 node_postprocessors 列表中使用它,来将句子替换为来自元数据的整个窗口。


fromllama_index.core.postprocessorimportMetadataReplacementPostProcessor

postproc=MetadataReplacementPostProcessor(
target_metadata_key="window"
)

...
query_engine=index.as_query_engine(
node_postprocessors=[postproc],
)


在 LlamaIndex 中实现混合搜索仅需对查询引擎进行两个参数的更改,前提是底层向量数据库支持混合搜索查询。Milvus2.4 版本之前不支持混合搜索(hybrid search),不过在最近发布的2.4版本,这个功能已经支持。

query_engine=index.as_query_engine(
vector_store_query_mode="hybrid",#Milvus2.4开始支持,在2.4版本之前使用Default
)



高级 RAG 中添加一个重排器(Re-ranking)仅需三个简单步骤:



fromllama_index.core.postprocessorimportSentenceTransformerRerank

rerank=SentenceTransformerRerank(
top_n=3,
model="BAAI/bge-reranker-base"
)
...

query_engine=index.as_query_engine(
similarity_top_k=3,
node_postprocessors=[rerank],
...,
)

详细实现代码参见百度网盘链接: https://pan.baidu.com/s/1Cj_Fmy9-SiQFMFNUmO0OZQ?pwd=r2i1 提取码: r2i1







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