MacBook Pro(M1)实战:用Ollama部署Mistral大模型并与MySQL交互

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

MacBook Pro(M1)实战:用Ollama部署Mistral大模型并与MySQL交互

引言

在本地运行大型语言模型(LLM)并使其与数据库交互是当前AI应用开发的热门方向。本文将指导你在MacBook Pro(M1)上使用Ollama部署Mistral大模型,并通过Python代码实现与MySQL数据库的交互。这种组合可以用于构建智能问答系统、数据分析助手等多种应用。

准备工作

环境要求

  • MacBook Pro with M1芯片
  • macOS Monterey(12.0)或更高版本
  • Python 3.8+
  • MySQL 8.0+

需要安装的软件

  1. Homebrew (macOS包管理器)
  2. Ollama (本地运行LLM的工具)
  3. MySQL (关系型数据库)
  4. Python依赖库

第一步:安装Ollama并部署Mistral模型

1. 安装Homebrew

如果你还没有安装Homebrew,打开终端执行:

代码片段
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

安装完成后,将Homebrew添加到PATH:

代码片段
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zshrc
source ~/.zshrc

2. 安装Ollama

使用Homebrew安装Ollama:

代码片段
brew install ollama

启动Ollama服务:

代码片段
ollama serve

保持这个终端窗口运行,新开一个终端窗口进行后续操作。

3. 下载Mistral模型

Mistral是一个高效的开源大语言模型,特别适合在消费级硬件上运行:

代码片段
ollama pull mistral

这将下载约4GB的模型文件(具体大小取决于你选择的版本)。

经验提示:第一次下载可能需要较长时间,取决于你的网络速度。建议在稳定的Wi-Fi环境下进行。

4. 测试Mistral模型

运行以下命令测试模型是否正常工作:

代码片段
ollama run mistral "请用中文介绍一下你自己"

你应该会看到类似这样的输出:

代码片段
你好!我是一个名为Mistral的人工智能助手...

第二步:安装和配置MySQL

1. 使用Homebrew安装MySQL

代码片段
brew install mysql

2. 启动MySQL服务

代码片段
brew services start mysql

3. 安全初始化MySQL

代码片段
mysql_secure_installation

按照提示设置root密码和其他安全选项。

4. 创建测试数据库和表

登录MySQL:

代码片段
mysql -u root -p

执行以下SQL创建数据库和表:

代码片段
CREATE DATABASE ai_demo;
USE ai_demo;

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

INSERT INTO products (name, description, price, category) VALUES 
('MacBook Pro', 'Apple笔记本电脑,M1芯片', 1299.99, 'Electronics'),
('iPhone 15', '最新款苹果手机', 799.99, 'Electronics'),
('Coffee Maker', '智能咖啡机', 89.50, 'Home'),
('Desk Lamp', 'LED护眼台灯', 45.30, 'Home');

第三步:Python环境配置与代码实现

1. 创建Python虚拟环境

代码片段
python3 -m venv ollama-mysql-env
source ollama-mysql-env/bin/activate

2. 安装必要的Python包

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

3. Python代码实现

创建一个名为mistral_mysql.py的文件,内容如下:

代码片段
import mysql.connector
from langchain_community.llms import Ollama

# MySQL数据库配置(实际项目中应该使用环境变量)
DB_CONFIG = {
    'host': 'localhost',
    'user': 'root',
    'password': '', # 替换为你的MySQL密码
    'database': 'ai_demo'
}

# Ollama配置 - Mistral模型默认运行在11434端口上(本地)
llm = Ollama(base_url='http://localhost:11434', model="mistral")

def query_database(query):
    """执行SQL查询并返回结果"""
    try:
        conn = mysql.connector.connect(**DB_CONFIG)
        cursor = conn.cursor(dictionary=True)
        cursor.execute(query)
        results = cursor.fetchall()
        return results if results else "查询没有返回结果"
    except Exception as e:
        return f"查询出错: {str(e)}"
    finally:
        if conn.is_connected():
            cursor.close()
            conn.close()

def generate_sql(natural_language_query):
    """使用LLM将自然语言转换为SQL"""
    prompt = f"""
    你是一个专业的SQL开发者。请将下面的自然语言查询转换为有效的MySQL查询语句。
    我们有一个名为products的表,包含字段:id, name, description, price, category。

    自然语言查询: {natural_language_query}

    只需要返回SQL语句,不需要解释。
    """

    sql_query = llm(prompt).strip()

    # LLM有时会在回答中添加引号或其他标记,我们需要清理一下输出结果

    # SQL语句通常以SELECT、INSERT、UPDATE或DELETE开头

    #查找第一个SELECT、INSERT、UPDATE或DELETE的位置

    for keyword in ['SELECT', 'select', 'INSERT', 'insert', 
                   'UPDATE', 'update', 'DELETE', 'delete']:
        pos = sql_query.find(keyword)
        if pos != -1:
            sql_query = sql_query[pos:]
            break

    #去除SQL语句末尾可能存在的分号或引号

    sql_query = sql_query.rstrip(';').rstrip('"').rstrip("'").rstrip("`")

    return sql_query + ";" #确保以分号结尾


def natural_language_to_data(natural_language_query):
    """完整的自然语言到数据结果的流程"""

    print(f"\n用户问题: {natural_language_query}")

    # Step1:生成SQL

    print("\n生成SQL...")

    sql_query = generate_sql(natural_language_query)

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


   # Step2:执行SQL

   print("\n执行SQL查询...")

   results = query_database(sql_query)

   # Step3:格式化结果

   print("\n查询结果:")

   if isinstance(results, str):
       print(results)
       return results

   for row in results:
       print(row)

if __name__ == "__main__":

   while True:
       user_input = input("\n请输入你的问题(或输入'退出'结束): ")

       if user_input.lower() in ['退出','exit','quit']:
           break

       natural_language_to_data(user_input)

print("\n程序结束。")

第四步:运行与测试

确保:

1.Ollama服务正在运行(ollamaserve)

2.MySQL服务正在运行(bre wservicesstartmysql)

然后执行Python脚本:

代码片段
pythonmistral_mysql.py  

测试示例:

代码片段
请输入你的问题(或输入'退出'结束):列出所有价格低于100美元的产品  

用户问题:列出所有价格低于100美元的产品  

生成SQL...  

生成的SQL:SELECT*FROMproductsWHEREprice<100;  

执行SQL查询...  

查询结果:  

{'id':3,'name':'CoffeeMaker','description':'智能咖啡机','price':89.50,'category':'Home'}  
{'id':4,'name':'DeskLamp','description':'LED护眼台灯','price':45.30,'category':'Home'}  
代码片段
请输入你的问题(或输入'退出'结束):电子产品中最贵的是什么  

用户问题:电子产品中最贵的是什么  

生成SQL...  

生成的SQL:SELECT*FROMproductsWHEREcategory='Electronics'ORDERBYpriceDESCLIMIT1;  

执行SQL查询...  

查询结果:  

{'id':1,'name':'MacBookPro','description':'Apple笔记本电脑,M1芯片','price':1299.99,'category':'Electronics'}  

第五步:高级功能扩展

如果你想进一步增强这个应用的功能,可以考虑:

1. 添加错误处理和改进的提示工程

修改generate_sql函数中的提示模板:

代码片段
prompt=f"""  
你是一个专业的MySQL开发者。请将下面的自然语言查询转换为有效的MySQL查询语句。  
我们有一个名为products的表,包含字段:id,name,description,price,category。  

规则:
-只返回标准的MySQL语法  
-不要包含任何解释性文字  
-如果问题不明确或有歧义,询问澄清问题而不是猜测意图  
-对于价格比较,默认使用美元作为单位  

自然语言查询:{natural_language_query}  

请直接返回有效的MySQL语句:"""  

2. 添加结果解释功能

在脚本中添加一个新函数:

代码片段
defexplain_results(results,natural_language_query):  
"""使用LLM解释查询结果"""  
ifisinstance(results,str):  
returnresults  

data_str="\n".join([str(row)forrowinresults])  

prompt=f"""  
根据以下数据和原始问题,提供一个简洁的解释和分析:  

原始问题:{natural_language_query}  

返回的数据:{data_str}  

请用中文提供一个简明的总结分析:"""  

explanation=llm(prompt)  

returnexplanation.strip()  

然后在natural_language_to_data函数中调用它:

代码片段
#在显示原始结果后添加以下代码  

print("\n分析解释:")  

explanation=explain_results(results,natural_language_query)  

print(explanation)  

常见问题解决

Q:Ollama运行时提示”notenoughmemory”(内存不足)

A:尝试较小的模型版本:

代码片段
ollamapullmistral7b#7B参数的较小版本  

或者在调用时限制最大token数:

代码片段
llm=Ollama(base_url='http://localhost11434',model="mistral",num_gpu=50,max_tokens=512)  

Q:生成的SQL语法不正确怎么办?

A:可以尝试以下方法改进:

1.优化提示模板-提供更明确的指令和示例

2.添加验证步骤-在执行前检查基本语法

3.手动修正-对于关键应用可添加人工审核步骤

4.尝试不同温度参数:降低温度值减少随机性

5.日志记录:记录失败的案例用于后续分析改进

6.后处理:自动修正常见错误模式如缺少分号等

7.多次采样:生成多个候选选择最合理的那个

8.特定领域微调:如果有足够数据可微调专用模型

9.混合方法:结合规则系统和LLM的优势

10.反馈机制:让用户标记错误答案用于持续改进

原创 高质量