生成式AI已无处不在,但大型语言模型(LLM)存在响应失准现象(称为"幻觉")。检索增强生成(RAG)技术能有效改善这一状况。
RAG已成为提升LLM输出的黄金标准。它通过整合模型训练数据外的外部知识来优化输出,特别适用于需要专业领域知识和数据隐私的场景。

我们将实现一个可在本地运行的RAG方案。通过实践,您将掌握可应用于实际项目的RAG系统构建方法。
我们的RAG方案 本方案采用标准RAG架构配合查询增强技术,使用本地向量数据库和托管语言模型。系统流程如下:

技术选型:
知识库:PDF文档内容向量数据库:ChromaDB嵌入生成:Gemini系列产品(需准备Google API密钥)增强技术:查询重构 + 假设文档嵌入(HyDE)开发环境:Jupyter Notebook实现步骤
环境配置python -m venv rag-env.\Scripts\activatepip install PyPDF2 langchain google-generativeai chromadb核心代码实现import PyPDF2from langchain.text_splitter import RecursiveCharacterTextSplitterimport google.generativeai as genaiimport chromadbimport logging# PDF文本提取def extract_text_from_pdf(pdf_path): with open(pdf_path, "rb") as file: reader = PyPDF2.PdfReader(file) return "".join(page.extract_text() for page in reader.pages)# 文本分块处理def chunk_text(text): splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=50, separators=["\n\n", "\n", " ", ""]) return splitter.split_text(text)# 嵌入生成genai.configure(api_key="YOUR-API-KEY")def generate_embeddings(texts): return [genai.embed_content(model="models/text-embedding-004", content=text)['embedding'] for text in texts]# 向量存储def store_embeddings(chunks, embeddings): client = chromadb.Client() collection = client.get_or_create_collection(name="doc_chunks") collection.add( documents=chunks, embeddings=embeddings, ids=[f"chunk_{i}" for i in range(len(chunks))] ) return collection# 查询增强模块class HyDERetriever: def __init__(self, collection): self.collection = collection def generate_hypothetical_doc(self, query): prompt = f"生成详细回答'{query}'的假设文档(约500字)" return genai.GenerativeModel("gemini-1.5-flash").generate_content(prompt).text def retrieve(self, query, k=3): hyde_doc = self.generate_hypothetical_doc(query) embedding = generate_embeddings([hyde_doc])[0] return self.collection.query(query_embeddings=[embedding], n_results=k)["documents"][0]# 响应生成def generate_response(query, context): return genai.GenerativeModel("gemini-1.5-flash").generate_content( f"上下文:{context}\n问题:{query}").text系统集成if __name__ == "__main__": # 知识库处理 text = extract_text_from_pdf("Insurance_Handbook.pdf") chunks = chunk_text(text) collection = store_embeddings(chunks, generate_embeddings(chunks)) # 查询处理 original_query = "保险中的残余市场是什么?" hyde_retriever = HyDERetriever(collection) similar_docs = hyde_retriever.retrieve(original_query) # 结果生成 print(generate_response(original_query, " ".join(similar_docs)))效果示例 原始查询:"什么是保险残余市场?" 增强后查询:"详细解释保险行业中残余市场的概念,包括典型覆盖风险类型、运作方式以及美国相关监管框架" 生成回答:"保险残余市场指承保人非自愿承接的高风险业务领域。这类市场通常需要政府干预支持,因为其本身难以维持盈亏平衡..."
总结 本文演示了如何:
使用Gemini构建RAG系统实现查询重构和HyDE技术集成ChromaDB进行向量检索 该方案可轻松适配其他领域应用,通过持续的查询优化可进一步提升结果质量。