业务架构图了算是它的

它有一个云服务吧

可以生成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%免费】🆓

Logo

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

更多推荐