ChinaWHAPI
← 返回知识中心
RAGVectorEmbeddingKnowledge BasePython

RAG 系统完整实现教程

从文档处理、Embedding 向量化、向量检索到生成阶段,完整介绍基于 ChinaWHAPI 的 RAG 系统搭建。

RAG 工作流程

RAG = Retrieval(检索)+ Augmented(增强)+ Generation(生成)。核心是在生成答案前从知识库检索相关内容,再一起交给大模型生成更准确的答案。

技术栈选择

本教程使用:文档处理(langchain)、向量数据库(Chroma/Qdrant)、Embedding(ChinaWHAPI)、生成模型(ChinaWHAPI)。

  • 文档加载:langchain document loaders
  • 文本切分:RecursiveCharacterTextSplitter
  • 向量数据库:Chroma(轻量)或 Qdrant(生产级)
  • Embedding + 生成:ChinaWHAPI

步骤 1:文档加载与切分

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

loader = PDFPlumberLoader("./document.pdf")
documents = loader.load()

splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50,
    separators=["\n\n", "\n", "。", "!", "?", " "]
)
texts = splitter.split_documents(documents)
print(f"切分完成,共 {len(texts)} 个 chunk")

步骤 2:Embedding 向量化

from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma

embeddings = OpenAIEmbeddings(
    openai_api_key="your_chinawhapi_key",
    openai_api_base="https://chinawhapi.com/v1",
    model="qwen3-vl-plus",  # 或使用专门的 embedding 模型
)

vectorstore = Chroma.from_documents(
    documents=texts,
    embedding=embeddings,
    persist_directory="./vectorstore"
)
vectorstore.persist()

步骤 3:向量检索

retriever = vectorstore.as_retriever(
    search_kwargs={"k": 5}  # 检索最相关的 5 个 chunk
)

query = "这份合同的主要风险点是什么?"
docs = retriever.get_relevant_documents(query)
for i, doc in enumerate(docs):
    print(f"\n--- Chunk {i+1} (相似度相关) ---")
    print(doc.page_content[:300])

步骤 4:RAG 生成

from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA

llm = ChatOpenAI(
    model="qwen3.6-plus",
    openai_api_key="your_chinawhapi_key",
    openai_api_base="https://chinawhapi.com/v1",
    temperature=0.3,
)

qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=retriever,
    return_source_documents=True,
)

result = qa_chain({"query": "这份合同的主要风险点是什么?"})
print(result["result"])

步骤 5:混合检索(可选)

结合向量检索和关键词检索(BM25)可以提升检索质量。

from langchain.retrievers import EnsembleRetriever

vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
bm25_retriever = BM25Retriever.from_documents(texts)

ensemble_retriever = EnsembleRetriever(
    retrievers=[vector_retriever, bm25_retriever],
    weights=[0.6, 0.4]  # 向量 60%,BM25 40%
)

生产环境优化

RAG 系统上生产需要关注的几个关键点:

  • 检索质量:定期评估 precision@K 和 recall@K
  • Embedding 更新:新文档加入时重新索引
  • 成本控制:简单问题用快速模型(Qwen3.5 Flash)做路由
  • 缓存:对相同问题做语义缓存,命中率可达 40-60%