使用Python和OpenAI API构建RAG知识库问答系统
检索增强生成(Retrieval-Augmented Generation,RAG)是目前构建AI问答系统的主流架构。本文将带你从零开始,使用Python和OpenAI API构建一个完整的RAG知识库问答系统。
什么是RAG?
RAG的核心思想是:当用户提出问题时,系统首先从知识库中检索相关文档片段,然后将这些片段作为上下文提供给大语言模型,让模型基于检索到的信息生成回答。这样既利用了LLM的理解和生成能力,又确保了答案的准确性和时效性。
环境准备
首先安装必要的依赖库:
pip install openai chromadb sentence-transformers python-dotenv
步骤1: 初始化向量数据库
import os
import chromadb
from chromadb.utils import embedding_functions
from openai import OpenAI
# 初始化OpenAI客户端
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
# 初始化ChromaDB向量数据库
chroma_client = chromadb.PersistentClient(path="./rag_knowledge_base")
sentence_transformer_ef = embedding_functions.SentenceTransformerEmbeddingFunction(
model_name="all-MiniLM-L6-v2"
)
collection = chroma_client.get_or_create_collection(
name="knowledge_base",
embedding_function=sentence_transformer_ef
)
步骤2: 添加文档到知识库
def add_documents(documents, ids=None, metadatas=None):
"""将文档添加到向量数据库"""
if ids is None:
ids = [f"doc_{i}" for i in range(len(documents))]
collection.add(
documents=documents,
ids=ids,
metadatas=metadatas
)
print(f"已添加 {len(documents)} 个文档")
# 示例:添加知识库文档
docs = [
"Python是一种高级编程语言,由Guido van Rossum创建并于1991年首次发布。",
"OpenAI API提供了GPT系列模型的访问接口,支持文本生成、代码补全等功能。",
"ChromaDB是一个开源的向量数据库,专为AI应用设计,支持高效的相似性搜索。",
"RAG(检索增强生成)是一种结合检索和生成的AI架构,能显著提升回答准确性。"
]
add_documents(docs)
步骤3: 实现RAG问答函数
def rag_query(query, n_results=2):
# 1. 检索相关文档
results = collection.query(
query_texts=[query],
n_results=n_results
)
# 2. 构建上下文
context = "\n\n".join(results['documents'][0])
# 3. 生成回答
prompt = (
"请基于以下知识库内容回答问题。\n\n"
"知识库内容:\n" + context + "\n\n"
"问题:" + query + "\n\n"
"请用中文回答,如果知识库中没有相关信息,请明确说明。"
)
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "你是一个知识问答助手,请基于提供的知识库内容回答问题。"},
{"role": "user", "content": prompt}
],
temperature=0.3
)
return response.choices[0].message.content
完整运行示例
将以上代码整合到一个文件 rag_system.py 中,设置好OPENAI_API_KEY环境变量后运行:
export OPENAI_API_KEY="sk-your-api-key"
python rag_system.py
进阶优化建议
1. 文档分块:长文档需要合理分块,常用策略包括固定长度分块、语义分块等
2. 混合检索:结合向量检索和关键词检索,提高召回率
3. 重排序:使用cross-encoder模型对检索结果进行重排序,提升相关性
4. 元数据过滤:利用文档的元数据进行预过滤
通过以上步骤,你已经成功构建了一个完整的RAG知识库问答系统。这个框架可以扩展到处理PDF文档、网页内容、企业知识库等各种场景。
©️版权声明:若无特殊声明,本站所有文章版权均归AI工具集原创和所有,未经许可,任何个人、媒体、网站、团体不得转载、抄袭或以其他方式复制发表本站内容,或在非我站所属的服务器上建立镜像。否则,我站将依法保留追究相关法律责任的权利。