【10】Langchain读取数据库
Langchain读取数据库LangChain 提供了多种内置工具和模块化组件能够轻松连接大语言模型LLM与各类结构化数据源。针对数据库交互LangChain 主要提供以下核心能力1. 传统关系型数据库SQL交互LangChain 提供了SQLDatabaseChain等实用工具能够将用户的自然语言问题自动翻译成 SQL 命令并执行。通用 SQL 数据库支持 PostgreSQL、MySQL 等主流数据库。例如你可以配置该链连接数据库让用户用自然语言提问如“上个月销售额是多少”系统会自动生成 SQL、执行查询并将结果以可读格式返回。Databricks SQL 代理针对 Databricks 平台LangChain 提供了SQLDatabase包装器和Databricks SQL 代理允许用户直接与 Unity Catalog 中的指定架构交互生成数据洞察注该代理仅支持查询表不支持创建表。2. 向量数据库Vector Store交互对于需要语义搜索或构建 RAG检索增强生成系统的场景LangChain 支持多种文档导向的向量数据库如 Chroma用于存储和检索文档嵌入。Azure Database for PostgreSQL支持通过pgvector扩展在单个数据库中同时管理关系数据和数百万个向量嵌入。LangChain 提供了专门的AzurePGVectorStore支持使用余弦距离、L2 距离等算法执行相似性搜索。Databricks Vector Search作为无服务器向量数据库可通过DatabricksVectorSearch组件集成支持从 Delta 表自动创建向量索引并进行相似性查询。3. 图数据库Graph Database交互针对知识图谱等复杂关系数据LangChain 同样提供了专门的集成方案。Kùzu 图数据库这是一个可嵌入的图数据库LangChain 提供了KuzuGraph和KuzuQAChain。通过LLMGraphTransformer你可以利用 LLM 从非结构化文本中提取节点和关系并写入图数据库随后通过 Text2Cypher 管道使用自然语言查询图数据。4. 文档型/NoSQL 数据库交互LangChain 也支持通过文档加载器Document Loaders读取非结构化或半结构化数据。Notion 数据库通过NotionDBLoader可以连接 Notion 数据库检索页面内容及其元数据并将其转换为 LangChain 的 Document 对象列表方便后续处理。MongoDBLangChain 提供了与 MongoDB Atlas 的集成方案支持在 MongoDB 中实现 LLM 缓存、图存储等功能。5. 大数据框架交互Spark DataFrame 代理LangChain 中的 Spark DataFrame 代理允许 LLM 直接与 PySpark 数据帧进行交互针对大数据场景下的问题解答进行了专门优化。此外开发者还可以基于 SQLAlchemy 等 ORM 库编写自定义的数据库包装器以扩展 LangChain 的数据库支持范围。你主要想用哪种数据库我可以给出对应的接入示例PostgreSQL/MySQL关系型适合结构化业务数据Chroma/PGVector向量数据库适合RAG知识库MongoDB文档型适合灵活Schema一、PostgreSQL/MySQL关系型适合结构化业务数据接入 PostgreSQL 或 MySQL 等关系型数据库是让大模型LLM直接理解和分析结构化业务数据如订单、用户表、财务报表的关键步骤。在 LangChain 中最核心且常用的方式是使用SQLDatabaseChain或SQL Agent它们能够充当“翻译官”将用户的自然语言自动转换为 SQL 查询语句执行后并把结果总结为人类可读的文本。以下是接入并实现自然语言查询的完整实战指南第一步安装核心依赖除了 LangChain 核心库和 LLM 驱动外还需要安装对应数据库的 Python 连接器pipinstalllangchain langchain-openai mysql-connector-python psycopg2-binary第二步连接数据库并构建查询链版本一使用Chain实现基础查询这里以 MySQL 为例PostgreSQL 的连接字符串格式略有不同但用法一致。importosfromlangchain_openaiimportChatOpenAIfromlangchain.sql_databaseimportSQLDatabasefromlangchain.chainsimportcreate_sql_query_chain# 1. 建立数据库连接# MySQL 格式: mysqlmysqlconnector://user:passwordhost:port/database# PostgreSQL 格式: postgresql://user:passwordhost:port/databasedbSQLDatabase.from_uri(mysqlmysqlconnector://root:yourpasswordlocalhost:3306/mydatabase)# 2. 初始化 LLMllmChatOpenAI(modelgpt-4o-mini,temperature0)# 3. 创建 SQL 查询链推荐使用新版 APIchaincreate_sql_query_chain(llm,db)# 4. 运行自然语言查询responsechain.invoke({question:上个月销售额最高的产品是什么})print(response)版本二使用 SQL Agent 替代 Chain在实际生产环境中强烈建议使用SQL Agent而不是基础的 SQL Chain。Agent 具备自我纠错能力如果生成的 SQL 语法报错它会自动查看错误信息并重新生成正确的查询。要将基础的 SQL 查询链升级为使用“执行 SQL 语句工具”的 Agent 架构核心是引入SQLDatabaseToolkit。这个工具包不仅包含了执行 SQL 的工具还内置了查询检查器、错误修复等辅助工具让 Agent 具备自我纠错能力。以下是改进后的代码importosfromlangchain_openaiimportChatOpenAIfromlangchain.sql_databaseimportSQLDatabasefromlangchain_community.agent_toolkitsimportSQLDatabaseToolkitfromlangchain.agentsimportcreate_sql_agent# 1. 建立数据库连接dbSQLDatabase.from_uri(mysqlmysqlconnector://root:yourpasswordlocalhost:3306/mydatabase)# 2. 初始化 LLMllmChatOpenAI(modelgpt-4o-mini,temperature0)# 3. 创建 SQL 数据库工具包# 该工具包包含: sql_db_query(执行SQL), sql_db_schema(获取表结构), sql_db_list_tables 等工具toolkitSQLDatabaseToolkit(dbdb,llmllm)# 4. 创建 SQL Agentagentcreate_sql_agent(llmllm,toolkittoolkit,verboseTrue,# 开启详细日志方便观察 Agent 的思考和工具调用过程agent_executor_kwargs{handle_parsing_errors:True}# 自动处理解析错误)# 5. 运行自然语言查询resultagent.invoke({input:上个月销售额最高的产品是什么})print(result[output])核心改进点工具化执行Agent 会先调用sql_db_schema获取表结构再生成 SQL最后通过sql_db_query工具执行。如果执行报错Agent 会自动读取错误信息并重新生成 SQL。安全隔离工具执行机制天然支持权限控制你可以在数据库层面为连接账号设置只读权限防止 LLM 执行破坏性操作。可扩展性你可以向toolkit中注入自定义工具比如在执行 SQL 前先进行业务规则校验。这套代码已经可以直接替换你原来的链式调用在生产环境中表现会稳定得多。版本三加上提示词限制给 SQL Agent 加上提示词关键是告诉它业务背景、表结构含义和输出规范这样它生成的 SQL 和最终回答才会更准、更符合业务需求。以下是加入自定义系统提示词的完整代码importosfromlangchain_openaiimportChatOpenAIfromlangchain.sql_databaseimportSQLDatabasefromlangchain_community.agent_toolkitsimportSQLDatabaseToolkitfromlangchain.agentsimportcreate_sql_agent# 1. 建立数据库连接dbSQLDatabase.from_uri(mysqlmysqlconnector://root:yourpasswordlocalhost:3306/mydatabase)# 2. 初始化 LLMllmChatOpenAI(modelgpt-4o-mini,temperature0)# 3. 创建 SQL 数据库工具包toolkitSQLDatabaseToolkit(dbdb,llmllm)# 4. 自定义系统提示词核心改进SYSTEM_PROMPT你是一个专业的电商数据分析师。请根据用户的自然语言问题生成并执行 MySQL 查询语句。 【业务背景】 - 数据库包含users用户表、orders订单表、products商品表 - orders 表中的 status 字段pending待支付, paid已支付, shipped已发货, completed已完成 - 所有金额字段单位为人民币元 【执行规范】 1. 优先使用 sql_db_schema 工具确认表结构不要凭空猜测字段名 2. 生成的 SQL 必须使用标准 MySQL 语法 3. 涉及时间查询时默认使用当前系统时间作为基准 4. 如果查询无结果请明确告知用户不要编造数据 【回答规范】 - 直接给出清晰、简洁的业务结论不要输出 SQL 语句本身 - 如果涉及金额保留两位小数并加上“元”单位 - 如果涉及多条记录最多展示前 5 条并告知总数量 # 5. 创建 SQL Agent 并注入提示词agentcreate_sql_agent(llmllm,toolkittoolkit,verboseTrue,agent_executor_kwargs{handle_parsing_errors:True},system_messageSYSTEM_PROMPT# 注入自定义提示词)# 6. 运行自然语言查询resultagent.invoke({input:上个月销售额最高的产品是什么})print(result[output])提示词设计要点业务背景前置明确告诉 Agent 表名、关键字段的枚举值如订单状态避免它生成WHERE status 已发货这种中文匹配的错误 SQL。执行规范约束强制它先查表结构再生成 SQL从根源上减少字段名幻觉。回答规范兜底防止 Agent 把 SQL 代码直接吐给用户同时规范了金额、列表的展示格式让最终输出可以直接面向终端用户。你可以根据实际业务把【业务背景】里的表结构和字段含义替换成你真实的数据库字典Agent 的准确率会大幅提升。⚠️ 生产环境避坑指南防止大模型“自作聪明”大模型有时为了“友好”会将具体的数据库记录如具体的患者ID或订单号自动总结为数量如“共找到10条记录”。如果遇到这种情况需要在 Prompt 中明确强调“请直接返回查询到的原始字段值不要进行总结或解释。”安全与权限控制务必为 LLM 连接数据库使用只读账号或者通过自定义DatabaseQueryTool限制 LLM 只能查询特定的表防止大模型执行危险的DROP或UPDATE操作。开启 Verbose 模式在调试阶段将verboseTrue打开这样你可以在控制台清晰地看到大模型生成的真实 SQL 语句便于排查逻辑错误。现在你的 AI 已经能够直接“看懂”你的业务数据库了接下来你想怎么升级结合 LangGraph将数据库查询作为一个工具节点整合到之前的多智能体客服系统中比如用户问“我的订单到哪了”Agent 自动查库并回复。结合 RAG 知识库实现“结构化数据SQL”与“非结构化文档PDF/TXT”的混合检索让 AI 既能查表又能查文档。二、Chroma/PGVector向量数据库适合RAG知识库构建 RAG检索增强生成系统是让大模型“有据可查”、解决知识盲区与幻觉问题的核心方案。在 LangChain 中Chroma 和 PGVector 是两种最常用的向量数据库选择Chroma 以轻量、易用著称非常适合快速原型开发和本地测试而 PGVector 依托于 PostgreSQL更适合需要与业务关系型数据共存、追求高并发与生产级稳定性的企业场景。下面为你分别梳理这两种向量数据库的接入与实战指南。方案一Chroma 向量数据库轻量级、快速上手Chroma 是一个以 AI 为原生的开源向量数据库无需额外配置数据库服务只需指定本地目录即可实现数据的持久化存储。1. 安装依赖pipinstall-qUlangchain-chroma0.1.2langchain-openai2. 核心实战代码fromlangchain_chromaimportChromafromlangchain_openaiimportOpenAIEmbeddingsfromlangchain_core.documentsimportDocument# 初始化嵌入模型embeddingsOpenAIEmbeddings()# 初始化向量存储并指定本地持久化目录vectorstoreChroma(collection_namemy_docs,embedding_functionembeddings,persist_directory./chroma_langchain_db# 数据将保存在本地此目录下)# 添加文档documents[Document(page_contentLangGraph 支持状态机和人工介入。,metadata{source:docs}),Document(page_contentChroma 是一个轻量级的向量数据库。,metadata{source:docs})]vectorstore.add_documents(documents)# 执行相似性搜索resultsvectorstore.similarity_search(LangGraph 有什么功能,k1)print(results.page_content)方案二PGVector 向量数据库生产级、企业首选如果你的系统已有 PostgreSQL 数据库使用 PGVector 是极佳的选择。它允许你在同一个数据库中同时管理结构化业务数据和向量数据。1. 安装依赖pipinstall-qUlangchain-postgres langchain-openai2. 核心实战代码fromlangchain_postgresimportPGVector,PGEnginefromlangchain_openaiimportOpenAIEmbeddingsfromlangchain_core.documentsimportDocument# 1. 配置 PostgreSQL 连接字符串需使用 psycopg3 驱动CONNECTION_STRINGpostgresqlpsycopg://user:passwordlocalhost:5432/mydatabaseVECTOR_SIZE1536# 根据你的嵌入模型维度设置如 OpenAI 为 1536# 2. 初始化引擎与向量存储enginePGEngine.from_connection_string(urlCONNECTION_STRING)embeddingOpenAIEmbeddings()# 初始化表结构如果表不存在会自动创建engine.init_vectorstore_table(table_nameenterprise_docs,vector_sizeVECTOR_SIZE)storePGVector.create_sync(engineengine,table_nameenterprise_docs,embedding_serviceembedding,)# 3. 插入文档并搜索docs[Document(page_contentPostgreSQL 支持混合搜索和元数据过滤。)]store.add_documents(docs)search_resultsstore.similarity_search(数据库有什么高级功能,k1)print(search_results.page_content) 生产环境避坑指南向量维度一致性在使用 PGVector 时务必确保建表时的vector_size与你的嵌入模型维度严格一致。如果在运行中途更换了嵌入模型通常需要清空旧表重新生成否则会导致维度不匹配的报错。数据持久化使用 Chroma 时务必在初始化时传入persist_directory并在添加数据后调用vectorstore.persist()或在初始化时配置自动同步否则重启服务后数据会丢失。混合检索优化如果追求更高的检索准确率PGVector 支持混合搜索Hybrid Search可以结合关键词检索与向量检索通过倒数排名融合RRF等算法返回更相关的结果。至此你的 AI 已经具备了强大的外部知识检索能力接下来你想怎么升级这套 RAG 系统结合 LangGraph 构建 RAG Agent让 AI 自主判断是否需要检索知识库甚至支持多步检索与自我反思。优化检索效果引入重排序Rerank、元数据过滤Metadata Filtering或混合检索大幅提升回答准确率。三、MongoDB文档型适合灵活SchemaMongoDB 作为典型的文档型 NoSQL 数据库凭借其灵活的 Schema 设计非常适合处理复杂、半结构化以及快速演变的非结构化数据如用户画像、物联网信号、多变的业务日志等。在 LangChain 生态中MongoDB 主要作为向量数据库Vector Store被深度集成用于构建 RAG检索增强生成应用。以下是 MongoDB 在 LangChain 中的接入与实战指南1. 安装核心依赖LangChain 提供了专门的 MongoDB 集成包。运行以下命令进行安装pipinstalllangchain-mongodb2. 核心实战代码向量存储与检索通过MongoDBAtlasVectorSearch组件你可以快速将 MongoDB 实例化为向量数据库并支持手动或自动嵌入。fromlangchain_mongodb.vectorstoresimportMongoDBAtlasVectorSearchfromlangchain_voyageaiimportVoyageAIEmbeddings# 也可替换为 OpenAIEmbeddings 等fromlangchain_core.documentsimportDocument# 1. 初始化嵌入模型embeddingVoyageAIEmbeddings()# 2. 使用连接字符串实例化向量存储# 格式示例: mongodbsrv://username:passwordcluster.mongodb.netvector_storeMongoDBAtlasVectorSearch.from_connection_string(connection_string你的MongoDB连接字符串,namespacemy_db.my_collection,# 指定数据库名.集合名embeddingembedding,index_namevector_index# MongoDB 向量搜索索引名称)# 3. 写入文档系统会自动生成嵌入向量docs[Document(page_contentMongoDB 支持灵活的文档模型适合处理复杂嵌套数据。,metadata{category:tech}),Document(page_contentLangChain 提供了丰富的工具链来连接各类数据库。,metadata{category:ai})]vector_store.add_documents(docs)# 4. 执行语义相似性搜索resultsvector_store.similarity_search(如何连接非关系型数据库,k1)print(results.page_content)3. 进阶能力Self-Querying自查询检索MongoDB 的文档模型天然适合存储丰富的元数据Metadata。LangChain 结合 MongoDB 支持自查询检索允许大模型在处理自然语言时自动提取过滤条件如年份、分类、评分等并在执行向量搜索前进行精准的元数据预过滤。这在处理海量异构数据时极为高效。 生产环境避坑与架构建议索引前置要求在使用MongoDBAtlasVectorSearch之前必须确保在 MongoDB 中提前创建好对应的 Vector Search Index否则检索会报错。Schema 灵活性的双刃剑与 SQL 数据库不同MongoDB 没有严格的表结构约束。如果让 LLM 直接生成查询语句极易出现“幻觉”例如查询不存在的字段。在生产中建议为 LLM 提供明确的 Schema 描述Metadata Layer作为上下文并在执行前增加字段存在性校验。混合数据架构MongoDB 现已支持多种数据类型结构化、时序、向量、图。在实际业务中你可以将业务文档与向量嵌入存储在同一个集合中利用其灵活的嵌套结构实现“业务数据 语义检索”的一体化。至此你已经掌握了 LangChain 中主流数据库SQL、Vector、NoSQL的接入方案接下来你想怎么升级这套系统构建混合检索 Agent结合 SQL查订单 MongoDB查文档 Tavily搜新闻让 AI 能够跨库联合推理。生产级数据管道探讨如何结合 LangChain 的 Document Loaders 和 Text Splitters将海量企业文档自动化清洗并灌入 MongoDB 向量库。