macOS Monterey手把手教程:MySQL 8.0 + LangChain构建智能问答系统

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

macOS Monterey手把手教程:MySQL 8.0 + LangChain构建智能问答系统

引言

在本教程中,我们将学习如何在macOS Monterey系统上搭建一个基于MySQL 8.0和LangChain的智能问答系统。这个系统能够理解自然语言问题,并从数据库中检索相关信息给出回答。非常适合需要处理结构化数据的应用场景。

准备工作

在开始之前,请确保你的macOS Monterey系统满足以下要求:

  • macOS Monterey (12.0+) 操作系统
  • Python 3.8+ 环境
  • Homebrew 包管理器
  • 至少4GB可用内存
  • 10GB可用磁盘空间

第一部分:安装和配置MySQL 8.0

1.1 使用Homebrew安装MySQL

打开终端(Terminal)并执行以下命令:

代码片段
# 更新Homebrew确保是最新版本
brew update

# 安装MySQL 8.0
brew install mysql@8.0

# 将MySQL添加到PATH环境变量
echo 'export PATH="/usr/local/opt/mysql@8.0/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

1.2 启动MySQL服务并设置密码

代码片段
# 启动MySQL服务
brew services start mysql@8.0

# 安全初始化,设置root密码(记住这个密码,后面会用到)
mysql_secure_installation

按照提示操作:
1. 输入当前root密码(初始为空,直接回车)
2. 设置新的root密码并确认
3. 移除匿名用户?输入Y
4. 禁止root远程登录?根据需求选择(开发环境可以选N)
5. 移除测试数据库?输入Y
6. 重新加载权限表?输入Y

1.3 MySQL基本配置检查

代码片段
# 登录MySQL(使用刚才设置的密码)
mysql -u root -p

# MySQL命令行中查看版本信息
SELECT VERSION();

# 创建一个测试数据库和用户(在MySQL命令行中执行)
CREATE DATABASE qa_system;
CREATE USER 'qa_user'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON qa_system.* TO 'qa_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

注意事项
– MySQL默认监听3306端口,确保没有被其他应用占用
– macOS可能会提示防火墙权限,允许MySQL的网络连接

第二部分:准备Python环境和LangChain库

2.1 Python虚拟环境创建与激活

代码片段
# Python虚拟环境可以隔离项目依赖
python3 -m venv langchain_env
source langchain_env/bin/activate

2.2 安装必要的Python包

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

包说明
langchain: LLM应用开发框架核心库
openai: OpenAI API官方客户端
mysql-connector-python: MySQL官方Python驱动
python-dotenv: .env文件支持
sqlalchemy: ORM工具
pymysql: MySQL替代连接器
tiktoken: OpenAI token计数器

2.3 OpenAI API密钥配置

创建.env文件保存API密钥:

代码片段
echo "OPENAI_API_KEY=your_api_key_here" > .env 

安全提示
– .env文件不要提交到版本控制(添加到.gitignore)
– API密钥是敏感信息,不要直接硬编码在脚本中

第三部分:构建智能问答系统核心功能

3.1 MySQL数据库准备与示例数据导入

首先创建一个示例表存储常见问答对:

代码片段
-- MySQL命令行中执行(先登录:mysql -u root -p)
USE qa_system;

CREATE TABLE faq (
    id INT AUTO_INCREMENT PRIMARY KEY,
    question VARCHAR(255) NOT NULL,
    answer TEXT NOT NULL,
    category VARCHAR(50),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX (question(100)),
    INDEX (category)
);

--插入示例数据 
INSERT INTO faq (question, answer, category) VALUES 
('什么是LangChain?', 'LangChain是一个用于开发由语言模型驱动的应用程序的框架。', '技术'),
('如何安装MySQL?', '可以使用Homebrew命令 brew install mysql@8.0来安装。', '技术'),
('MacBook电池如何保养?', '建议保持电量在20%-80%之间,避免长时间满电存放。', '硬件'),
('Python虚拟环境有什么用?', '虚拟环境可以隔离项目依赖,避免不同项目间的包冲突。', '技术');

3.2 Python代码实现问答系统核心功能

创建qa_system.py文件:

代码片段
import os
from dotenv import load_dotenv
from langchain.chains import SQLDatabaseChain, LLMChain, ConversationalRetrievalChain, RetrievalQAWithSourcesChain, create_sql_query_chain, create_extraction_chain, create_tagging_chain, create_qa_with_structure_chain, create_openapi_chain, create_openapi_agent, create_pandas_dataframe_agent, create_csv_agent, create_sql_agent, VectorDBQAWithSourcesChain, VectorDBQAWithSourcesAndMemoryChain, VectorDBQAWithSourcesAndMemoryAndChatHistoryChain, VectorDBQAWithSourcesAndMemoryAndChatHistoryAndCustomPromptsChain, VectorDBQAWithSourcesAndMemoryAndChatHistoryAndCustomPromptsAndCustomRetrieverChain 
from langchain.sql_database import SQLDatabase 
from langchain.chat_models import ChatOpenAI 
from langchain.prompts import PromptTemplate 

# Load environment variables 
load_dotenv()

class QASystem:
    def __init__(self):
        # Initialize database connection 
        self.db = SQLDatabase.from_uri(
            "mysql+pymysql://qa_user:your_password@localhost:3306/qa_system",
            include_tables=['faq'],
            sample_rows_in_table_info=2)

        # Initialize LLM with temperature=0 for more deterministic outputs 
        self.llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")

        # Create SQL chain that can query the database 
        self.db_chain = SQLDatabaseChain.from_llm(
            self.llm,
            self.db,
            verbose=True,
            return_intermediate_steps=True)

        # Define prompt template for question answering 
        self.prompt = PromptTemplate(
            input_variables=["input", "table_info", "dialect"],
            template="""
            你是一个专业的问答助手。基于以下数据库表信息回答问题:

            表结构:
            {table_info}

            问题: {input}

            请使用中文回答。
            """)

    def ask(self, question):
        try:
            # Execute the chain with the user's question 
            result = self.db_chain({
                "input": question,
                "table_info": self.db.get_table_info(),
                "dialect": self.db.dialect})

            # Extract and return the answer 
            return result['result']
        except Exception as e:
            return f"抱歉,处理问题时出错: {str(e)}"

if __name__ == "__main__":
    system = QASystem()

    while True:
        user_input = input("\n请输入你的问题(输入'退出'结束): ")
        if user_input.lower() in ['退出', 'exit']:
            break

        response = system.ask(user_input)
        print("\n回答:", response)

代码解释

1.数据库连接配置
SQLDatabase.from_uri()方法建立与MySQL的连接,指定了用户名、密码、主机和数据库名。
include_tables参数限制只访问faq表增强安全性。
sample_rows_in_table_info让LLM了解表数据结构。

2.LLM初始化
ChatOpenAI封装了GPT-3.5-turbo模型。
temperature=0使输出更确定而非随机。

3.SQL链构造
SQLDatabaseChain将自然语言转换为SQL查询并执行。
verbose=True显示中间步骤方便调试。

4.提示模板
-定制化prompt引导模型专注于表格数据。
-明确要求中文回答保证输出一致性。

5.异常处理
-捕获可能出现的数据库或API错误。

第四部分:运行与测试

启动问答系统:

代码片段
python qa_system.py 

测试示例:

代码片段
请输入你的问题(输入'退出'结束): LangChain是什么?
回答: LangChain是一个用于开发由语言模型驱动的应用程序的框架。

请输入你的问题(输入'退出'结束): Mac电池应该怎么维护?
回答: MacBook电池建议保持电量在20%-80%之间,避免长时间满电存放。

请输入你的问题(输入'退出'结束): Python虚拟环境的作用是什么?
回答: Python虚拟环境可以隔离项目依赖,避免不同项目间的包冲突。

第五部分:高级功能扩展

5.1支持更复杂的查询

修改ask()方法增加多表关联能力:

代码片段
def ask(self, question):
    try:
        # First try direct FAQ match 
        direct_query = f"SELECT answer FROM faq WHERE question LIKE '%{question}%'"
        with self.db._engine.connect() as conn:
            direct_result = conn.execute(direct_query).fetchone()

        if direct_result:
            return direct_result[0]

        # Fallback to LLM for complex queries 
        result = self.db_chain({
            "input": f"请用中文回答: {question}",
            "table_info": self.db.get_table_info(),
            "dialect": self.db.dialect})

        return result['result']

    except Exception as e:
        return f"处理出错: {str(e)}"

5.2添加对话记忆

引入ConversationBufferMemory:

代码片段
from langchain.memory import ConversationBufferMemory 

class QASystem:
    def __init__(self):
        # ...保持原有初始化...

        # Add memory component 
        self.memory = ConversationBufferMemory()

    def ask(self, question):
        try:
            result = self.db_chain({
                "input": {"question": question},
                "memory": self.memory.load_memory_variables({})})

            # Save context to memory 
            self.memory.save_context(
                {"input": question},
                {"output": result['result']})

            return result['result']

       except Exception as e:
           return str(e)

第六部分:性能优化建议

1.索引优化

代码片段
ALTER TABLE faq ADD FULLTEXT INDEX ft_idx (question);<br>
   

2.连接池配置

代码片段
from sqlalchemy.pool import QueuePool 

db = SQLDatabase.from_uri(
    "...",
    engine_args={"poolclass": QueuePool,"pool_size":5,"max_overflow":10})<br>
   

3.缓存机制

代码片段
from langchain.cache import InMemoryCache 

llm = ChatOpenAI(cache=InMemoryCache())<br>
   

第七部分:常见问题解决

Q1: MySQL服务无法启动

代码片段
Error: Permission denied when starting mysqld 

解决方案:
sudo chown -R _mysql:_mysql /usr/local/var/mysql/
sudo chmod -R ug+rwx /usr/local/var/mysql/
brew services restart mysql@8.0  

Q2: Python连接MySQL报认证错误

代码片段
Authentication plugin 'caching_sha2_password' cannot be loaded  

解决方案:
ALTER USER 'qa_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
FLUSH PRIVILEGES;

Q3: LangChain响应慢

代码片段
可以尝试:
1.model_name="gpt-3.5-turbo-instruct"(更快但稍弱)
2.streaming=True实现流式响应  

总结

本教程详细演示了如何在macOS Monterey上:

1.部署MySQL:通过Homebrew安装并安全配置
2.集成LangChain:建立自然语言到SQL的转换管道
3.构建完整QA系统:包含错误处理和记忆功能

关键优势:
✓利用现有结构化数据 ✓无需训练专用模型 ✓支持复杂查询理解

扩展方向:接入更多数据源、添加用户认证、部署Web界面等

原创 高质量