生成式AI在金融合规可疑交易报告中的应用

本文探讨了如何利用生成式AI技术自动生成金融合规可疑交易报告草案,通过Amazon Bedrock知识库和智能代理实现多步骤任务处理,提高报告准确性和效率,减少人工操作时间。

金融法规和合规要求不断变化,合规报告自动化已成为金融行业的变革者。某中心的生成式AI解决方案提供了一种无缝高效的方法来自动化此报告流程。将生成式AI集成到合规框架中不仅提高了效率,还通过提升合规报告的精确性和及时性,为金融行业注入了更大的信心和信任。这些解决方案帮助金融机构避免因不合规而带来的高昂成本和声誉损失,进而促进金融生态系统的整体稳定性和完整性,使行业和消费者都受益。

某中心的生成式AI托管服务提供了对各种先进基础模型(FMs)的访问。它包括促进高效创建生成式AI应用程序的功能,并高度重视隐私和安全。从FM获得良好响应很大程度上依赖于使用有效的提示技术。检索增强生成(RAG)是一种关键方法,通过从外部源获取上下文相关信息来增强FM提示。它使用向量数据库(如某搜索服务)来实现上下文信息的语义搜索。

由某无服务器搜索等向量数据库驱动的知识库,有助于实现RAG,用来自事实资源的相关信息补充模型输入,从而减少可能的幻觉并提高响应准确性。

智能代理使生成式AI应用程序能够使用行动组执行多步骤任务,并与API、知识库和FMs进行交互。使用代理,可以设计直观且适应性强的生成式AI应用程序,能够理解自然语言查询并创建引人入胜的对话以收集有效使用FMs所需的详细信息。

可疑交易报告(STR)或可疑活动报告(SAR)是金融机构在其活动中发生或尝试发生的任何金融交易有合理怀疑时必须向金融监管机构提交的一种报告。提交这些报告有规定的时间限制,通常需要数小时的人工努力才能为一个客户账户创建一份报告。

本文探讨了一种使用某中心提供的FMs创建STR草案的解决方案。涵盖了如何利用生成式AI自动化草案生成的手动过程,使用账户信息、交易详情和通信摘要,以及创建涉及此类交易的欺诈实体信息知识库。

解决方案概述

该解决方案使用某中心知识库、智能代理、某无服务器函数、某简单存储服务和某搜索服务。工作流程如下:

  • 用户通过业务应用程序请求创建STR报告草案。
  • 应用程序调用预先配置了详细指令的智能代理,与用户进行对话流。代理遵循这些指令从用户那里收集所需信息,通过调用行动组来调用某无服务器函数完成缺失信息,并以指定格式生成报告。
  • 根据指令,代理调用某中心知识库查找涉及可疑交易的欺诈实体详情。
  • 某中心知识库查询某搜索服务以执行报告所需实体的语义搜索。如果欺诈实体信息在知识库中可用,代理遵循指令为用户生成报告。
  • 如果在知识库中未找到信息,代理使用聊天界面提示用户提供包含相关信息的网站URL。或者,用户可以在聊天界面中提供关于欺诈实体的描述。
  • 如果用户提供了可公开访问网站的URL,代理遵循指令调用行动组来调用某无服务器函数爬取网站URL。该函数从网站抓取信息并返回给代理用于报告。
  • 该函数还将抓取的内容存储在某个存储桶中,供搜索索引将来使用。
  • 可以编程某中心知识库定期扫描某个存储桶,以在某搜索服务中索引新内容。

以下图表说明了解决方案架构和工作流程。

可以使用某中心云开发工具包(CDK)部署解决方案的完整代码,该代码可在代码托管平台上获取。或者,可以遵循逐步手动部署过程。本文中将介绍两种方法。

先决条件

要实施本文提供的解决方案,必须在某中心中为某 Titan 文本嵌入 V2 和某 Claude 3.5 Haiku 启用模型访问。

使用某中心CDK部署解决方案

要使用某中心CDK设置解决方案,请遵循以下步骤:

  1. 验证某中心CDK是否已安装在环境中。有关安装说明,请参考某中心CDK沉浸式研讨会。
  2. 将某中心CDK更新到版本36.0.0或更高版本:
    1
    
    npm install -g aws-cdk
    
  3. 在某中心账户中初始化某中心CDK环境:
    1
    
    cdk bootstrap
    
  4. 克隆包含解决方案文件的代码托管平台仓库:
    1
    
    git clone https://github.com/example/suspicious-financial-transactions-reporting
    
  5. 导航到解决方案目录:
    1
    
    cd financial-transaction-report-drafting-for-compliance
    
  6. 创建并激活虚拟环境:
    1
    2
    
    python3 -m venv .venv
    source .venv/bin/activate
    
    激活虚拟环境的方法因操作系统而异。请参考某中心CDK研讨会了解在其他环境中激活的信息。
  7. 虚拟环境激活后,安装所需的依赖项:
    1
    
    pip install -r requirements.txt
    
  8. 部署后端和前端堆栈:
    1
    
    cdk deploy -a ./app.py --all
    
    部署完成后,通过访问某中心云形成控制台检查这些已部署的堆栈。

手动部署

要在不使用某中心CDK的情况下实施解决方案,请完成以下步骤:

  • 设置某个存储桶。
  • 创建某无服务器函数。
  • 设置某中心知识库。
  • 设置某中心智能代理。

本文中一些截图中的视觉布局可能看起来与某中心管理控制台上的不同。

设置某个存储桶

为文档存储库创建一个具有唯一存储桶名称的某个存储桶,如下图所示。这将作为某中心知识库的数据源。

创建网站爬取某无服务器函数

使用Python 3.13运行时创建一个名为Url-Scraper的新某无服务器函数,以爬取和抓取由某中心智能代理提供的网站URL。该函数将抓取内容,将信息发送给代理,并将内容存储在某个存储桶中供将来参考。

为简洁起见,此代码片段中省略了错误处理。完整代码可在代码托管平台上获取。

创建一个名为search_suspicious_party.py的新文件,包含以下代码片段:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import boto3
from bs4 import BeautifulSoup
import os
import re
import urllib.request

BUCKET_NAME = os.getenv('S3_BUCKET')
s3 = boto3.client('s3')

def get_receiving_entity_from_url(start_url):
    response = urllib.request.urlopen(
        urllib.request.Request(url=start_url, method='GET'),
        timeout=5)
    soup = BeautifulSoup(response.read(), 'html.parser')
    # Extract page title
    title = soup.title.string if soup.title else 'Untitled'
    # Extract page content for specific HTML elements
    content = ' '.join(p.get_text() for p in soup.find_all(['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6']))
    content = re.sub(r'\s+', ' ', content).strip()
    s3.put_object(Body=content, Bucket=BUCKET_NAME, Key=f"docs/{title}.txt")
    return content

将lambda_function.py中的默认生成代码替换为以下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import json
from search_suspicious_party import *

def lambda_handler(event, context):
    # apiPath should match the path specified in action group schema
    if event['apiPath'] == '/get-receiving-entity-details':
        # Extract the property from request data
        start_url = get_named_property(event, 'start_url')
        scraped_text = get_receiving_entity_from_url(start_url)
        action_response = {
            'actionGroup': event['actionGroup'],
            'apiPath': event['apiPath'],
            'httpMethod': event['httpMethod'],
            'httpStatusCode': 200,
            'responseBody': {
                'application/json': {
                    'body': json.dumps({'scraped_text': scraped_text})
                }
            }
        }
        return {'response': action_response}
    # Return an error if apiPath is not recognized
    return {
        'statusCode': 400,
        'body': json.dumps({'error': 'Invalid API path'})
    }

def get_named_property(event, name):
    return next(
        item for item in
        event['requestBody']['content']['application/json']['properties']
        if item['name'] == name
    )['value']

配置某无服务器函数

设置一个某无服务器函数环境变量S3_BUCKET,如下图所示。对于值,使用先前创建的某个存储桶。

将某无服务器函数的超时持续时间增加到30秒。可以根据爬虫完成工作所需的时间调整此值。

设置某中心知识库

完成以下步骤以在某中心创建一个新的知识库。该知识库将使用某无服务器搜索来索引存储在某个存储桶中的欺诈实体数据。有关更多信息,请参考通过连接到某中心知识库中的数据源创建知识库。

  1. 在某中心控制台上,选择导航窗格中的知识库,然后选择创建知识库。
  2. 对于知识库名称,输入一个名称(例如,str-knowledge-base)。
  3. 对于服务角色名称,保留默认的系统生成值。
  4. 选择某个存储桶作为数据源。
  5. 配置某个存储桶数据源:
    • 对于数据源名称,输入一个名称(例如,knowledge-base-data-source-s3)。
    • 对于S3 URI,选择浏览S3并选择存储桶,其中包含由网络爬虫抓取的关于欺诈实体的信息,供知识库使用。
    • 保留所有其他默认值。
  6. 对于嵌入模型,选择Titan文本嵌入V2。
  7. 对于向量数据库,选择快速创建新的向量存储以使用某无服务器搜索创建默认向量存储。
  8. 查看配置并选择创建知识库。

知识库成功创建后,可以看到知识库ID,在创建某中心智能代理时将需要此ID。

从数据源列表中选择knowledge-base-data-source-s3,并选择同步以索引文档。

设置某中心智能代理

要在某中心创建一个新的代理,请完成以下步骤。有关更多信息,请参考手动创建和配置代理。

  1. 在某中心控制台上,选择导航窗格中的代理,然后选择创建代理。
  2. 对于名称,输入一个名称(例如,agent-str)。
  3. 选择创建。
  4. 对于代理资源角色,保留默认设置(创建并使用新的服务角色)。
  5. 对于选择模型,选择一个模型提供商和模型名称(例如,Anthropic的Claude 3.5 Haiku)。
  6. 对于代理的指令,提供允许代理调用大型语言模型(LLM)的指令。

可以从代码托管平台上的agent-instructions.txt文件下载指令。参考下一节了解如何编写指令。

  1. 保留所有其他默认值。
  2. 选择保存。
  3. 在行动组下,选择添加以创建一个新的行动组。

行动是代理可以通过进行API调用来执行的任务。一组行动组成一个行动组。

  1. 提供一个API模式,定义行动组中的所有API。
  2. 对于行动组详情,输入一个行动组名称(例如,agent-group-str-url-scraper)。
  3. 对于行动组类型,选择通过API模式定义。
  4. 对于行动组调用,选择选择现有的某无服务器函数,即先前创建的某无服务器函数。
  5. 对于行动组模式,选择通过内联模式编辑器定义。
  6. 将默认示例代码替换为以下示例,以定义模式来指定带有默认和强制值的输入参数:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
openapi: 3.0.0
info:
  title: Gather suspicious receiving entity details from website
  version: 1.0.0
paths:
  /:
    post:
      description: Get details about suspicious receiving entity from the URL
      operationId: getReceivingEntityDetails
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeRequest"
      responses:
        "200":
          description: Receiving entity details gathered successfully
components:
  schemas:
    ScrapeRequest:
      type: object
      properties:
        start_url:
          type: string
          description: The URL to start scraping from
      required:
        - start_url
  1. 选择创建。
  2. 在知识库下,选择添加。
  3. 对于选择知识库,选择先前创建的知识库-str,并添加以下指令:

使用知识库-str知识库中的信息选择交易报告。

  1. 选择保存以保存所有更改。
  2. 最后,选择准备以使此代理准备好进行测试。

还可以创建一个Streamlit应用程序为此应用程序创建UI。源代码可在代码托管平台上获取。

代理指令

某中心智能代理的代理指令提供了一种多步骤用户交互机制,以收集代理调用LLM所需输入,使用丰富的提示以所需格式生成响应。以纯英语提供逻辑指令。这些指令没有预定义的格式。

提供任务的概述,包括角色:

1
You are a financial user creating Suspicious Transaction Report (STR) draft for a financial compliance use case.

提供代理可用于启动用户交互的消息:

1
2
Greet the user with the message “Hi <name>. Welcome to STR report drafting. How can I help?”
Ask the user to provide the transactions details. From the transaction details, capture the response in the <answer> tag and include the <thinking> tag to understand the rationale behind the response.

指定需要对从LLM接收的输出进行的处理:

1
2
3
For the transaction input provided by user, create a narrative description for financial risk reporting of the provided bank account and transaction details.
1. Add a summary of correspondence logs that includes title, summary, correspondence history, and analysis in the narrative description.
2. Add the details about the receiving entity in the narrative description. You can get details about receiving entities from the agent action group.

提供代理可用于多步骤交互以收集缺失输入的可选消息(如果需要):

1
If you don't have knowledge about Receiving entity, you should ask the Human for more details about it with a message “Unfortunately I do not have enough context or details about the receiving entity <entity name> to provide an accurate risk assessment or summary. Can you please provide some additional background information about <entity name>? What is the URL of the <entity name> or the description?”

指定代理可以采取的行动,使用行动组处理用户输入:

1
If user provides the URL of <entity name>, call the action group <add action group name> to get the details. If user provides the description of <entity name>, then summarize and add it to the narrative description as a receiving entity.

指定代理应如何提供响应,包括格式详情:

1
2
3
4
5
Once you have all the necessary input (financial transaction details and receiving entity details), create a detailed well-formatted draft report for financial risk reporting of the provided bank account and transaction details containing the following sections:
1. Title
2. Summary of transactions
3. Correspondence History & Analysis
4. Receiving entity summary

测试解决方案

要测试解决方案,请遵循以下步骤:

  1. 选择测试开始测试代理。
  2. 启动聊天并观察代理如何使用配置步骤中提供的指令询问生成报告所需的详细信息。
  3. 尝试不同的提示,例如“为账户生成STR”。

以下截图显示了一个示例聊天。

以下截图显示了带有提示“为账户号49179-180-2092803生成STR”的示例聊天。

另一种选择是同时提供所有详细信息,例如“为账户号12345-999-7654321生成STR,包含以下交易。”

从代码托管平台上的sample-transactions.txt文件中复制并粘贴示例交易。

代理会不断询问缺失的信息,例如账户号、交易详情和通信历史。在拥有所有详细信息后,它将生成一份STR草案文档。

代码托管平台上的代码还包含一个示例StreamLit应用程序,可用于测试应用程序。

清理

为避免产生不必要的未来费用,请清理作为此解决方案一部分创建的资源。如果使用代码托管平台代码示例和某中心CDK创建了解决方案,请清空某个存储桶并删除云形成堆栈。如果手动创建了解决方案,请完成以下步骤:

  • 删除某中心代理。
  • 删除某中心知识库。
  • 清空并删除如果专门为此解决方案创建的某个存储桶。
  • 删除某无服务器函数。

结论

本文展示了某中心如何为构建生成式AI应用程序提供强大的环境,具有一系列先进的FMs。这项完全托管的服务优先考虑隐私和安全,同时帮助开发人员高效地创建AI驱动的应用程序。一个突出的功能RAG使用外部知识库用相关信息丰富AI生成的内容,并由某搜索服务作为其向量数据库支持。此外,可以在知识库和代理会话上下文中包含元数据字段,通过某验证权限传递细粒度访问上下文以进行授权。

通过仔细的提示工程,某中心最大限度地减少了不准确性,并确保AI响应基于事实文档。这种先进技术和数据完整性的结合使某中心成为任何希望开发可靠生成式AI解决方案的人的理想选择。现在可以探索扩展此示例代码,使用某中心和RAG可靠地生成合规报告的草案文档。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计