Ubuntu 22.04 LTS最佳实践:使用LangChain实现MySQL数据向量化存储

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

Ubuntu 22.04 LTS最佳实践:使用LangChain实现MySQL数据向量化存储

引言

在AI应用开发中,将结构化数据转换为向量形式是实现语义搜索、推荐系统等高级功能的关键步骤。本文将指导你在Ubuntu 22.04 LTS系统上,使用LangChain框架将MySQL数据库中的数据转换为向量并存储。

准备工作

环境要求

  • Ubuntu 22.04 LTS系统
  • Python 3.8或更高版本
  • MySQL服务器(本地或远程)
  • 基本的Python编程知识

安装必要组件

代码片段
# 更新系统包
sudo apt update && sudo apt upgrade -y

# 安装Python和pip
sudo apt install python3 python3-pip -y

# 安装MySQL客户端和开发库
sudo apt install mysql-client libmysqlclient-dev -y

# 安装Python虚拟环境工具
pip3 install virtualenv

项目设置

  1. 创建项目目录
代码片段
mkdir langchain-mysql-vectorization && cd langchain-mysql-vectorization
  1. 创建并激活虚拟环境
代码片段
python3 -m virtualenv venv
source venv/bin/activate
  1. 安装依赖包
代码片段
pip install langchain openai mysql-connector-python tiktoken faiss-cpu numpy pandas

MySQL数据库配置

  1. 准备示例数据表

假设我们有一个简单的产品表:

代码片段
CREATE DATABASE IF NOT EXISTS product_db;
USE product_db;

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    description TEXT,
    category VARCHAR(100),
    price DECIMAL(10,2),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 插入示例数据
INSERT INTO products (name, description, category, price) VALUES 
('智能手机X', '最新款智能手机,6.5英寸屏幕,128GB存储', '电子', 599.99),
('无线耳机Pro', '降噪无线耳机,30小时续航', '电子', 199.99),
('棉质T恤', '100%纯棉,多种颜色可选', '服装', 29.99),
('咖啡机', '全自动咖啡机,15bar压力', '家电', 349.99);

LangChain实现向量化存储

1. MySQL连接配置

创建config.py文件存储数据库配置:

代码片段
# config.py
MYSQL_CONFIG = {
    'host': 'localhost',
    'user': 'your_username',
    'password': 'your_password',
    'database': 'product_db'
}

2. MySQL数据加载器

创建mysql_loader.py文件:

代码片段
# mysql_loader.py
import mysql.connector
from config import MYSQL_CONFIG

class MySQLLoader:
    def __init__(self):
        self.connection = mysql.connector.connect(**MYSQL_CONFIG)

    def load_products(self):
        """从MySQL加载产品数据"""
        cursor = self.connection.cursor(dictionary=True)
        query = "SELECT id, name, description, category FROM products"
        cursor.execute(query)
        return cursor.fetchall()

    def close(self):
        """关闭数据库连接"""
        self.connection.close()

3. LangChain向量化处理

创建vectorizer.py文件:

代码片段
# vectorizer.py
from langchain.text_splitter import CharacterTextSplitter
from langchain.document_loaders import TextLoader
from langchain.document_loaders import DataFrameLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS
import pandas as pd

class DataVectorizer:
    def __init__(self, openai_api_key):
        self.openai_api_key = openai_api_key

    def vectorize_data(self, data):
        """
        将结构化数据转换为向量

        参数:
            data: List[dict] - MySQL查询结果

        返回:
            FAISS向量存储对象
        """
        # 转换为DataFrame以便处理
        df = pd.DataFrame(data)

        # LangChain DataFrame加载器会自动处理文本字段的拆分和嵌入生成

        # OpenAI嵌入模型初始化 (确保已设置OPENAI_API_KEY环境变量)
        embeddings = OpenAIEmbeddings(openai_api_key=self.openai_api_key)

        # FAISS作为本地向量存储 (无需额外服务)

        # LangChain文档格式转换 (每个产品作为一个文档)
        documents = []

        for _, row in df.iterrows():
            content = f"Name: {row['name']}\nDescription: {row['description']}\nCategory: {row['category']}"
            metadata = {"id": row["id"], "source": "mysql"}
            documents.append({"page_content": content, "metadata": metadata})

        # FAISS向量存储创建和索引构建 (内存中)

        db = FAISS.from_documents(
            documents=[Document(**doc) for doc in documents],
            embedding=embeddings,
            metadatas=[doc["metadata"] for doc in documents]
        )

        return db

    def save_vector_store(self, db, path="faiss_index"):
        """保存向量存储到本地"""
        db.save_local(path)

    def load_vector_store(self, path="faiss_index"):
        """从本地加载向量存储"""
        embeddings = OpenAIEmbeddings(openai_api_key=self.openai_api_key)
        return FAISS.load_local(path, embeddings)

4. 主程序整合

创建main.py文件:

代码片段
# main.py
from mysql_loader import MySQLLoader 
from vectorizer import DataVectorizer 
import os 

def main():
    # MySQL数据加载 
    loader = MySQLLoader() 

    try:
        products = loader.load_products() 

        if not products:
            print("没有获取到产品数据")
            return

         # OpenAI API密钥 (建议通过环境变量设置) 
         openai_api_key = os.getenv("OPENAI_API_KEY") 

         if not openai_api_key:
             raise ValueError("请设置OPENAI_API_KEY环境变量")

          # 数据向量化处理 
          vectorizer = DataVectorizer(openai_api_key) 
          vector_db = vectorizer.vectorize_data(products) 

          #保存向量索引 
          vectorizer.save_vector_store(vector_db) 

          print(f"成功处理{len(products)}条记录并生成向量索引")

     finally:
         loader.close() 

if __name__ == "__main__":
     main()

运行程序

  1. 设置OpenAI API密钥

bash export OPENAI_API_KEY="your-api-key-here"

2.执行主程序

bash python main.py

验证结果

创建一个测试脚本 query_test.py:

代码片段
# query_test.py from vectorizer import DataVectorizer from config import MYSQL_CONFIG import os 

def test_query(query): """测试语义搜索""" openai_api_key=os.getenv("OPENAI_API_KEY") vectorizer=DataVectorizer(openai_api_key) db=vectorizer.load_vector_store() results=db.similarity_search(query,k=2) for i,doc in enumerate(results): print(f"\n结果{i+1}:") print(f"内容:{doc.page_content}") print(f"元数据:{doc.metadata}") print(f"相似度得分:{db.similarity_search_with_score(query)[i][1]}") if __name__=="__main__": query=input("请输入搜索查询:") test_query(query)

运行测试:

bash python query_test.py

尝试输入如”高科技电子产品”或”便宜的日常用品”,观察返回的结果及其相似度得分。

最佳实践和注意事项

1.性能优化 -批量处理大量数据时考虑分页查询 -对于大型数据集考虑使用专门的向量数据库如Pinecone或Weaviate

2.安全考虑 -不要将API密钥硬编码在代码中 -MySQL连接使用最小权限原则

3.错误处理 -添加重试逻辑应对API限流 -实现完善的日志记录

4.维护性 -定期更新嵌入模型版本 -监控向量质量随时间的变化

5.资源管理 -FAISS索引会占用内存,大型数据集需要更多资源 -考虑定期重建索引以保持新鲜度

总结

本文演示了在Ubuntu22 .04LTS上使用LangChain实现MySQL数据向量化的完整流程:

1 .设置Python环境和依赖项
2 .准备MySQL示例数据库
3 .使用LangChain的数据加载器和OpenAI嵌入模型
4 .构建FAISS本地向量存储
5 .实现语义搜索功能

这种技术栈可以扩展到各种应用场景如:
-电子商务产品推荐
-客户支持知识库
-内容管理系统

通过将结构化数据转化为语义向量,我们解锁了传统SQL查询无法实现的模糊匹配和语义理解能力。

原创 高质量