从脚本到应用:给 Web 加个安全的问答接口 📅 2026/7/19 4:06:13 正要交付给业务方使用时我们还需要一个 Web 接口并加上安全认证。这正是 Vanna 中文文档里 web-app-auth 示例所着重强调的。下面是一个用 Flask 搭建的最小安全接口思路简化版from flask import Flask, request, jsonifyimport vanna as vnapp 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”}), 401return f(*args, **kwargs)return decoratedapp.route(‘/ask’, methods[‘POST’])require_authdef ask():question request.json.get(‘question’)# allow_llm_to_see_dataFalse 可以先只生成SQL由你审核后再执行sql vn.generate_sql(question)# 在这里可以加入权限校验如表白名单、Limit 强制添加等if not sql.lower().startswith(‘select’):return jsonify({“error”: “Only SELECT allowed”}), 403df 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。”