我正在使用 Vanna AI 为我们的组织实现“与数据对话”功能。作为我们设置的一部分,我们使用多租户数据库架构,其中每个租户的数据都存储在...
我正在使用 Vanna AI 为我们的组织实现“与数据对话”功能。作为设置的一部分,我们使用多租户数据库架构,其中每个租户的数据都存储在同一个 PostgreSQL 数据库内的单独架构中。
为了适应这种结构,我计划为 PostgreSQL 数据库中的每个模式创建单独的 Vanna 实例。每个实例都使用特定于其相应模式的不同训练数据集进行训练。这种方法的目的是确保 Vanna 查询是特定于模式的,并且不会交叉引用或组合来自不同模式或租户的数据。
然而,我遇到了一个问题,Vanna AI 似乎混淆了不同架构的训练数据集。例如,在查询仅应访问架构“X”的实例时,我注意到 Vanna 正在合并架构“Y”的训练数据中的元素。尽管我已经明确地分别训练了每个 Vanna 实例,确保每个实例只能访问其各自的架构和训练数据集,但这种情况仍然会发生。
以下是我所看到内容的高级说明:
但在操作过程中,针对 Schema X 的查询有时会错误地使用来自 Schema Y 数据集的模式或见解,反之亦然。例如:
为什么会发生这种情况?看来 Vanna AI 没有按预期隔离训练数据集,导致其查询中出现跨模式污染。
建议一个解决方案来确保每个 Vanna 实例在其定义的模式边界内运行,而无需交叉引用其他模式的训练数据。
我可以向你展示我所做的事情的演示代码
from vanna_ai import VannaManager
# Simulated function to initialize Vanna instances for each schema
def initialize_vanna_instances(schemas):
vanna_instances = {}
for schema in schemas:
# Initialize a Vanna instance for each schema
vanna_instance = VannaManager(schema_name=schema)
# Train each instance with the schema-specific dataset
vanna_instance.train(training_data_path=f"/path/to/{schema}_training_data.csv")
vanna_instances[schema] = vanna_instance
return vanna_instances
# Simulated function to query a specific Vanna instance
def query_vanna_instance(vanna_instance, query):
# Generate SQL using the Vanna instance
sql_query = vanna_instance.generate_sql(question=query)
print(f"Generated SQL for schema {vanna_instance.schema_name}: {sql_query}")
# Run SQL query against the schema-specific database
result = vanna_instance.run_sql(sql=sql_query)
return result
# Initialize Vanna instances for two different schemas
schemas = ['schema_x', 'schema_y']
vanna_instances = initialize_vanna_instances(schemas)
# Example queries for different schemas
query_x = "SELECT * FROM customers WHERE purchase_date > '2024-01-01';"
query_y = "SELECT * FROM orders WHERE order_amount > 100;"
# Query the instance for schema_x
result_x = query_vanna_instance(vanna_instances['schema_x'], query_x)
print(f"Result for Schema X: {result_x}")
# Query the instance for schema_y
result_y = query_vanna_instance(vanna_instances['schema_y'], query_y)
print(f"Result for Schema Y: {result_y}")
守则解释
p10
p11
p12
p13
p14
p15
p16