Vanna ollama 应用说明
·
Vanna 应用说明
写过文章,实现了vanna及ollama 当时环境不合适只能使用redis存保训练,这一次我匀用chromadb保存结果。
本文档提供了关于如何使用和理解 app.py 文件的详细说明。该文件包含了一个名为 MyVanna 的类,该类继承自 ChromaDB_VectorStore 和 Ollama,用于处理数据库操作和机器学习模型的训练。
类定义
MyVanna 类
MyVanna 类继承自 ChromaDB_VectorStore 和 Ollama。它通过接收配置参数来初始化这两个基类。
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 应用已启动")
更多推荐


所有评论(0)