如何用LangChain/OpenAI直接与已有MongoDB数据交互?
最优实现方案
一、基于LangChain的直接对接方案
针对已有MongoDB数据,核心是跳过PDF导入环节,直接完成数据索引构建与问答链搭建:
- 直接加载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()
- 文档分割处理
若文档内容过长,用RecursiveCharacterTextSplitter分割为小片段,适配GPT上下文限制:
from langchain.text_splitter import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200) split_docs = text_splitter.split_documents(documents)
- 构建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创建的向量索引名" )
- 搭建问答交互链
用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原生查询实现交互:
- 自然语言转MongoDB查询
让GPT将用户提问转换为合法的MongoDBfind查询语句:
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)))
- 查询结果转自然语言回答
将查询到的文档传给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
相关产品推荐
相关产品推荐

