Heurist Finance:用 Amazon Bedrock AgentCore 搭建可审计的 AI 投资工作台

2026-09-10 42 预计阅读时间: 1 分钟
来源: aws.amazon.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:13 分钟

Heurist Finance 把投资研究从“聊天问答”推进成了一个可以执行任务的 AI 工作台。用户可以用自然语言提出研究问题,系统按需购买高级市场数据,在隔离沙箱中运行分析,并记录每一次关键动作。

这套方案的重点不只是接入一个大模型,而是把支付、身份、记忆、代码执行和可观测性放进同一个代理运行环境。对于小团队来说,这种组合能减少自建基础设施的范围,同时让金融分析流程更容易控制和审计。

从聊天机器人到投资工作台

普通金融问答应用通常只有一条链路:接收问题、调用数据接口、生成回答。真正进入研究流程后,系统还需要处理更多事情:

  • 判断用户是否有权访问某类数据;
  • 根据问题购买一次性的高级数据;
  • 执行财务计算、回测或表格处理;
  • 保存用户偏好和历史研究上下文;
  • 记录数据调用、工具调用和最终结论之间的关系。

Heurist Finance 选择 Amazon Bedrock AgentCore,正是因为这些能力可以作为代理工作流的基础设施来组合。AgentCore Payments 用于按查询购买高级市场数据,Identity 用于管理访问身份,Memory 用于保留跨会话上下文,Code Interpreter 用于在隔离环境中执行分析,Observability 则为代理行为提供审计和调试线索。

这里的关键变化是:代理不再只是“生成一段文字”,而是在受控工具边界内完成一组可追踪的动作。

按次付费,控制数据成本

投资数据往往分成多个层级。实时行情、机构级研究数据或深度基本面数据的价格,可能明显高于普通应用愿意长期订阅的范围。若系统为所有用户预先购买全部数据,不仅成本高,也会让低频问题变得不划算。

按查询支付改变了成本模型:

  1. 代理先理解用户的问题和所需数据类型;
  2. 系统检查当前身份是否允许购买;
  3. 通过 Payments 完成一次数据访问或购买;
  4. 只把必要的数据交给后续分析步骤;
  5. 将费用、数据来源和研究结果关联起来。

实践中应当给支付动作设置明确的边界。例如,低金额的数据调用可以自动完成;超过阈值时要求用户确认;同一问题的重复请求则优先使用缓存或已有记忆,避免重复付费。

下面是一个可以改造成服务端策略模块的最小 Python 示例。它不直接调用 AgentCore API,而是演示代理在执行付费数据工具前如何进行预算检查和用户确认。接入实际 SDK 时,只需把 purchase_market_data 替换为 Payments 工具调用。

from dataclasses import dataclass


@dataclass
class DataRequest:
    symbol: str
    dataset: str
    price_usd: float


def purchase_market_data(request: DataRequest) -> dict:
    # Replace this function with the AgentCore Payments tool call.
    return {
        "status": "paid",
        "symbol": request.symbol,
        "dataset": request.dataset,
        "price_usd": request.price_usd,
        "data": {"pe_ratio": 24.1, "revenue_growth": 0.18},
    }


def get_data(request: DataRequest, max_auto_spend: float, approved: bool = False) -> dict:
    if request.price_usd > max_auto_spend and not approved:
        return {
            "status": "confirmation_required",
            "message": f"This query costs ${request.price_usd:.2f}; ask the user to approve it.",
        }

    return purchase_market_data(request)


if __name__ == "__main__":
    request = DataRequest("AMZN", "premium_fundamentals", 0.35)
    result = get_data(request, max_auto_spend=1.00)
    print(result)

运行方式:

python3 payment_guard.py

这个策略还可以继续加入每日预算、用户级预算、重复查询去重和失败退款处理。支付工具不应被放进一个没有额度约束的通用函数中,否则代理可能因为误判问题而产生不可预期的费用。

在沙箱里执行研究代码

投资分析经常需要运行 Python 代码:计算收益率、清洗 CSV、绘制指标、比较多个资产,或者进行简单回测。让模型直接在生产容器或主应用进程中执行这些代码,会把数据泄露、资源消耗和任意代码执行风险带进核心系统。

Code Interpreter 提供了更合适的边界:代理生成分析代码,代码在隔离环境中执行,再把结果返回给代理。工作台可以据此完成以下流程:

用户问题
  -> 代理拆解研究任务
  -> 获取授权数据
  -> 在 Code Interpreter 沙箱中运行计算
  -> 校验结果与异常
  -> 生成带数据依据的回答

可以实践的沙箱策略包括:

  • 只传入当前任务需要的数据,不暴露长期凭据;
  • 限制执行时间、内存和输出文件大小;
  • 对网络访问采用默认拒绝;
  • 保存代码、输入数据摘要和输出摘要,便于复核;
  • 对回测结果标记数据区间、费用假设和缺失值处理方式。

需要注意,沙箱隔离并不等于分析结果自动正确。金融计算仍然需要检查前视偏差、幸存者偏差、数据时间戳和单位换算。AgentCore 负责提供执行边界,研究方法的正确性仍然属于应用层责任。

记忆和身份让结果保持连续

投资研究不是一次性问答。用户可能先要求比较两家公司,下一次再追问估值假设,几天后继续询问“上次的熊市情景”。如果每个请求都从零开始,用户需要重复提供资产范围、风险偏好和研究目标。

Memory 可以保存经过筛选的长期上下文,例如:

  • 用户关注的市场和资产;
  • 用户偏好的指标和报告格式;
  • 已经确认过的研究假设;
  • 对某次分析结果的反馈。

但不应把所有聊天内容无条件写入长期记忆。更稳妥的做法是区分会话记忆、用户记忆和研究文档,并为每类记忆设置保留期限、删除方式和访问范围。

Identity 则解决“谁在请求、谁能看到什么”的问题。至少应将用户身份、组织身份、数据供应商权限和工具权限分开处理。一个用户可以有权阅读公开行情,却没有权购买某种高级数据;一个代理可以调用代码解释器,却不应自动获得生产数据库凭据。

可观测性是金融场景的基础能力

在普通聊天应用中,一次错误回答可能只需要重新生成。在投资工作台中,调查重点会更具体:代理看到了哪份数据?是否支付了费用?调用了哪个工具?代码是否执行失败?最终结论使用了哪些输入?

Observability 应至少覆盖这些事件:

  • 请求 ID、用户身份和会话 ID;
  • 模型决策和工具调用顺序;
  • 数据访问范围与支付金额;
  • Code Interpreter 的代码摘要、运行状态和耗时;
  • 输入数据版本、错误信息和输出引用;
  • 人工确认、拒绝和重试记录。

日志中不要直接写入访问令牌、完整个人信息或不必要的高级数据原文。可以使用脱敏字段、哈希后的数据集 ID和结果摘要,同时保留足够的信息支持审计。

一个实用的事件结构可以这样设计:

event_type: tool_call
request_id: req-2025-001
user_id: user-42
agent: investment-research
capability: premium_market_data
payment:
  required: true
  amount_usd: 0.35
  approval: automatic
execution:
  sandbox: code-interpreter
  status: succeeded
output:
  dataset_id: fundamentals-amzn-2025-01
  result_hash: sha256:replace-with-real-hash

这段 YAML 是应用层审计事件的示例,字段名需要根据实际 AgentCore SDK 和日志系统调整。它表达的原则是:把工具动作、支付动作、身份上下文和分析结果放在同一个可关联的事件链中。

小团队应该怎样落地

Heurist Finance 的案例对小团队的启发,不是一次性构建完整的自动化投研平台,而是把高风险动作拆成明确的能力边界。

可以按以下顺序推进:

  1. 先限定一个研究任务,例如公司基本面摘要或多资产指标比较;
  2. 为每个数据工具定义输入、价格、权限和失败行为;
  3. 把代码执行放入隔离环境,并限制资源与网络访问;
  4. 只保存经过筛选的记忆,避免把原始对话当作永久事实;
  5. 为每次工具调用生成可关联的审计事件;
  6. 用预算上限、人工确认和回放测试验证代理不会越权或重复付费。

采用 AgentCore 的收益在于,支付、身份、记忆、代码执行和可观测性不必全部由应用团队从零搭建。代价则是系统仍然需要认真设计工具权限、数据治理、费用控制和金融研究验证。托管能力可以减少基础设施工作,但不能替代产品边界和风险模型。

结语:把代理当成受控的研究执行者

Heurist Finance 展示了一种更接近真实工作的 AI 投资应用形态:用户用自然语言提出目标,代理按需获取数据,在隔离环境中完成计算,并留下可以审查的行动记录。

对于准备采用类似架构的团队,最值得检查的是四件事:每个付费动作是否有预算边界,每段代码是否在正确的隔离环境执行,每条记忆是否有明确生命周期,以及每个结论是否能追溯到身份、数据和工具调用。只有这些环节同时成立,AI 工作台才不仅能回答问题,也能承担可控的研究任务。


相关推荐