当前位置:首页 > AI > 正文内容

RAG 知识库搭建实战:从零打造企业级 AI 智能问答系统

廖万里10小时前AI0

RAG Tutorial

什么是 RAG?为什么你需要它?

RAG(Retrieval-Augmented Generation,检索增强生成)是当前最火的 AI 应用架构之一。简单说,就是让 AI 在回答问题前,先从你的私有知识库中检索相关信息,再结合检索结果生成准确的答案。

为什么需要 RAG?

  • 大模型知识有截止日期,无法回答最新信息
  • 企业有大量私有数据,大模型无法直接访问
  • 直接训练或微调成本太高,RAG 是性价比最高的方案
  • 可以引用来源,答案更可信

RAG 核心架构解析

一个完整的 RAG 系统包含三个核心模块:

用户问题 → 向量检索 → 上下文组装 → LLM 生成 → 最终答案
    ↓           ↓
 文档入库 → 向量化存储

关键技术点:

1. 文档处理:PDF/Word/网页 → 纯文本 → 分块 2. 向量化:文本 → Embedding 模型 → 向量 3. 向量数据库:存储、索引、检索 4. Prompt 工程:将检索结果和问题组合成提示词

实战:搭建一个最小可用 RAG 系统

环境准备

# 安装依赖
pip install langchain chromadb openai sentence-transformers pypdf

第一步:文档加载与分块

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

# 加载 PDF 文档 loader = PyPDFLoader("your_document.pdf") documents = loader.load()

# 智能分块(推荐 500-1000 字符,重叠 100-200) text_splitter = RecursiveCharacterTextSplitter( chunk_size=800, chunk_overlap=150, separators=["\n\n", "\n", "。", "!", "?", ";", " ", ""] ) chunks = text_splitter.split_documents(documents)

print(f"文档分块完成:{len(chunks)} 个文本块")

第二步:向量化存储

from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma

# 使用本地模型(免费,隐私安全) embeddings = HuggingFaceEmbeddings( model_name="BAAI/bge-small-zh-v1.5", # 中文向量模型 model_kwargs={"device": "cpu"}, encode_kwargs={"normalize_embeddings": True} )

# 存入向量数据库 vectorstore = Chroma.from_documents( documents=chunks, embedding=embeddings, persist_directory="./chroma_db" ) vectorstore.persist() print("向量库构建完成!")

第三步:检索与生成

from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

# 创建检索器 retriever = vectorstore.as_retriever( search_type="similarity", search_kwargs={"k": 4} # 返回 top 4 相关文档 )

# 创建问答链 qa_chain = RetrievalQA.from_chain_type( llm=OpenAI(temperature=0, model="gpt-3.5-turbo"), chain_type="stuff", retriever=retriever, return_source_documents=True # 返回来源 )

# 提问 question = "公司的年假制度是什么?" result = qa_chain({"query": question})

print(f"回答:{result['result']}") print(f"\n参考来源:") for doc in result['source_documents']: print(f"- {doc.metadata.get('source', '未知')} 第{doc.metadata.get('page', '?')}页")

进阶技巧:让 RAG 更智能

1. 混合检索

from langchain.retrievers import EnsembleRetriever
from langchain.retrievers import BM25Retriever

# 向量检索(语义相似) vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 5})

# 关键词检索(精确匹配) bm25_retriever = BM25Retriever.from_documents(chunks) bm25_retriever.k = 5

# 混合检索(效果更好) ensemble_retriever = EnsembleRetriever( retrievers=[vector_retriever, bm25_retriever], weights=[0.6, 0.4] )

2. 重排序提升精度

from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CrossEncoderReranker

# 使用 Cross-Encoder 重排序 compressor = CrossEncoderReranker( model_name="BAAI/bge-reranker-base", top_n=4 ) compression_retriever = ContextualCompressionRetriever( base_compressor=compressor, base_retriever=vector_retriever )

3. 流式输出提升体验

from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler

qa_chain = RetrievalQA.from_chain_type( llm=OpenAI( temperature=0, streaming=True, callbacks=[StreamingStdOutCallbackHandler()] ), retriever=retriever )

常见问题与解决方案

问题解决方案
检索结果不相关调整 chunk_size,使用混合检索,添加重排序
回答产生幻觉设置 temperature=0,要求引用原文,添加验证步骤
处理速度慢使用更小的向量模型,批量处理,缓存常见问题
答案不完整增加 retrieve 数量,使用 map_reduce chain

生产环境部署建议

1. 向量数据库选型 - 小规模:Chroma / FAISS(本地部署) - 中规模:Milvus / Weaviate(集群部署) - 大规模:Pinecone / Zilliz Cloud(云服务)

2. API 网关

   from fastapi import FastAPI
   from pydantic import BaseModel

app = FastAPI()

class Query(BaseModel): question: str

@app.post("/ask") async def ask(query: Query): result = qa_chain({"query": query.question}) return { "answer": result["result"], "sources": [doc.metadata for doc in result["source_documents"]] }

3. 监控与优化 - 记录用户问题和答案质量评分 - 定期更新知识库 - A/B 测试不同参数效果

总结

RAG 是企业落地 AI 的最佳切入点。核心流程并不复杂:文档分块 → 向量化 → 检索 → 生成。但要做出好用的系统,需要在检索精度、回答质量、性能优化上持续打磨。

建议从最小可用版本开始,逐步迭代优化。先跑通流程,再追求效果。

下一步行动:

  • 用自己的文档跑通上面的代码
  • 调整分块参数,对比效果
  • 尝试混合检索和重排序
  • 封装成 API 服务

有问题欢迎评论区交流!

本文链接:https://www.kkkliao.cn/?id=686 转载需授权!

分享到:

版权声明:本文由廖万里的博客发布,如需转载请注明出处。


发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。