AI RAG 检索增强生成实战:向量数据库与大模型实现智能问答

小飞兽 大模型/LLM 6 次阅读 2026-07-29

RAG(Retrieval-Augmented Generation,检索增强生成)通过从外部知识库检索相关信息并注入 LLM 上下文,让模型能够基于真实、最新的知识回答问题,同时有效减少幻觉。

一、RAG 核心架构

索引阶段(离线)将文档切分、嵌入、存入向量数据库;推理阶段(在线)将用户问题检索相关片段,连同问题一起发给 LLM 生成答案。

# pip install langchain langchain-community langchain-openai faiss-cpu

import os
from langchain.document_loaders import TextLoader, DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate

os.environ['OPENAI_API_KEY'] = 'sk-...'

loader = DirectoryLoader('.', glob='**/*.md', loader_cls=TextLoader)
documents = loader.load()
print(f'加载文档数量: {len(documents)}')

text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
separators=['\n\n', '\n', '。', '!', '?'],
)
chunks = text_splitter.split_documents(documents)
print(f'切分后文本块数量: {len(chunks)}')

embeddings = OpenAIEmbeddings(model='text-embedding-3-small')
vectorstore = FAISS.from_documents(chunks, embeddings)
print(f'向量数据库建立完成,共 {vectorstore.index.ntotal} 条向量')
vectorstore.save_local('faiss_index')

prompt_template = '''你是一个专业的技术文档助手。基于以下参考文档回答用户问题。如果文档中没有相关信息,请明确说明,不要编造。

参考文档:
{context}

用户问题:{question}

请给出准确、完整的回答:'''
PROMPT = PromptTemplate(template=prompt_template, input_variables=['context', 'question'])

llm = ChatOpenAI(model='gpt-4o-mini', temperature=0)

qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type='stuff',
retriever=vectorstore.as_retriever(search_kwargs={'k': 3}),
return_source_documents=True,
chain_type_kwargs={'prompt': PROMPT},
)

query = 'Flask 如何处理用户登录的 POST 请求?'
result = qa_chain({'query': query})
print(f'问题: {query}')
print(f'回答: {result["result"]}')
for i, doc in enumerate(result['source_documents'], 1):
print(f'[{i}] {doc.page_content[:150]}...')

二、向量数据库选型

# 数据库        适用规模       部署方式          特点

FAISS 小~中 单机/内存 最快,Meta 出品,无服务


Chroma 小 本地/服务化 最简单,快速原型


Milvus 大 K8s/云 企业级,高可用


Pinecone 大 全托管 无运维,按量付费


Qdrant 大 自托管/云 高性能,支持过滤</code></pre><h2>三、常见问题</h2><p><strong>Q1:文档切分有哪些策略?</strong><br/>固定字符数切分、语义切分、递归切分(按段落到句子层级递进)。代码/表格建议单独切分。</p><p><strong>Q2:Embedding 模型如何选择?</strong><br/>中文推荐 <code>text-embedding-3-small</code>(OpenAI)或 <code>m3e-base</code>(Moonshot 开源)。</p><p><strong>Q3:如何提升检索质量?</strong><br/>使用混合检索(向量检索 + BM25 关键词检索)结合。<code>rerank</code> 模型对初筛结果重排序。</p><h2>四、延伸阅读</h2><ul><li>LangChain RAG 教程:<a href="https://python.langchain.com/docs/tutorials/rag/">https://python.langchain.com/docs/tutorials/rag/</a></li><li>FAISS 官方:<a href="https://github.com/facebookresearch/faiss">https://github.com/facebookresearch/faiss</a></li><li>RAG 评估框架:RAGAS、Trulens</li><li>Advanced RAG:Query 改写 / HyDE / CRAG</li></ul>