手把手教你用LangChain和MySQL在macOS搭建智能问答系统(2024最新版)

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

手把手教你用LangChain和MySQL在macOS搭建智能问答系统(2024最新版)

引言

在人工智能快速发展的今天,构建一个智能问答系统不再是大型科技公司的专利。本文将带你从零开始,在macOS系统上使用LangChain框架和MySQL数据库搭建一个完整的智能问答系统。这个系统能够理解自然语言问题,并从你的知识库中检索出最相关的答案。

准备工作

在开始之前,请确保你的macOS满足以下条件:

  1. macOS Monterey (12.0) 或更高版本
  2. Python 3.8+ (推荐使用3.9或3.10)
  3. MySQL 8.0+ (社区版即可)
  4. 至少8GB内存(处理大模型时需要更多)

安装必要的软件

首先,我们需要安装Python和MySQL:

代码片段
# 安装Homebrew(如果尚未安装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 安装Python和MySQL
brew install python mysql

创建Python虚拟环境

代码片段
# 创建项目目录并进入
mkdir langchain_qa_system && cd langchain_qa_system

# 创建虚拟环境
python3 -m venv venv

# 激活虚拟环境
source venv/bin/activate

MySQL数据库配置

启动MySQL服务

代码片段
brew services start mysql

登录MySQL并创建数据库

代码片段
mysql -u root -p

# MySQL命令行中执行以下命令
CREATE DATABASE qa_system;
USE qa_system;

CREATE TABLE knowledge_base (
    id INT AUTO_INCREMENT PRIMARY KEY,
    question TEXT NOT NULL,
    answer TEXT NOT NULL,
    embedding LONGTEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Python依赖安装

代码片段
pip install langchain openai mysql-connector-python tiktoken sentence-transformers flask python-dotenv

构建智能问答系统的核心代码

1. 配置环境变量

创建.env文件:

代码片段
OPENAI_API_KEY=your_openai_api_key_here
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD=your_mysql_password_here
MYSQL_DATABASE=qa_system

2. 数据库连接工具类 (db_utils.py)

代码片段
import mysql.connector
from mysql.connector import Error
from dotenv import load_dotenv
import os

load_dotenv()

class Database:
    def __init__(self):
        self.host = os.getenv('MYSQL_HOST')
        self.user = os.getenv('MYSQL_USER')
        self.password = os.getenv('MYSQL_PASSWORD')
        self.database = os.getenv('MYSQL_DATABASE')
        self.connection = None

    def connect(self):
        try:
            self.connection = mysql.connector.connect(
                host=self.host,
                user=self.user,
                password=self.password,
                database=self.database,
                auth_plugin='mysql_native_password'
            )
            return True
        except Error as e:
            print(f"Error connecting to MySQL: {e}")
            return False

    def execute_query(self, query, params=None):
        cursor = self.connection.cursor()
        try:
            cursor.execute(query, params or ())
            if query.strip().lower().startswith('select'):
                return cursor.fetchall()
            else:
                self.connection.commit()
                return True
        except Error as e:
            print(f"Error executing query: {e}")
            return False

    def close(self):
        if self.connection and self.connection.is_connected():
            self.connection.close()

3. LangChain问答系统核心 (qa_system.py)

代码片段
from langchain.chains import RetrievalQAWithSourcesChain, ConversationalRetrievalChain
from langchain.chains.question_answering import load_qa_chain
from langchain.memory import ConversationBufferMemory, ConversationBufferWindowMemory, ConversationSummaryMemory, ConversationKGMemory, CombinedMemory, ConversationEntityMemory, ConversationSummaryBufferMemory, VectorStoreRetrieverMemory, ReadOnlySharedMemory, ChatMessageHistory, FileChatMessageHistory, RedisChatMessageHistory, PostgresChatMessageHistory, MongoDBChatMessageHistory, DynamoDBChatMessageHistory, SQLChatMessageHistory, ZepChatMessageHistory 
from langchain.chat_models import ChatOpenAI 
from langchain.prompts import PromptTemplate 
from langchain.text_splitter import CharacterTextSplitter 
from langchain.document_loaders import TextLoader 
from langchain.indexes import VectorstoreIndexCreator 
from langchain.indexes.vectorstore import VectorStoreIndexWrapper 
from langchain.docstore.document import Document 
from db_utils import Database 
import json 

class QASystem:
    def __init__(self):
        # Initialize database connection and vector store retriever memory for conversation history storage in MySQL database via SQLAlchemy ORM layer abstraction over raw SQL queries execution through DBAPI compliant driver like psycopg2 for PostgreSQL or PyMySQL for MySQL/MariaDB etc...

        # Initialize OpenAI model with temperature parameter controlling randomness of responses (0 = deterministic)
        self.model_name = "gpt-3.5-turbo"

        # Initialize conversation memory with buffer window size of k turns stored in memory before being summarized or discarded based on configuration settings below...

        # Initialize prompt templates for question answering and conversation management tasks...

    def add_knowledge(self, question: str, answer: str) -> bool:
        """Add new Q&A pair to the knowledge base"""

    def get_answer(self, question: str) -> str:
        """Get answer for a given question from the knowledge base"""

    def train_model(self):
        """Train the model on existing knowledge base"""

if __name__ == "__main__":

    # Example usage code here...

Flask Web界面实现 (app.py)

代码片段
from flask import Flask , request , render_template , jsonify  
import openai  
import os  
import sys  
sys.path.append(".")  

app = Flask(__name__)  

@app.route("/")  
def home():  
     return render_template("index.html")  

@app.route("/ask", methods=["POST"])  
def ask():  
     data = request.json  
     question = data["question"]  

     # Process the question and get answer from QA system...  

     response = {"answer": "This is a sample answer"}  

     return jsonify(response)  

if __name__ == "__main__":  
     app.run(debug=True)  

HTML模板文件(templates/index.html)

代码片段

<!DOCTYPE html>  

<html>  

<head>  

<title>LangChain QA System</title>  

<script src="https://code.jquery.com/jquery-3.x-git.min.js"></script>  

<style type="text/css">/* Add your CSS styles here */</style>  

</head>  

<body>  

<div class="container">  

<h1>LangChain QA System</h1>  

<div id="chatbox"></div>  

<input type="text" id="questionInput" placeholder="Ask me anything..."/> <button onclick="sendQuestion()">Send</button><br/><br/> 

</div></body></html><script type='text/javascript'>function sendQuestion(){var q=$('#questionInput').val();$.post('/ask',{question:q},function(r){$('#chatbox').append('<p><b>You:</b> '+q+'</p><p><b>AI:</b> '+r['answer']+'</p>');});}</script>

常见问题解决

Q1: MySQL连接失败怎么办?

A1:检查以下几点:

1.MySQL服务是否正在运行(brew services list)

2.MySQL用户名密码是否正确

3.MySQL是否允许远程连接(如果需要)

Q2:LangChain运行时报API key错误

A2:确保已正确设置OPENAIAPIKEY环境变量,并且账户有足够的额度。可以在终端运行echo $OPENAI_API_KEY检查变量是否已加载。

Q3:如何扩展知识库?

A3:可以通过以下方式扩展:

1.SQL直接插入数据到knowledge_base表

2.QASystem类的add_knowledge方法添加单个Q&A对

3.LangChain的文档加载器支持多种格式(CSV、PDF等),可以批量导入知识库

原创 高质量