You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自定义Langchain SQL Agent限制,禁止查询表前三行?

解决Langchain SQL Agent违规查询表数据样本的方案

针对你遇到的SQL Agent查询表前三行违反数据合规的问题,可通过以下几种方式处理:

1. 直接移除获取样本数据的工具

SQLDatabaseToolkit中包含一个用于获取表数据样本的工具(类名为SQLGetSampleDataTool),直接从工具列表中过滤掉它即可阻止相关查询操作:

from langchain.agents import AgentType, create_sql_agent
from langchain.sql_database import SQLDatabase
from langchain.agents.agent_toolkits.sql.toolkit import SQLDatabaseToolkit
from langchain.agents.agent_toolkits.sql.base import SQLGetSampleDataTool

# 初始化数据库与LLM实例
db = SQLDatabase.from_uri("你的数据库连接URI")
llm = 你的LLM模型实例

# 创建工具包并过滤违规工具
toolkit = SQLDatabaseToolkit(db=db, llm=llm)
filtered_tools = [tool for tool in toolkit.get_tools() if not isinstance(tool, SQLGetSampleDataTool)]

# 使用过滤后的工具创建合规的SQL Agent
agent = create_sql_agent(
    llm=llm,
    tools=filtered_tools,
    agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)

2. 替换违规工具为仅返回表结构的安全工具

如果担心移除工具影响Agent的推理逻辑,可自定义一个工具替代原样本查询工具,仅返回表结构信息而不涉及实际数据:

from langchain.tools import BaseTool
from langchain.agents.agent_toolkits.sql.base import SQLGetSampleDataTool
from typing import Optional

# 定义安全样本查询工具
class SafeSQLSampleTool(BaseTool):
    name = "sql_db_get_sample_data"
    description = "仅用于获取表的结构信息,无法返回实际数据样本"
    db: SQLDatabase

    def _run(self, table_name: str) -> str:
        # 仅返回表结构,不查询任何数据行
        table_schema = self.db.get_table_info(table_name)
        return f"表【{table_name}】的结构信息:\n{table_schema}\n\n合规提示:无法返回实际数据样本"

    async def _arun(self, table_name: str) -> str:
        return self._run(table_name)

# 替换原工具
toolkit = SQLDatabaseToolkit(db=db, llm=llm)
filtered_tools = []
for tool in toolkit.get_tools():
    if isinstance(tool, SQLGetSampleDataTool):
        filtered_tools.append(SafeSQLSampleTool(db=db))
    else:
        filtered_tools.append(tool)

# 创建Agent
agent = create_sql_agent(
    llm=llm,
    tools=filtered_tools,
    agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)

3. 修改数据库配置取消样本数据展示

初始化SQLDatabase时,可通过sample_rows_in_table_info参数设置为0,让表结构信息中不包含任何样本数据,从根源减少Agent触发样本查询的可能:

db = SQLDatabase.from_uri(
    "你的数据库连接URI",
    sample_rows_in_table_info=0  # 禁止在表结构中展示样本数据
)

建议优先使用第一种方案,直接移除违规工具,彻底避免查询敏感数据的风险;若需保留工具的语义提示,再结合第二种方案替换工具。

内容的提问来源于stack exchange,提问作者Jack Damiani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 13:55:11