Windows 11下手把手教程:使用LangChain构建MySQL数据库智能问答系统

云信安装大师
90
AI 质量分
11 5 月, 2025
3 分钟阅读
0 阅读

Windows 11下手把手教程:使用LangChain构建MySQL数据库智能问答系统

引言

在当今数据驱动的时代,如何让非技术人员也能轻松查询数据库信息是一个重要课题。本教程将教你如何在Windows 11环境下,使用LangChain框架构建一个能够理解自然语言并查询MySQL数据库的智能问答系统。

准备工作

环境要求

  1. Windows 11操作系统
  2. Python 3.8或更高版本
  3. MySQL Server 8.0+ (本地或远程均可)
  4. 基础的Python编程知识

需要安装的软件包

我们将使用以下Python库:
– langchain (核心框架)
– openai (用于语言模型)
– mysql-connector-python (MySQL连接器)
– python-dotenv (管理环境变量)

第一步:环境配置

1.1 安装Python依赖

打开命令提示符(CMD)或PowerShell,执行以下命令:

代码片段
pip install langchain openai mysql-connector-python python-dotenv

1.2 准备MySQL数据库

确保你有一个可用的MySQL数据库。如果没有,可以安装MySQL Community Server:

代码片段
# 下载MySQL Installer(社区版)
# https://dev.mysql.com/downloads/installer/

创建测试数据库和表:

代码片段
CREATE DATABASE company;
USE company;

CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    department VARCHAR(100),
    salary DECIMAL(10,2),
    hire_date DATE
);

INSERT INTO employees (name, department, salary, hire_date) VALUES
('张三', '技术部', 8500.00, '2020-05-15'),
('李四', '市场部', 7500.00, '2019-11-20'),
('王五', '人力资源部', 6800.00, '2021-03-10');

第二步:配置LangChain环境

2.1 创建项目结构

代码片段
my_qa_project/
│   .env          # 存储敏感信息
│   app.py        # 主程序文件
│   config.py     # 配置文件

2.2 设置环境变量(.env)

代码片段
OPENAI_API_KEY=你的OpenAI_API密钥
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=你的数据库密码
DB_NAME=company

注意:不要将此文件提交到版本控制系统中!

第三步:编写核心代码

3.1 config.py – 配置文件

代码片段
from dotenv import load_dotenv
import os

load_dotenv()

class Config:
    OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
    DB_CONFIG = {
        'host': os.getenv("DB_HOST"),
        'user': os.getenv("DB_USER"),
        'password': os.getenv("DB_PASSWORD"),
        'database': os.getenv("DB_NAME")
    }

3.2 app.py – 主程序文件

代码片段
from langchain.chat_models import ChatOpenAI
from langchain.chains import create_sql_query_chain
from langchain.sql_database import SQLDatabase
from config import Config

# MySQL数据库连接设置(替换为你的实际配置)
db = SQLDatabase.from_uri(
    f"mysql+mysqlconnector://{Config.DB_CONFIG['user']}:{Config.DB_CONFIG['password']}@{Config.DB_CONFIG['host']}/{Config.DB_CONFIG['database']}"
)

# 初始化语言模型(我们使用gpt-3.5-turbo)
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0, api_key=Config.OPENAI_API_KEY)

# 创建SQL查询链
query_chain = create_sql_query_chain(llm, db)

def run_query(question):
    try:
        # Step1:生成SQL查询语句
        query = query_chain.invoke({"question": question})
        print(f"生成的SQL: {query}")

        # Step2:执行SQL并获取结果(通过LangChain内置方法)
        result = db.run(query)

        return {
            "question": question,
            "sql_query": query,
            "result": result,
            "error": None
        }
    except Exception as e:
        return {
            "question": question,
            "sql_query": None,
            "result": None,
            "error": str(e)
        }

if __name__ == "__main__":
    while True:
        user_input = input("\n请输入你的问题(输入'exit'退出): ")

        if user_input.lower() == 'exit':
            break

        response = run_query(user_input)

        if response["error"]:
            print(f"错误: {response['error']}")
        else:
            print("\n查询结果:")
            print(response["result"])

第四步:运行和测试系统

启动程序:

代码片段
python app.py

测试示例:

代码片段
请输入你的问题(输入'exit'退出): 技术部有哪些员工?
生成的SQL: SELECT name FROM employees WHERE department = '技术部'

查询结果:
[('张三',)]
代码片段
请输入你的问题(输入'exit'退出): salary最高的员工是谁?
生成的SQL: SELECT name FROM employees ORDER BY salary DESC LIMIT 1

查询结果:
[('张三',)]

第五步:高级功能扩展(可选)

5.1 SQL查询验证器

为了防止生成不安全的SQL,可以添加验证层:

代码片段
from sqlvalidator import parse_sql

def validate_sql(sql):
    try:
        parsed_sql = parse_sql(sql)
        if not parsed_sql.is_valid():
            raise ValueError(f"无效的SQL: {parsed_sql.errors}")

        # Add more security checks here if needed

        return True

    except Exception as e:
        raise ValueError(f"SQL验证失败: {str(e)}")

修改run_query函数:

代码片段
def run_query(question):
    try:
        query = query_chain.invoke({"question": question})

        # Add validation step here
        validate_sql(query)

        print(f"生成的SQL: {query}")

5.2 HTML界面集成(使用Gradio)

安装Gradio:

代码片段
pip install gradio

添加界面代码:

代码片段
import gradio as gr

def qa_interface(question):
    response = run_query(question)

    if response["error"]:
        return f"错误: {response['error']}"

    output = f"""
    问题: {response['question']}

    生成的SQL: 
    ```sql{response['sql_query']
代码片段
结果:
{response['result']}
"""

return output

if name == “main“:
# Replace the previous while loop with this

代码片段
demo = gr.Interface(
    fn=qa_interface,
    inputs="text",
    outputs="text",
    title="MySQL智能问答系统",
    description="输入自然语言问题,系统将查询MySQL数据库并返回结果"
)

demo.launch()
代码片段

运行后会自动打开浏览器界面。

## 常见问题解决

1. **连接MySQL失败**
   - `mysqlclient`报错:尝试安装`mysqlclient`或使用`pymysql`作为替代驱动。
   - `Authentication plugin caching_sha2_password`错误:在MySQL中创建用户时指定密码插件:
     ```sql CREATE USER 'username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
  1. OpenAI API密钥无效

    • InvalidRequestError:检查API密钥是否正确,是否有足够的配额。
  2. 生成的SQL语法错误

    • LangChain有时会生成不正确的SQL。可以添加更多的表结构信息帮助模型理解。
  3. 性能优化

    • GPT-4通常比GPT-3.5生成更准确的SQL但成本更高。
    • temperature参数设置为0可以减少随机性。

总结与最佳实践

通过本教程,你已经学会了:
1. LangChain与MySQL集成的完整流程。
2.如何将自然语言转换为有效的SQL查询。
3.LangChain应用的基本架构。

最佳实践建议:
1.安全性:永远不要直接将用户输入传递给数据库执行。
2.性能:对于复杂查询,考虑添加索引优化性能。
3.监控:记录所有生成的查询以便后续分析改进。
4.扩展性:随着数据增长,考虑向量数据库等更高级方案。

现在你已经拥有了一个功能完整的智能问答系统!可以进一步扩展功能,比如添加更多表、支持复杂查询或集成到Web应用中。

原创 高质量