当提示符出现问题时:分析 Vanna.AI 中的提示符注入代码执行

预提示和提示注入

LLM 模块是一种强大而稳健的技术,但由于它们是在大量非结构化数据集(例如在线论坛、新闻文章、博客帖子等)上进行训练的,因此它们很容易“继承”偏见、负面意见、粗言秽语以及任何不受欢迎的内容。

为了避免这种情况,在训练阶段需要付出很多努力来标记和过滤此类内容,但对于仍然漏网的内容,开发人员可以使用预先提示的指令

开发人员使用硬编码指令,这些指令将添加到每个用户提供的提示中,并为 LLM 提供有关如何处理查询的更多上下文。

该图显示了预提示指令如何控制大型语言模型 (LLM) 的输出。在第一个场景中,用户询问有关外太空生命形式的问题,LLM 给出了科学答案。在第二个场景中,用户询问有关征服外太空生命形式的问题,LLM 拒绝回答,因为预提示指令会避免出现暴力内容。

该图显示了预提示指令如何控制大型语言模型 (LLM) 的输出。在第一个场景中,用户询问有关外太空生命形式的问题,LLM 给出了科学答案。在第二个场景中,用户询问有关征服外太空生命形式的问题,LLM 拒绝回答,因为预提示指令会避免出现暴力内容。

使用预先提示的指令来控制 LLM 输出

即时注入是近几年被广泛讨论的一个术语,随着法学硕士 (LLM) 的兴起,安全专家分析即将出现的安全威胁也就不足为奇了。

由于 LLM 没有控制平面并且“一切都是输入”,这意味着即使预定义的提示指令也被视为与用户输入提示相同,因此每个用户输入都可以以扭曲或破坏所有预定义指令的方式操纵提示的上下文,这是一个设计缺陷。

通过操纵 AI 提示的上下文来打破预定义指令的示例。用户首先询问如何制作燃烧瓶,AI 回答说它无法提供帮助。然后用户重新表述问题,询问不要采取哪些步骤来避免制作燃烧瓶。AI 提供了详细的说明,说明如何避免易燃液体、玻璃瓶、灯芯材料、易燃源和混合物质,以确保不会制作燃烧瓶。

通过操纵 AI 提示的上下文来打破预定义指令的示例。用户首先询问如何制作燃烧瓶,AI 回答说它无法提供帮助。然后用户重新表述问题,询问不要采取哪些步骤来避免制作燃烧瓶。AI 提供了详细的说明,说明如何避免易燃液体、玻璃瓶、灯芯材料、易燃源和混合物质,以确保不会制作燃烧瓶。

通过操纵人工智能提示的上下文来打破预定义的指令

提示注入漏洞可以是直接的——这些情况是用户输入直接传播到提示中(例如在 ChatGPT 中),也可以是间接的——用户输入或其部分通过外部源传播到提示中。

独立快速注入与综合快速注入

虽然提示注入可能会导致生成有害、误导或禁止的内容,但如果 LLM 未连接到任何可操作的系统或流程,则注入带来的风险会大大降低。如果没有直接链接来执行命令、做出决策或影响现实世界的操作,潜在的损害仍然局限于生成的文本本身。 我们决定将此类问题标记为“隔离提示注入”,因为 LLM 与关键应用程序组件隔离。

但是,在 LLM 直接与命令执行或决策相关的情况下,它可能会导致严重的安全问题,我们决定将其标记为“集成提示注入”。

让我们回顾一下我们最近发现并向维护人员披露的一个案例。

Vanna.AI 集成即时注入 RCE – CVE-2024-5565

Vanna AI 是一个基于 Python 的库,旨在简化使用大型语言模型 (LLM) 从自然语言输入生成 SQL 查询的过程。Vanna AI 的主要目的是促进准确的文本到 SQL 转换,使用户更轻松地与数据库交互,而无需具备丰富的 SQL 知识。

### vanna.ai 与 DuckDB 的结合使用 vanna.ai 是一种基于 RAG(检索增强生成)技术的人工智能工具,能够帮助用户实现从自然语言到 SQL 查询的高效转换[^2]。DuckDB 则是一个嵌入式的分析型数据库管理系统,支持高效的 OLAP 操作以及强大的数据处理能力。两者的结合可以显著提升数据分析的工作效率。 #### 集成方案概述 为了使 vanna.ai 和 DuckDB 能够协同工作,通常需要通过以下方式完成集成: 1. **数据加载至 DuckDB**: 将目标数据集导入到 DuckDB 数据库中以便后续查询操作。 2. **配置 vanna.ai 连接 DuckDB**: 使用 vanna.ai 提供的功能接口连接并执行针对 DuckDB 的 SQL 查询语句。 3. **自定义扩展类 (可选)**: 如果有特殊需求,则可通过继承 `VannaBase` 或其他相关类来构建个性化的解决方案[^1]。 下面给出一个简单的 Python 实现例子展示如何将两者结合起来使用: ```python from vanna.openai.openai_chat import OpenAI_Chat import duckdb class VannaWithDuckDB(OpenAI_Chat): def __init__(self, api_key, model_name="gpt-4", db_conn=None): super().__init__(config={"api_key": api_key, "model": model_name}) self.db_conn = db_conn if isinstance(db_conn, duckdb.DuckDBPyConnection) else None def execute_query(self, query_str): try: result = self.db_conn.sql(query_str).fetchall() return {"status": "success", "data": result} except Exception as e: return {"status": "error", "message": str(e)} # 初始化 DuckDB 并加载一些测试数据 conn = duckdb.connect(database=':memory:') conn.execute(""" CREATE TABLE test_table ( id INTEGER, name VARCHAR ); INSERT INTO test_table VALUES (1,'Alice'), (2,'Bob'); """) # 创建带有 DuckDB 支持的对象实例 vn_duckdb = VannaWithDuckDB(api_key="your_api_key_here", db_conn=conn) query_result = vn_duckdb.execute_query("SELECT * FROM test_table;") print(query_result) ``` 此脚本展示了怎样利用子类化方法把 DuckDB 整合进 vanna.ai 中去,并提供了基本的数据交互逻辑作为示范用途。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值