You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用LangChain/OpenAI直接与已有MongoDB数据交互?

最优实现方案

一、基于LangChain的直接对接方案

针对已有MongoDB数据,核心是跳过PDF导入环节,直接完成数据索引构建与问答链搭建:

  1. 直接加载MongoDB文档
    用LangChain的MongoDBAtlasLoader读取已有集合的文档,支持自定义查询过滤:
from langchain.document_loaders import MongoDBAtlasLoader
from pymongo import MongoClient

client = MongoClient("你的MongoDB连接字符串")
db = client["目标数据库名"]
collection = db["目标集合名"]

# 加载集合内全部文档,也可通过query参数指定过滤条件
loader = MongoDBAtlasLoader(collection, db=db)
documents = loader.load()
  1. 文档分割处理
    若文档内容过长,用RecursiveCharacterTextSplitter分割为小片段,适配GPT上下文限制:
from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
split_docs = text_splitter.split_documents(documents)
  1. 构建MongoDB向量索引
    借助OpenAI Embedding生成向量,存入MongoDB Atlas向量搜索(若使用Atlas),实现高效检索:
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import MongoDBAtlasVectorSearch

embeddings = OpenAIEmbeddings(openai_api_key="你的OpenAI密钥")
vector_store = MongoDBAtlasVectorSearch.from_documents(
    split_docs,
    embeddings,
    collection=collection,
    index_name="提前在Atlas创建的向量索引名"
)
  1. 搭建问答交互链
    用RetrievalQA链实现基于MongoDB数据的GPT问答:
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA

llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vector_store.as_retriever(search_kwargs={"k": 3}),
    return_source_documents=True
)

# 提问示例
result = qa_chain({"query": "查询集合中2024年创建的用户记录"})
print(result["result"])

注:若使用自建MongoDB,可替换为MongoDBVectorStore或搭配FAISS等开源向量存储。

二、LangChain之外的轻量方案

无需依赖LangChain,直接通过OpenAI API + MongoDB原生查询实现交互:

  1. 自然语言转MongoDB查询
    让GPT将用户提问转换为合法的MongoDB find查询语句:
import openai
import pymongo

openai.api_key = "你的OpenAI密钥"
client = MongoClient("你的MongoDB连接字符串")
db = client["目标数据库名"]

def get_mongo_query(user_query):
    prompt = f"""
    请将以下自然语言提问转换成MongoDB的find查询语句,仅返回查询代码,无多余解释:
    用户提问:{user_query}
    """
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": prompt}]
    )
    return response.choices[0].message.content

# 示例
user_question = "找出所有消费金额超过1000的订单"
mongo_query = get_mongo_query(user_question)
# 执行查询前需做安全校验,避免注入风险
documents = list(db.orders.find(eval(mongo_query)))
  1. 查询结果转自然语言回答
    将查询到的文档传给GPT,整理为易懂的自然语言回复:
def generate_answer(documents, user_query):
    prompt = f"""
    根据以下MongoDB查询结果,回答用户提问:
    用户提问:{user_query}
    查询结果:{documents}
    用简洁清晰的自然语言回答,不要提及查询细节。
    """
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": prompt}]
    )
    return response.choices[0].message.content

answer = generate_answer(documents, user_question)
print(answer)

注:必须添加查询语句安全校验,限制操作集合、禁止写操作,避免注入风险。

三、方案对比

  • LangChain方案:集成度高,自带检索增强生成(RAG)逻辑,适配复杂问答场景;缺点是需学习框架用法。
  • 轻量方案:灵活无依赖,适合简单查询场景;缺点是需自行处理长文档分割、向量检索等逻辑,安全性需自主把控。

内容的提问来源于stack exchange,提问作者junaidp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:57:50