一、什么是RAG技术?
RAG(Retrieval-Augmented Generation) 是当前最受关注的自然语言处理技术之一,它通过将信息检索与文本生成相结合,有效解决了传统大语言模型(LLM)的三个核心痛点:
- 知识更新延迟:传统LLM的参数固化导致无法获取最新信息
- 领域知识缺乏:垂直领域的专业知识难以全面覆盖
- 事实性错误:生成内容可能包含看似合理实则错误的"幻觉"
RAG的核心思想可以概括为:
答案生成 = 检索相关文档 + 生成精炼答案
这种架构让系统既具备专业数据库的准确性,又保留了LLM的自然语言理解能力。
二、RAG技术架构详解
2.1 典型工作流程
- 文档处理阶段:
- 文档加载 → 文本分块 → 向量编码 → 存储索引
- 查询阶段:
- 问题向量化 → 相似度检索 → 上下文组合 → 生成回答
2.2 关键技术组件
组件 | 作用 | 常用工具 |
---|---|---|
文本分块 | 将文档分割为语义单元 | RecursiveCharacterTextSplitter |
向量编码 | 将文本转化为数学向量 | OllamaEmbeddings, HuggingFace Embeddings |
向量数据库 | 存储和检索向量 | FAISS, Chroma, Pinecone |
检索器 | 执行相似度搜索 | VectorStoreRetriever |
提示工程 | 控制生成逻辑 | LangChain Prompt Templates |
三、代码实现深度解析
3.1 知识库构建(build_rag_db.py)
def build_rag_db(input_file, db_path, base_url):
# 文档读取与分块
documents = TextLoader(input_file).load()
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
chunks = text_splitter.split_documents(documents)
# 向量编码与存储
embeddings = OllamaEmbeddings(model="nomic-embed-text")
vector_db = FAISS.from_documents(chunks, embeddings)
vector_db.save_local(db_path)
关键参数解析:
chunk_size=1000
: 平衡信息完整性与检索效率chunk_overlap=200
: 避免语义断裂的滑动窗口nomic-embed-text
: 专为检索优化的嵌入模型
3.2 检索增强生成(query_rag_db.py)
def query_vector_db(question, db_path):
# 加载知识库
vector_db = FAISS.load_local(db_path, embeddings)
# 构建检索链
prompt_template = """
请依据已知内容用中文回答:
已知内容:{context}
问题: {input}
"""
retrieval_chain = create_retrieval_chain(
vector_db.as_retriever(),
create_stuff_documents_chain(
Ollama(model="