Vanna 应用说明

写过文章,实现了vanna及ollama 当时环境不合适只能使用redis存保训练,这一次我匀用chromadb保存结果。
本文档提供了关于如何使用和理解 app.py 文件的详细说明。该文件包含了一个名为 MyVanna 的类,该类继承自 ChromaDB_VectorStoreOllama,用于处理数据库操作和机器学习模型的训练。

类定义

MyVanna 类

MyVanna 类继承自 ChromaDB_VectorStoreOllama。它通过接收配置参数来初始化这两个基类。

class MyVanna(ChromaDB_VectorStore, Ollama):
    def __init__(self, config=None):
        ChromaDB_VectorStore.__init__(self, config=config)
        Ollama.__init__(self, config=config)

实例化 MyVanna

创建 MyVanna 类的实例时,需要提供一个配置字典,包括模型信息、数据查看权限和服务器地址。

vn = MyVanna(config={'model': 'qwen2.5-coder:latest', 'llow_llm_to_see_data': True, 'ollama_host': 'http://127.0.0.1:11434'})

数据库连接

使用 connect_to_mysql 方法连接到 MySQL 数据库。

vn.connect_to_mysql(host='127.0.0.1', dbname='test', user='root', password='123456', port=3306)

SQL 操作

执行 SQL 查询以获取数据库的信息架构,这对于后续的数据处理和训练非常重要。

df_information_schema = vn.run_sql("SELECT * FROM INFORMATION_SCHEMA.COLUMNS")

训练数据准备

通过 SQL 创建新的数据表 customer,并定义了各个字段。

ddl = """
CREATE TABLE `customer` (
    `name` int NOT NULL COMMENT '姓名',
    `gender` int DEFAULT NULL COMMENT '性别(男性=1, 女性=2)',
    `id_card` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '身份证',
    `mobile` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '手机',
    `nation` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '民族',
    `city` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '居住城市',
    `age` int DEFAULT NULL COMMENT '岁数 年纪',
    `salary` int NOT NULL COMMENT '薪水',
    PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='customer'
"""
vn.train(ddl=ddl)

示例查询训练

定义一系列 SQL 查询作为训练示例,用于训练机器学习模型。

examples = [
    {'question': "宁波用户表", 'sql': "SELECT * FROM customer WHERE city like '%宁波%'"},
    {'question': "宁波女性用户数量?", 'sql': "SELECT COUNT(*) as count FROM customer WHERE gender = '女' and city like '%宁波%'"},
    {'question': "全国女性用户数量?", 'sql': "SELECT COUNT(*) as count FROM customer WHERE gender = '女'"},
    {'question': "年龄最大的用户?", 'sql': "SELECT * FROM customer ORDER BY age DESC LIMIT 1"},
    {'question': "用户平均年龄是多少?", 'sql': "SELECT AVG(age) as average_age FROM customer"}
]

Flask 应用

初始化 Flask 应用并启动。

if __name__ == '__main__':
    app = VannaFlaskApp(vn)
    print(f"服务已启动,访问地址: http://127.0.0.1:6666")
    app.run(host='127.0.0.1', port=6666, debug=True)

此文档提供了 app.py 文件的核心功能和代码解释,帮助用户更好地理解和使用该应用。

from vanna.ollama import Ollama
from vanna.chromadb import ChromaDB_VectorStore
from vanna.flask import VannaFlaskApp
class MyVanna(ChromaDB_VectorStore, Ollama):
    def __init__(self, config=None):
        ChromaDB_VectorStore.__init__(self, config=config)
        Ollama.__init__(self, config=config)

vn = MyVanna(config={'model': 'qwen2.5-coder:latest','llow_llm_to_see_data':True,'ollama_host':'http://127.0.0.1:11434'})






vn.connect_to_mysql(host='127.0.0.1', dbname='test', user='root', password='123456', port=3306)

# The information schema query may need some tweaking depending on your database. This is a good starting point.
df_information_schema = vn.run_sql("SELECT * FROM INFORMATION_SCHEMA.COLUMNS")

# This will break up the information schema into bite-sized chunks that can be referenced by the LLM
plan = vn.get_training_plan_generic(df_information_schema)

ddl = """
         CREATE TABLE `customer` (
        `name` int NOT NULL COMMENT '姓名',
        `gender` int DEFAULT NULL COMMENT '性别(男性=1 ,女性=2)',
        `id_card` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '身份证',
        `mobile` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '手机',
        `nation` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '民族',
        `city` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '居住城市',
        `age` int DEFAULT NULL COMMENT '岁数 年纪',
        `salary` int NOT NULL COMMENT '薪水',
        PRIMARY KEY (`name`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='customer'
        """
vn.train(ddl=ddl)

print("DDL 训练完成")

        # 训练示例查询
examples = [
    # {
    #     'question': "司机接单数",
    #     'sql': "SELECT COUNT(*) as count FROM t_driver"
    # },
    {
        'question': "宁波用户表",
        'sql': "SELECT * FROM customer WHERE city like '%宁波%'"
    },
    {
        'question': "宁波女性用户数量?",
        'sql': "SELECT COUNT(*) as count FROM customer WHERE gender = '女' and city like '%宁波%'"
    },
    {
        'question': "全国女性用户数量?",
        'sql': "SELECT COUNT(*) as count FROM customer WHERE gender = '女'"
    },
    {
        'question': "年龄最大的用户?",
        'sql': "SELECT * FROM customer ORDER BY age DESC LIMIT 1"
    },
    {
        'question': "用户平均年龄是多少?",
        'sql': "SELECT AVG(age) as average_age FROM customer"
    }
]

for example in examples:
            print(f"\n训练示例: {example['question']}")
            vn.train(question=example['question'], sql=example['sql'])



if __name__ == '__main__':
    app = VannaFlaskApp(vn)
    print(f"服务已启动,访问地址: http://127.0.0.1:6666")
    app.run(host='127.0.0.1', port=6666, debug=True)
    print("Flask 应用已启动")
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐