当前位置: 首页 > news >正文

从脚本到应用:给 Web 加个安全的问答接口

正要交付给业务方使用时,我们还需要一个 Web 接口,并加上安全认证。这正是 Vanna 中文文档里 web-app-auth 示例所着重强调的。

下面是一个用 Flask 搭建的最小安全接口思路(简化版):

from flask import Flask, request, jsonify
import vanna as vn

app = Flask(name)
vn.set_api_key(‘your-api-key’)
vn.connect_to_sqlite(‘prod.db’)
vn.train(…) # 已训练

简单的 token 认证装饰器

def require_auth(f):
def decorated(*args, **kwargs):
token = request.headers.get(‘Authorization’)
if token != ‘Bearer my-secret-token’:
return jsonify({“error”: “Unauthorized”}), 401
return f(*args, **kwargs)
return decorated

@app.route(‘/ask’, methods=[‘POST’])
@require_auth
def ask():
question = request.json.get(‘question’)
# allow_llm_to_see_data=False 可以先只生成SQL,由你审核后再执行
sql = vn.generate_sql(question)
# 在这里可以加入权限校验:如表白名单、Limit 强制添加等
if not sql.lower().startswith(‘select’):
return jsonify({“error”: “Only SELECT allowed”}), 403
df = vn.run_sql(sql)
return jsonify({“sql”: sql, “data”: df.to_dict()})
几个关键的安全实践:

只给数据库只读账户:Vanna 连接的数据库账号永远不要给 DROP、DELETE 权限。

SQL 白名单校验:在 run_sql 前用正则确保只执行 SELECT 语句,并强制加上 LIMIT 1000。

按用户注入行级过滤:在生成 SQL 后,自动拼接 WHERE tenant_id = ‘当前用户所属租户’,实现数据隔离。

这些手段,在 Vanna 的文档中都有详尽的最佳实践,确保你能把 AI 的能力安全地封装成产品功能,而不是制造一个 SQL 注入的后门。

凭什么不自己从零撸?
你可能会说:“我用 LangChain 的 SQL Agent,或者直接拼 Prompt 调 GPT-4o,也能跑起来呀。” 确实,但 LangChain 的 Agent 更加通用且重,面向 SQL 场景时往往需要你写大量脚手架代码去管理 Schema 上下文、历史缓存、连接池等。而 Vanna 专注一件事:成为连接数据库和 LLM 最高效的那根管道。它用简短的代码量,提供了开箱即用的训练机制、向量记忆和结果缓存,让你能把精力放在理解业务问题本身。

写在最后
Vanna 正在让"自然语言查数据"从一个需要整个团队啃半年的项目,变成一名后端工程师一个下午就能集成完的特性。它把最复杂的语义理解、SQL 生成、上下文检索打包成了一个优雅的 Python 库,同时又把模型和存储的掌控权完整地交到了你手上。

下次产品经理再拍出那个"搜索框"需求时,你可以云淡风轻地回一句:“好啊,下班前给你 demo。”

http://www.cnnetsun.cn/news/3505302.html

相关文章:

  • 《2001:太空漫游》(2001: A Space Odyssey)中的黑曜石状长方体,其实不是普通意义上的“外星设备”,它更像一个关于人类进化、意识、技术和宇宙意义的哲学符号
  • ChatGPT语音交互技术解析:从原理到开发实践
  • C++延时队列实现:从优先队列到订单超时实战
  • ARMv8-A调试架构与AM62L处理器外部调试寄存器深度解析
  • PhoneBindPage:更换手机号表单设计与验证
  • 单位时间内,你进行了多少次有效尝试。
  • 真正的梦想,会逼迫你发展过去没有的能力。
  • 用AI做小程序,我在审核上栽的跟头
  • AI编程工具实战指南:核心价值与高效使用技巧
  • Flask-Login会话失效机制与安全实践
  • Chrome扩展结合Codex:从开发请求自动生成部署计划的实践指南
  • Linux下FTP与SFTP服务配置与安全实践
  • Android RecyclerView核心原理与最佳实践指南
  • Flask用户登录系统安全设计与实现
  • Fast_Livo2 虚拟机数据集复现
  • 12-Factor Agents:构建Agent应用的12个因素
  • 多维聚合中的数据操纵:从SQL阀门到实时流的工程化实践
  • Rasa对话机器人原型开发:VS Code深度定制工作流
  • 奔驰诊断工具MB STAR C5 SD Connect核心功能与应用解析
  • VS Code 调试 Rasa 自定义动作:断点调试与变量监视实战
  • 你在电商运营端口最擅长的是什么?
  • Rocky 10.2 mini版 安装教程
  • 云上Airflow架构设计与AWS原生服务集成实战
  • AM62L WKUP_PLL0时钟配置详解:从寄存器操作到系统调试
  • DrDroid招聘产品工程师,170万 - 210万印度卢比薪资+股权等你来!
  • Python中列表的操作(超详细版)
  • MySQL 进阶篇 —— 事务 / 外键 / 索引 / 高级查询
  • 【Bug已解决】Forked thread token monitor over-accumulates usage after fork 解决方案
  • 安企CMS的安装-PHPStudy(小皮面板)部署
  • STM32嵌入式开发实践:从基础外设到课程设计