使用Chroma作为向量库OpenAI作为 embedding 与生成模型。1. 安装依赖pip install chromadb openai tiktoken2. 设置 OpenAI Keyimport os os.environ[OPENAI_API_KEY] your-api-key3. 完整RAG流程import chromadb from chromadb.utils import embedding_functions from openai import OpenAI # ----- 初始化 ----- openai_client OpenAI() # 使用OpenAI的embedding函数 openai_ef embedding_functions.OpenAIEmbeddingFunction( api_keyos.environ[OPENAI_API_KEY], model_nametext-embedding-ada-002 ) # 创建本地Chroma客户端持久化到./chroma_db目录 chroma_client chromadb.PersistentClient(path./chroma_db) # 创建或获取collection collection_name my_knowledge try: chroma_client.delete_collection(collection_name) except: pass collection chroma_client.create_collection( namecollection_name, embedding_functionopenai_ef ) # ----- 1. 准备知识库文档 ----- documents [ OpenAI 的 GPT-4 是一个强大的大语言模型支持多模态和长上下文。, Chroma 是一个开源的向量数据库专门用于AI应用和embedding检索。, RAG 是检索增强生成能够减少大模型幻觉并提供最新知识。, Python 是数据科学和AI领域最常用的编程语言。 ] # 添加文档到Chroma collection.add( documentsdocuments, ids[fdoc_{i} for i in range(len(documents))] ) print(f知识库已添加 {collection.count()} 条文档) # ----- 2. 检索函数 ----- def retrieve(query, top_k2): results collection.query( query_texts[query], n_resultstop_k ) return results[documents][0] # ----- 3. 生成函数基于检索结果 ----- def rag_generate(query): # 检索 retrieved_docs retrieve(query) # 构建prompt context \n\n.join(retrieved_docs) prompt f基于以下参考信息回答问题。如果参考信息中没有答案请说不知道。 参考信息 {context} 问题{query} 回答 # 调用OpenAI生成 response openai_client.chat.completions.create( modelgpt-3.5-turbo, messages[ {role: system, content: 你是一个基于知识库的问答助手。}, {role: user, content: prompt} ], temperature0 ) return response.choices[0].message.content # ----- 4. 测试 ----- if __name__ __main__: question 什么是RAG answer rag_generate(question) print(f问题: {question}) print(f回答: {answer}) print(\n--- 另一个问题 ---) question2 Chroma是什么 answer2 rag_generate(question2) print(f问题: {question2}) print(f回答: {answer2})4. 输出示例知识库已添加 4 条文档 问题: 什么是RAG 回答: RAG是检索增强生成能够减少大模型幻觉并提供最新知识。 问题: Chroma是什么 回答: Chroma是一个开源的向量数据库专门用于AI应用和embedding检索。关键点说明Embeddingtext-embedding-ada-002将文本转为向量Chroma自动完成检索默认使用余弦相似度top_k2返回最相关的两个文档生成将检索到的文档拼接到 prompt 中由 GPT 总结回答持久化PersistentClient使知识库保存到磁盘下次启动可复用这个流程已经是一个完整的 RAG 原型你可以通过替换documents为自己的数据进行扩展。不是。标准的RAG如前面Chroma示例是一次性检索不是增量检索。标准RAG和增量检索两者的核心区别特性标准RAG增量检索检索次数1次query时多次迭代式上下文构建一次拼装逐步累积典型场景问答、摘要多跳推理、长文生成标准RAG流程一次检索def standard_rag(query): # 只检索一次 docs vector_db.search(query, top_k3) # 一次生成 return llm.generate(query, contextdocs) # 示例问Claude和GPT哪个好 # 一次检索就拿到两种模型对比的文档增量检索Iterative RAG / Self-Askdef incremental_rag(query): context [] # 第1轮检索初步信息 docs1 vector_db.search(query, top_k2) context.extend(docs1) # 第2轮基于已有信息发现缺失 missing llm.identify_gaps(query, context) docs2 vector_db.search(missing, top_k2) context.extend(docs2) # 第3轮可能需要再细化 if need_more_detail(context): sub_query llm.extract_subquery(context) docs3 vector_db.search(sub_query, top_k1) context.extend(docs3) return llm.generate(query, context)实际案例对比场景查询2024年AI融资最多的三家公司标准RAG1次检索: 2024年AI融资最多的三家公司 返回: [OpenAI融资66亿, Anthropic融资40亿, Inflection融资13亿] ✅ 直接满足增量检索3轮# 第1轮 检索: 2024年AI融资最多的三家公司 返回: [OpenAI融资金额, AI融资趋势报告] # 第2轮发现不完整 检索: 2024年融资金额排名第四的公司 返回: [Cohere融资5亿] # 第3轮验证数据 检索: CBInsights 2024 AI融资排行榜 返回: [完整排名表格]什么时候需要增量检索问题类型标准RAG增量RAG什么是RAG✅ 一次够❌ 过度设计A和B的区别✅ 同时检索❌ 浪费某电影主角的出生地❌ 缺失信息✅ 先找电影→再找主演→再找出生地对比GPT-4、Claude、Gemini的性能❌ 可能不完整✅ 分别检索每个