问数:试玩Vanna+deepseek v3+ChromaDB

业务架构图了算是它的

它有一个云服务吧

可以生成API的key
但其实我后来放弃了,没用它这个模式
我一开始误以为它不支持windows,所以花了一点时间切换到wsl2下面去
sudo apt install pipx
pipx install uv
pipx ensurepath
lemonhall@LEMON-HP-LAPTOP:~$ cd vanna_cloud_demo/
lemonhall@LEMON-HP-LAPTOP:~/vanna_cloud_demo$ uv init
Initialized project `vanna-cloud-demo`
lemonhall@LEMON-HP-LAPTOP:~/vanna_cloud_demo$ uv venv
Using CPython 3.12.3 interpreter at: /usr/bin/python3.12
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate
lemonhall@LEMON-HP-LAPTOP:~/vanna_cloud_demo$ source .venv/bin/activate
(vanna_cloud_demo) lemonhall@LEMON-HP-LAPTOP:~/vanna_cloud_demo$
安装uv和建立环境
(vanna_cloud_demo) lemonhall@LEMON-HP-LAPTOP:~/vanna_cloud_demo$ uv add vanna
Resolved 42 packages in 14.80s
error: Distribution `kaleido==0.2.1.post1 @ registry+https://pypi.org/simple` can't be
installed because it doesn't have a source distribution or wheel for the current platform
hint: You're on Linux (`manylinux_2_39_x86_64`), but `kaleido` (v0.2.1.post1) only has
wheels for the following platform: `manylinux2014_armv7l`
(vanna_cloud_demo) lemonhall@LEMON-HP-LAPTOP:~/vanna_cloud_demo$

官方默认的一个依赖库是有问题的
所以只好稍微绕一下
uv pip install kaleido==1.0.0rc0
安装它的最新版本的,1.0.0rc0
uv pip install vanna --no-deps # 避免覆盖已安装的kaleido
uv add pandas
uv add requests
uv add plotly
uv add sqlparse
uv add flask
uv add flasgger
uv add flask_sock
上面那个有问题的库,其实就是用来画图的
这块,略微有点影响体验,减分了,官方维护的不太好看来
sudo apt install sqlite3
安装sqlite3
uv pip install 'vanna[chromadb,openai]'
安装向量库和openai依赖

别看是官方的示例数据库,表还不少

训练数据其实就是是一张表的DDL
https://github.com/vanna-ai/vanna/blob/main/src/vanna/deepseek/deepseek_chat.py
然后根据官方仓库里的deepseek支持的写法
from vanna.openai import OpenAI_Chat
from vanna.chromadb import ChromaDB_VectorStore
from vanna.base import VannaBase
import os
from openai import OpenAI
class DeepSeekChat(VannaBase):
def __init__(self, config=None):
api_key = 'xxxxxxxxxx'
model = 'xxxxxxxxxxxx'
self.model = model
self.client = OpenAI(api_key=api_key, base_url="https://ark.cn-beijing.volces.com/api/v3")
def system_message(self, message: str) -> any:
return {"role": "system", "content": message}
def user_message(self, message: str) -> any:
return {"role": "user", "content": message}
def assistant_message(self, message: str) -> any:
return {"role": "assistant", "content": message}
def generate_sql(self, question: str, **kwargs) -> str:
# 使用父类的 generate_sql
sql = super().generate_sql(question, **kwargs)
# 替换 "\_" 为 "_"
sql = sql.replace("\\_", "_")
return sql
def submit_prompt(self, prompt, **kwargs) -> str:
chat_response = self.client.chat.completions.create(
model=self.model,
messages=prompt,
)
return chat_response.choices[0].message.content
class MyVanna(ChromaDB_VectorStore, DeepSeekChat):
def __init__(self, config=None):
ChromaDB_VectorStore.__init__(self, config=config)
DeepSeekChat.__init__(self, config=config)
vn = MyVanna()
vn.connect_to_sqlite('Chinook.sqlite')
# DDL statements are powerful because they specify table names,
# colume names, types, and potentially relationships
vn.train(ddl="""
-- Album definition
CREATE TABLE [Album]
(
[AlbumId] INTEGER NOT NULL,
[Title] NVARCHAR(160) NOT NULL,
[ArtistId] INTEGER NOT NULL,
CONSTRAINT [PK_Album] PRIMARY KEY ([AlbumId]),
FOREIGN KEY ([ArtistId]) REFERENCES [Artist] ([ArtistId])
ON DELETE NO ACTION ON UPDATE NO ACTION
);
CREATE INDEX [IFK_AlbumArtistId] ON [Album] ([ArtistId]);
""")
# DDL statements are powerful because they specify table names,
# colume names, types, and potentially relationships
vn.train(ddl="""
-- Artist definition
CREATE TABLE [Artist]
(
[ArtistId] INTEGER NOT NULL,
[Name] NVARCHAR(120),
CONSTRAINT [PK_Artist] PRIMARY KEY ([ArtistId])
);
""")
# DDL statements are powerful because they specify table names,
# colume names, types, and potentially relationships
vn.train(ddl="""
-- Customer definition
CREATE TABLE [Customer]
(
[CustomerId] INTEGER NOT NULL,
[FirstName] NVARCHAR(40) NOT NULL,
[LastName] NVARCHAR(20) NOT NULL,
[Company] NVARCHAR(80),
[Address] NVARCHAR(70),
[City] NVARCHAR(40),
[State] NVARCHAR(40),
[Country] NVARCHAR(40),
[PostalCode] NVARCHAR(10),
[Phone] NVARCHAR(24),
[Fax] NVARCHAR(24),
[Email] NVARCHAR(60) NOT NULL,
[SupportRepId] INTEGER,
CONSTRAINT [PK_Customer] PRIMARY KEY ([CustomerId]),
FOREIGN KEY ([SupportRepId]) REFERENCES [Employee] ([EmployeeId])
ON DELETE NO ACTION ON UPDATE NO ACTION
);
CREATE INDEX [IFK_CustomerSupportRepId] ON [Customer] ([SupportRepId]);
""")
# DDL statements are powerful because they specify table names,
# colume names, types, and potentially relationships
vn.train(ddl="""
-- Employee definition
CREATE TABLE [Employee]
(
[EmployeeId] INTEGER NOT NULL,
[LastName] NVARCHAR(20) NOT NULL,
[FirstName] NVARCHAR(20) NOT NULL,
[Title] NVARCHAR(30),
[ReportsTo] INTEGER,
[BirthDate] DATETIME,
[HireDate] DATETIME,
[Address] NVARCHAR(70),
[City] NVARCHAR(40),
[State] NVARCHAR(40),
[Country] NVARCHAR(40),
[PostalCode] NVARCHAR(10),
[Phone] NVARCHAR(24),
[Fax] NVARCHAR(24),
[Email] NVARCHAR(60),
CONSTRAINT [PK_Employee] PRIMARY KEY ([EmployeeId]),
FOREIGN KEY ([ReportsTo]) REFERENCES [Employee] ([EmployeeId])
ON DELETE NO ACTION ON UPDATE NO ACTION
);
CREATE INDEX [IFK_EmployeeReportsTo] ON [Employee] ([ReportsTo]);
""")
# DDL statements are powerful because they specify table names,
# colume names, types, and potentially relationships
vn.train(ddl="""
-- Genre definition
CREATE TABLE [Genre]
(
[GenreId] INTEGER NOT NULL,
[Name] NVARCHAR(120),
CONSTRAINT [PK_Genre] PRIMARY KEY ([GenreId])
);
""")
# DDL statements are powerful because they specify table names,
# colume names, types, and potentially relationships
vn.train(ddl="""
-- Invoice definition
CREATE TABLE [Invoice]
(
[InvoiceId] INTEGER NOT NULL,
[CustomerId] INTEGER NOT NULL,
[InvoiceDate] DATETIME NOT NULL,
[BillingAddress] NVARCHAR(70),
[BillingCity] NVARCHAR(40),
[BillingState] NVARCHAR(40),
[BillingCountry] NVARCHAR(40),
[BillingPostalCode] NVARCHAR(10),
[Total] NUMERIC(10,2) NOT NULL,
CONSTRAINT [PK_Invoice] PRIMARY KEY ([InvoiceId]),
FOREIGN KEY ([CustomerId]) REFERENCES [Customer] ([CustomerId])
ON DELETE NO ACTION ON UPDATE NO ACTION
);
CREATE INDEX [IFK_InvoiceCustomerId] ON [Invoice] ([CustomerId]);
""")
# DDL statements are powerful because they specify table names,
# colume names, types, and potentially relationships
vn.train(ddl="""
-- InvoiceLine definition
CREATE TABLE [InvoiceLine]
(
[InvoiceLineId] INTEGER NOT NULL,
[InvoiceId] INTEGER NOT NULL,
[TrackId] INTEGER NOT NULL,
[UnitPrice] NUMERIC(10,2) NOT NULL,
[Quantity] INTEGER NOT NULL,
CONSTRAINT [PK_InvoiceLine] PRIMARY KEY ([InvoiceLineId]),
FOREIGN KEY ([InvoiceId]) REFERENCES [Invoice] ([InvoiceId])
ON DELETE NO ACTION ON UPDATE NO ACTION,
FOREIGN KEY ([TrackId]) REFERENCES [Track] ([TrackId])
ON DELETE NO ACTION ON UPDATE NO ACTION
);
CREATE INDEX [IFK_InvoiceLineInvoiceId] ON [InvoiceLine] ([InvoiceId]);
CREATE INDEX [IFK_InvoiceLineTrackId] ON [InvoiceLine] ([TrackId]);
""")
# DDL statements are powerful because they specify table names,
# colume names, types, and potentially relationships
vn.train(ddl="""
-- MediaType definition
CREATE TABLE [MediaType]
(
[MediaTypeId] INTEGER NOT NULL,
[Name] NVARCHAR(120),
CONSTRAINT [PK_MediaType] PRIMARY KEY ([MediaTypeId])
);
""")
# DDL statements are powerful because they specify table names,
# colume names, types, and potentially relationships
vn.train(ddl="""
-- Playlist definition
CREATE TABLE [Playlist]
(
[PlaylistId] INTEGER NOT NULL,
[Name] NVARCHAR(120),
CONSTRAINT [PK_Playlist] PRIMARY KEY ([PlaylistId])
);
""")
# DDL statements are powerful because they specify table names,
# colume names, types, and potentially relationships
vn.train(ddl="""
-- PlaylistTrack definition
CREATE TABLE [PlaylistTrack]
(
[PlaylistId] INTEGER NOT NULL,
[TrackId] INTEGER NOT NULL,
CONSTRAINT [PK_PlaylistTrack] PRIMARY KEY ([PlaylistId], [TrackId]),
FOREIGN KEY ([PlaylistId]) REFERENCES [Playlist] ([PlaylistId])
ON DELETE NO ACTION ON UPDATE NO ACTION,
FOREIGN KEY ([TrackId]) REFERENCES [Track] ([TrackId])
ON DELETE NO ACTION ON UPDATE NO ACTION
);
CREATE INDEX [IFK_PlaylistTrackTrackId] ON [PlaylistTrack] ([TrackId]);
""")
vn.train(ddl="""
-- Track definition
CREATE TABLE [Track]
(
[TrackId] INTEGER NOT NULL,
[Name] NVARCHAR(200) NOT NULL,
[AlbumId] INTEGER,
[MediaTypeId] INTEGER NOT NULL,
[GenreId] INTEGER,
[Composer] NVARCHAR(220),
[Milliseconds] INTEGER NOT NULL,
[Bytes] INTEGER,
[UnitPrice] NUMERIC(10,2) NOT NULL,
CONSTRAINT [PK_Track] PRIMARY KEY ([TrackId]),
FOREIGN KEY ([AlbumId]) REFERENCES [Album] ([AlbumId])
ON DELETE NO ACTION ON UPDATE NO ACTION,
FOREIGN KEY ([GenreId]) REFERENCES [Genre] ([GenreId])
ON DELETE NO ACTION ON UPDATE NO ACTION,
FOREIGN KEY ([MediaTypeId]) REFERENCES [MediaType] ([MediaTypeId])
ON DELETE NO ACTION ON UPDATE NO ACTION
);
CREATE INDEX [IFK_TrackAlbumId] ON [Track] ([AlbumId]);
CREATE INDEX [IFK_TrackGenreId] ON [Track] ([GenreId]);
CREATE INDEX [IFK_TrackMediaTypeId] ON [Track] ([MediaTypeId]);
""")
from vanna.flask import VannaFlaskApp
VannaFlaskApp(vn).run()
然后就是简单的编码了,我把DDL硬编码进去了
接着是run起来

说实话我也没看这个SQL写的对不对哈

销量十张最好的专辑是啥?

图也给你渲染好了

界面上还有调试日志,挺贴心的
# 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)
plan
# If you like the plan, then uncomment this and run it to train
# vn.train(plan=plan)
这样可以从数据库直接拉DDL出来训练
# Sometimes you may want to add documentation about your business terminology or definitions.
vn.train(documentation="Our business defines OTIF score as the
percentage of orders that are delivered on time and in full")
我们的公司将OTIF(准时足量)得分定义为:按时且完整送达的订单所占百分比。
(专业解析:OTIF是供应链管理中的核心指标,全称On-Time In-Full,中文译作"准时足量"。
该翻译在保留专业术语的同时:
1. 使用括号补充英文缩写全称,便于首次接触概念的读者理解;
2. 将"delivered on time and in full"译为"按时且完整送达",精准对应物流场景中既要求时效性(准时)
又要求货品完整性(足量无损)的双重标准;3. 采用百分比定义量化指标,符合企业KPI的表达规范。)
还可以把业务定义加进去训
还有生产级的部署建议
挺好的
结论:
其实和RagFlow那边也是大差不差的,不过这个是框架API,更适合做一些内嵌的工作
性能啊,这些稍后再说吧。。。暂时没看到问答对儿的优化,需要细测了
安装体验一般
运行体验尚可

大模型&AI产品经理如何学习
求大家的点赞和收藏,我花2万买的大模型学习资料免费共享给你们,来看看有哪些东西。
1.学习路线图

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。


(都打包成一块的了,不能一一展开,总共300多集)
因篇幅有限,仅展示部分资料,需要点击下方图片前往获取
3.技术文档和电子书
这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。

4.LLM面试题和面经合集
这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集***
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

更多推荐



所有评论(0)