RAG 与大模型对接的 9 大隐藏挑战及解决方案
近年来,大语言模型(LLM)在上下文窗口容量上取得了显著进展,例如 Kimi 支持 200 万字上下文,阿里通义千问宣称可达 1000 万字。然而,Prompt 长度与 RAG(检索增强生成)是两个不同的技术方向。尽管长上下文能缓解部分问题,但在专业领域,通用大模型的应答能力依然有限。RAG 通过引入外部知识库,显著提升大模型的特异性与准确性。
什么是 RAG
RAG(Retrieval-Augmented Generation),即增强搜索生成。当用户询问专业问题时,直接调用大模型容易产生'幻觉'或回答泛泛而谈。通过丰富 Prompt,引入相关背景知识,大模型能获得更专业的应答能力。这个引入外部知识的过程即为 RAG。
核心流程如下:
- 知识库构建:将书、教材、论文文献等非结构化数据转化为向量库。
- 检索:用户提问时,结合向量库检索最相关的片段。
- 生成:将检索结果作为上下文补充到 Prompt 中,发送给大模型生成答案。
大数据时代,企业拥有大量专有数据,基于它们创建 RAG 是提升大模型业务价值的关键手段。
RAG 构建流程
构建一个标准的 RAG 系统通常包含以下步骤:
- 文档分割:将文档分割成均匀的块(Chunk),每个块是一段原始文本。
- 嵌入生成:为每个块生成向量嵌入(Embedding),如使用 OpenAI Embedding 或 Sentence Transformer。
- 向量存储:将每个块的向量存储在向量数据库中。
- 相似性检索:从向量数据库集合中找到与查询最相似的 Top-k 块。
- 响应合成:接入 LLM 响应合成模块,生成最终回答。
以下是一个基于 LlamaIndex 的简易 RAG 管道示例:
!pip install llama-index
# 设置环境变量
import os
os.environ['OPENAI_API_KEY'] = "your_api_key_here"
import logging
import sys
import requests
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
from llama_index import VectorStoreIndex, SimpleDirectoryReader
from IPython.display import Markdown, display
# 下载示例文档
response = requests.get("https://www.dropbox.com/s/f6bmb19xdg0xedm/paul_graham_essay.txt?dl=1")
essay_txt = response.text
with open("pg_essay.txt", "w") as fp:
fp.write(essay_txt)
# 加载文档
documents = SimpleDirectoryReader(input_files=[]).load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine(similarity_top_k=)
response = query_engine.query()
(response.source_nodes[].node.get_text())


