RAG (检索增强生成) 技术是构建企业级 AI 应用的关键。本教程将手把手教你搭建一个基于 RAG 的知识库问答系统。

什么是 RAG?

RAG (Retrieval-Augmented Generation) 结合了信息检索和文本生成:

  1. 用户提问后,系统先从知识库检索相关文档
  2. 将检索结果作为上下文提供给大模型
  3. 大模型基于上下文生成准确回答

这种方法解决了大模型的知识局限性和幻觉问题,特别适合企业场景。

技术架构

一个完整的 RAG 系统包含以下组件:

  • 文档处理: 文本分割、清洗
  • 向量化: 将文本转换为向量
  • 向量数据库: 存储和检索向量
  • 大模型: 生成最终回答
  • 编排框架: 流程协调

环境准备

安装依赖

pip install langchain langchain-openai chromadb pypdf tiktoken

配置 API

import os
os.environ['OPENAI_API_KEY'] = 'your-api-key'

Step 1: 文档处理

from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

# 加载文档
loader = PyPDFLoader('company_manual.pdf')
documents = loader.load()

# 文本分割
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200
)
chunks = text_splitter.split_documents(documents)
print(f'分割后共 {len(chunks)} 个文本块')

Step 2: 向量化与存储

from langchain_openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma

# 创建向量存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=embeddings,
    persist_directory='./chroma_db'
)

Step 3: 构建问答链

from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI

# 初始化大模型
llm = ChatOpenAI(model_name='gpt-4', temperature=0)

# 创建问答链
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type='stuff',
    retriever=vectorstore.as_retriever(
        search_kwargs={'k': 3}
    )
)

Step 4: 实现问答功能

def ask_question(question):
    result = qa_chain.invoke({'query': question})
    return result['result']

# 测试
answer = ask_question('公司的请假政策是什么?')
print(answer)

优化技巧

  • 分块大小: 根据文档类型调整 chunk_size
  • 检索数量: 平衡召回率和精度
  • 重排序: 对检索结果进行二次排序
  • 混合检索: 结合关键词和向量检索

生产环境建议

  • 使用 Pinecone 或 Milvus 替代 Chroma
  • 添加缓存层减少重复查询
  • 实现流式输出提升用户体验
  • 建立监控和日志系统

结语

RAG 技术为构建可靠的 AI 应用提供了坚实基础。通过本教程,你已经掌握了搭建知识库问答系统的核心技能。继续探索更高级的优化技巧,让你的系统更加智能高效!