
企业微信

飞书
选择您喜欢的方式加入群聊

扫码添加咨询专家
AI 查询的准确性取决于多个因素:数据库元数据质量、训练样本、权限配置、提问方式等。本文将系统介绍如何优化 AskTable 的查询效果,让 AI 更准确地理解你的需求。
元数据是 AI 理解数据库结构的基础。高质量的元数据可以:
添加清晰的描述:
# 好的描述 table: "orders" description: "客户订单记录,包含订单基本信息、金额、状态等" field: "order_status" description: "订单状态:pending(待处理)、paid(已支付)、shipped(已发货)、completed(已完成)、cancelled(已取消)" # 不好的描述 table: "orders" description: "订单" # 太简单 field: "status" description: "状态" # 没有说明可能的值
描述最佳实践:
隐藏不需要的字段可以:
# 隐藏内部字段 field: "internal_id" visibility: false field: "created_by_system" visibility: false # 保留业务字段 field: "order_id" visibility: true field: "customer_name" visibility: true
建议隐藏的字段:
created_at_ms、updated_by_system)hash_key、partition_key)created_at 就隐藏 created_date)AskTable 支持自动注入示例值到字段描述中:
# 原始描述 field: "region" description: "销售区域" # 注入示例值后 field: "region" description: "销售区域(e.g. \"华东\",\"华北\",\"华南\")"
工作原理:
启用值索引:
# 配置 Azure AI Search aisearch_host: "https://your-search.search.windows.net" aisearch_master_key: "your-key"
当用户提问时,AskTable 使用两阶段检索:
用户问题: "上周华东地区的销售额" ↓ ┌─────────────────────────────────────┐ │ 1. 提取子查询和关键词 │ │ subqueries: ["销售额", "地区"] │ │ keywords: ["华东", "上周"] │ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ 2. 语义搜索字段 │ │ - 在向量数据库中搜索相关字段 │ │ - 匹配: sales.amount, sales.region│ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ 3. 全文搜索值 │ │ - 在值索引中搜索关键词 │ │ - 匹配: region="华东" │ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ 4. 合并结果并注入示例值 │ │ region: "销售区域(e.g. \"华东\")" │ └─────────────────────────────────────┘
AskTable 使用 Qdrant 存储字段向量:
# 字段向量化 field_vector = embed_model.encode( f"{table.name} {field.name} {field.description}" ) # 存储到 Qdrant qdrant.upsert( collection_name=f"ds_{datasource_id}_fields", points=[{ "id": field_id, "vector": field_vector, "payload": { "schema_name": schema.name, "table_name": table.name, "field_name": field.name, "description": field.description, } }] )
优化建议:
值索引用于全文搜索具体的数据值:
# 索引字段的唯一值 unique_values = datasource.query( f"SELECT DISTINCT {field.name} FROM {table.name} LIMIT 1000" ) # 存储到 Azure AI Search for value in unique_values: search_client.upload_documents([{ "id": f"{field_id}_{value}", "schema_name": schema.name, "table_name": table.name, "field_name": field.name, "value": value, "type": "value" }])
适合索引的字段:
不适合索引的字段:
训练样本(Training Pairs)是问题-SQL 对,用于:
通过 UI 添加:
通过 API 添加:
import requests response = requests.post( "https://api.asktable.com/api/v1/datasources/{ds_id}/training-pairs", headers={"Authorization": f"Bearer {api_key}"}, json={ "question": "上周华东地区的销售额", "sql": """ -- 上周华东地区的销售额 SELECT SUM(amount) as total_sales FROM sales WHERE region = '华东' AND order_date >= DATE_SUB(CURDATE(), INTERVAL 1 WEEK) AND order_date < CURDATE() """ } )
1. 覆盖常见查询模式:
-- 时间范围查询 SELECT * FROM orders WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31' -- 聚合查询 SELECT region, SUM(amount) as total FROM sales GROUP BY region -- 多表关联 SELECT o.order_id, c.customer_name, o.amount FROM orders o JOIN customers c ON o.customer_id = c.id -- 排名查询 SELECT product_name, sales_count FROM products ORDER BY sales_count DESC LIMIT 10
2. 包含业务术语:
-- 问题: "本月 GMV" -- SQL: SELECT SUM(amount) FROM orders WHERE ... -- 问题: "活跃用户数" -- SQL: SELECT COUNT(DISTINCT user_id) FROM user_actions WHERE ... -- 问题: "复购率" -- SQL: SELECT COUNT(DISTINCT CASE WHEN order_count > 1 THEN customer_id END) / COUNT(DISTINCT customer_id) ...
3. 标注复杂逻辑:
-- 问题: "同比增长率" SELECT current_year.month, (current_year.sales - last_year.sales) / last_year.sales * 100 as growth_rate FROM (SELECT MONTH(order_date) as month, SUM(amount) as sales FROM orders WHERE YEAR(order_date) = 2024 GROUP BY MONTH(order_date)) current_year JOIN (SELECT MONTH(order_date) as month, SUM(amount) as sales FROM orders WHERE YEAR(order_date) = 2023 GROUP BY MONTH(order_date)) last_year ON current_year.month = last_year.month
4. 数量建议:
AskTable 在查询时自动使用训练样本:
# 1. 从训练样本中提取相关字段 training_pairs = retrieve_training_pairs(datasource_id, question) training_fields = extract_fields_from_sql(training_pairs) # 2. 合并到检索结果 all_fields = semantic_search_fields + training_fields # 3. 注入到 System Prompt system_prompt = f""" 相关训练样本: {format_training_pairs(training_pairs)} 相关字段: {format_fields(all_fields)} """
权限配置会影响 AI 可以访问的数据范围:
# 用户只能看到自己部门的数据 role_policy = { "tables": ["sales"], "row_filter": "department = '{{user.department}}'" } # AI 生成的 SQL 会自动添加过滤条件 # 原始: SELECT * FROM sales # 实际: SELECT * FROM sales WHERE department = '销售部'
优化建议:
对敏感字段进行脱敏:
# 配置字段脱敏 field_policy = { "field": "customer_phone", "mask_type": "phone", # 138****5678 } field_policy = { "field": "customer_email", "mask_type": "email", # a***@example.com }
好的问题:
不好的问题:
时间范围:
维度信息:
指标信息:
如果你的训练样本中包含业务术语,可以直接使用:
"本月 GMV" → AI 知道 GMV = SUM(amount) "活跃用户" → AI 知道活跃用户的定义 "复购率" → AI 知道如何计算复购率
对于复杂问题,可以分步查询:
步骤1: "2024年各地区的销售额" 步骤2: "华东地区的销售额占比" 步骤3: "华东地区销量前10的产品"
在 Canvas 中,可以将多个查询组合成工作流。
AskTable 提供流式响应,可以看到 AI 的思考过程:
1. 搜索元数据... 找到表: sales, orders 找到字段: region, amount, order_date 2. 查看表结构... sales.region: 销售区域(e.g. "华东","华北") sales.amount: 销售金额 sales.order_date: 订单日期 3. 执行 SQL... SELECT SUM(amount) FROM sales WHERE region = '华东' AND ... 4. 返回结果 总销售额: 1,234,567
查看 AI 检索到的表和字段是否相关:
# 在日志中查看检索结果 retrieved_fields = [ "sales.region (score: 0.92)", "sales.amount (score: 0.89)", "sales.order_date (score: 0.85)", ]
如果检索不准确:
当查询失败时,检查:
隐藏不必要的表:
# 只保留业务表 visible_tables = ["orders", "customers", "products", "sales"] # 隐藏系统表 hidden_tables = ["_migrations", "_audit_log", "_temp_*"]
隐藏不必要的字段:
# 只保留业务字段 visible_fields = ["id", "name", "amount", "status", "created_at"] # 隐藏技术字段 hidden_fields = ["internal_*", "*_hash", "*_key"]
启用 Prompt Caching 可以减少重复内容的处理时间:
# 自动启用 Prompt Caching messages = message_builder.dump_openai(cache_control=True)
适合缓存的内容:
过多的训练样本会增加 token 消耗:
# 只检索最相关的训练样本 training_pairs = retrieve_training_pairs( datasource_id, question, limit=10 # 限制数量 )
根据查询复杂度选择模型:
# 简单查询:使用快速模型 model = "gpt-4o-mini" # 复杂查询:使用强大模型 model = "gpt-4o" # Canvas 节点:使用推理模型 model = "o1-mini" reasoning_effort = "medium"
可能原因:
解决方案:
可能原因:
解决方案:
可能原因:
解决方案:
可能原因:
解决方案:
优化 AI 查询效果是一个持续的过程,需要从多个方面入手:
通过系统地应用这些最佳实践,你可以显著提升 AskTable 的查询准确性和效率。