https://vanna.ai/docs/ 

啊,怎么只能选择这几个



用户、监控、训练、函数、数据库


然后到组织

新建一个KEY吧 

记得保存下来哈

然后回到自己的计算机上


PS E:\development> mkdir vanna_cloud_demo


    目录: E:\development


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         2025/3/22      9:45                vanna_cloud_demo


PS E:\development> cd .\vanna_cloud_demo\
PS E:\development\vanna_cloud_demo> uv init
Initialized project `vanna-cloud-demo`
PS E:\development\vanna_cloud_demo> uv venv
Using CPython 3.12.8
Creating virtual environment at: .venv
Activate with: .venv\Scripts\activate
PS E:\development\vanna_cloud_demo> .venv\Scripts\activate
(vanna_cloud_demo) PS E:\development\vanna_cloud_demo>

新建一个环境

切换到vscode那边去


(vanna_cloud_demo) PS E:\development\vanna_cloud_demo> uv add vanna
Resolved 42 packages in 3.91s
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
(vanna_cloud_demo) PS E:\development\vanna_cloud_demo> uv add vanna
Resolved 42 packages in 30ms
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
(vanna_cloud_demo) PS E:\development\vanna_cloud_demo>

靠。。。

尴尬啊。。。等于说是。。。不支持windows?

行吧

折腾了一下,修复了本机受损的WSL2

然后似乎有需要重装uv


sudo apt install pipx
pipx install uv
pipx ensurepath

 https://blog.lemonhall.me/notesview/show/625 

lemonhall@LEMON-HP-LAPTOP:~$ mkdir vanna_cloud_demo
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$

重新建立环境

安装依赖:


(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$

卧槽???

什么玩意?

这个kaleido这个库,只有armv71平台的wheels?


然后去官网一看

这只是一个图形库而已

然后一看?啥?

就是只支持arm?什么玩意啊

人家也明确的说,我就是没有。。。

无语了


uv pip install kaleido==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

行吧

对vanna的观感降低一分儿

毕竟这么一个arm的库你添加进来,破坏安装体验

也是无语

(vanna_cloud_demo) lemonhall@LEMON-HP-LAPTOP:~/vanna_cloud_demo$ 
/home/lemonhall/vanna_cloud_demo/.venv/bin/python /home/lemonhall/vanna_cloud_demo/main.py
'NoneType' object has no attribute 'questions'
(vanna_cloud_demo) lemonhall@LEMON-HP-LAPTOP:~/vanna_cloud_demo$ 
/home/lemonhall/vanna_cloud_demo/.venv/bin/python /home/lemonhall/vanna_cloud_demo/main.py
'NoneType' object has no attribute 'questions'
(vanna_cloud_demo) lemonhall@LEMON-HP-LAPTOP:~/vanna_cloud_demo$ 

然后接下来就是报错。。。


界面倒是真的挺好看的


sudo apt install sqlite3

安装sqlite3

安装一个向量库吧

uv pip install 'vanna[chromadb,openai]'

 https://vanna.ai/docs/sqlite-openai-standard-chromadb/ 

我看了一下它这个数据库的核心

-- 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


-- Artist definition

CREATE TABLE [Artist]
(
    [ArtistId] INTEGER  NOT NULL,
    [Name] NVARCHAR(120),
    CONSTRAINT [PK_Artist] PRIMARY KEY  ([ArtistId])
);


它会下载一个小模型

from vanna.openai import OpenAI_Chat
from vanna.chromadb import ChromaDB_VectorStore

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

vn = MyVanna(config={'api_key': 'x', 'model': 'ep-20250204220334-l2q5g',
"base_url":"https://ark.cn-beijing.volces.com/api/v3"})

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])
);
""")

from vanna.flask import VannaFlaskApp
VannaFlaskApp(vn).run()

我训了两张表

然后试一试能不能真的跑起来

使用的是V3

-- 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]);
-- 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]);


-- Genre definition

CREATE TABLE [Genre]
(
    [GenreId] INTEGER  NOT NULL,
    [Name] NVARCHAR(120),
    CONSTRAINT [PK_Genre] PRIMARY KEY  ([GenreId])
);


-- 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]);


-- 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]);
-- MediaType definition

CREATE TABLE [MediaType]
(
    [MediaTypeId] INTEGER  NOT NULL,
    [Name] NVARCHAR(120),
    CONSTRAINT [PK_MediaType] PRIMARY KEY  ([MediaTypeId])
);
-- Playlist definition

CREATE TABLE [Playlist]
(
    [PlaylistId] INTEGER  NOT NULL,
    [Name] NVARCHAR(120),
    CONSTRAINT [PK_Playlist] PRIMARY KEY  ([PlaylistId])
);
-- 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]);
-- 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]);


然后看训练数据里面就有十一条了

OK,接下来问数据库咯

  File "/home/lemonhall/vanna_cloud_demo/.venv/lib/python3.12/site-packages/openai/_base_client.py", 
  line 1023, in _request
    raise self._make_status_error_from_response(err.response) from None
openai.AuthenticationError: Error code: 401 - {'error': {'message': 'Incorrect API 
key provided: 72d76485************************0f54. You can find your API key at
 https://platform.openai.com/account/api-keys.', 'type': 'invalid_request_error', 
 'param': None, 'code': 'invalid_api_key'}}

API的问题,好说。。看看为什么它不吃base_url就行

 https://github.com/vanna-ai/vanna/blob/main/src/vanna/deepseek/deepseek_chat.py 

参考官网仓库ds的例子哈

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()

以上是完整的例子,最后的

然后是输出

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

接着就拿到了

哦吼

这个图表可以的啊

这边可以看到


结论:简单数据库,那效果是相当好啊

 https://vanna.ai/docs/postgres-openai-standard-chromadb/ 

# 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)

这样就可以按照数据库来train了

# 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的表达规范。)

等于是把业务属于定义加进去了

 https://vanna.ai/docs/hardening-guide/ 

最后还有一些简单的部署和鉴权的指南

还可以,非常的。。。


nice的一个自由度中等的框架

挺好的