利用Strands Agents SDK构建三Agent协作系统,结合Claude Haiku文本分析与Titan多模态向量搜索实现保险文档精准分类。
Amazon Bedrock 上的 Vector-Prompt 分类可帮助保险公司精确分类每日数千份文档:保单、公证词、背书和监管表格,以满足合规、索赔和客户服务的需求。人工分类耗时且容易出错,而传统自动化方法在处理那些外观相似但用途不同的文档时往往力不从心。一份保单背书和一份监管公证书可能包含相似的术语,但错误分类它们可能导致合规违规或处理延迟。
本文演示了如何使用 Strands Agents SDK 构建多智能体解决方案。该方案编排三个专业智能体:用于文本推理的文档分析智能体、用于布局模式识别的向量相似度搜索智能体,以及用于质量保证的验证智能体。每个智能体在其专业领域内独立运作,然后通过编排器协作交付结果。
你将学习如何为自己的文档分类需求实现这种多智能体架构,并获得代码示例和技术指导。这种多智能体方法结合了 Anthropic 的 Claude Haiku 4.5 的高级推理能力与 Amazon Bedrock 上提供的 Amazon Titan Multimodal Embeddings 的视觉模式识别能力,以实现更高的分类准确性。
该解决方案架构结合了多个专业 AI 智能体,每个智能体针对文档分析的不同方面进行优化,通过协调编排协同工作。这种多智能体方法通过利用 Amazon Bedrock 上可用的不同基础模型和技术的独特优势,解决了单模型分类的局限性。
下图说明了这个多智能体方法:
图 1:多智能体文档分类架构

在我们的测试中,单模型方法在处理需要文本和视觉分析的边缘情况及复杂文档时表现不佳。多智能体系统通过将分类任务分解为专业子任务来解决这个问题,每个智能体专注于其专业领域。
我们选择 Strands Agents SDK 是因为它将智能体实现为工具,而我们的分类系统需要一个编排器,能够调用专业智能体作为可调用工具。验证智能体调用各个专业智能体,比较它们的分类结果,并在没有自定义编排代码的情况下解决分歧。这种模式提供了几个优势:
架构的核心是验证智能体,它充当编排器并使用 Strands Agents SDK 实现智能体即工具模式。该智能体通过交叉验证和置信度评分提供质量保证。它比较文档分析智能体和向量相似度搜索智能体的输出,识别一致和不一致的区域,然后生成带有相关置信度评分的最终分类。这个验证步骤帮助系统保持高精度,同时将边缘情况标记为需要人工审核。验证智能体与两个专业智能体协调工作:
文档分析智能体:该智能体使用 Amazon Bedrock 上的 Anthropic Claude Haiku 4.5 进行高级文本推理和法律语言解释。Claude 擅长理解复杂文档、提取关键信息以及识别文本中表明文档类型的细微模式。该智能体分析文档内容、元数据和语言特征以生成分类假设。
向量相似度搜索智能体:该智能体使用 Amazon Titan Multimodal Embeddings G1 将文档转换为高维向量表示,用于视觉相似度搜索。Claude Haiku 4.5 擅长理解文档内容:分析文本、提取关键信息以及识别语言模式。向量相似度搜索智能体通过专注于视觉和结构特征来补充这一点。该智能体捕获文档的外观而非其内容。它识别格式模式,如表单布局、表格结构和格式约定,这些特征可以区分文档类型,即使文本内容有所不同。该智能体使用 FAISS(Facebook AI Similarity Search)进行高效的向量相似度搜索,支持与已知文档模板的快速比较。
通过将文本分析和相似度分析与内置验证相结合,这种多智能体架构实现了更高的分类准确性,并为自动化决策提供了可靠的置信度评分。
在接下来的章节中,你将学习如何实现每个组件并部署完整解决方案。
要跟随本教程操作,你需要准备以下内容:
注意:本教程使用的 AWS 服务可能会产生费用。请务必查看 Amazon Bedrock 的定价,并遵循末尾的清理说明以避免持续产生费用。
让我们逐步实现多智能体系统的每个组件。完整代码可在我们的 GitHub 仓库中获取。
首先,通过 Amazon Bedrock 推理配置文件配置对 Claude 模型的访问。这可以跨区域提供一致的性能和可用性。
def create_bedrock_model(
model_id: str = "anthropic.claude-haiku-4-5-20251001-v1:0", #
temperature: float = 0.1,
max_tokens: int = 4096
) -> BedrockModel:
"""Create a configured Bedrock model instance."""
return BedrockModel(
model_id=model_id,
region_name="us-east-1",
temperature=temperature,
max_tokens=max_tokens
)
提示:为了降低延迟并提高可用性 (HA),你可以通过在模型 ID 前添加与部署区域匹配的地理前缀(us.、eu. 或 ap.)来使用跨区域推理配置文件。
文档分析智能体使用 Claude Haiku 4.5 的高级推理能力专注于文本内容分析。该智能体使用结构化输出来返回一致的、可机器解析的分类结果。
class TextualAnalysisOutput(BaseModel):
"""Structured output for document text analysis."""
classification: str = Field(description="Document category: POLICY, AFFIDAVIT, or MISCELLANEOUS")
confidence: float = Field(description="Classification confidence score from 0.0 to 1.0")
reasoning: str = Field(description="Explanation of textual features that led to this classification")
@tool
def analyze_document_text(document_text: str) -> str:
"""Analyze document text content to classify the insurance document."""
TEXTUAL_ANALYSIS_PROMPT = """You are a Document Analysis Specialist for insurance documents.
Analyze the provided document text and classify it into exactly one category:
- POLICY: Insurance policies, endorsements, declarations, coverage documents
- AFFIDAVIT: Sworn statements, notarized documents, legal declarations, regulatory filings
- MISCELLANEOUS: Any document that doesn't clearly fit the above categories
Provide your classification with a confidence score (0.0-1.0) and detailed reasoning
explaining what textual features led to your decision."""
text_agent = Agent(
model=create_bedrock_model(),
system_prompt=TEXTUAL_ANALYSIS_PROMPT,
conversation_manager=NullConversationManager(),
)
result = text_agent(
f"Classify this document:\n\n{document_text}",
structured_output_model=TextualAnalysisOutput,
)
return str(result.structured_output)
向量相似性搜索智能体使用 Amazon Titan Multimodal Embeddings 分析文档布局和视觉特征。
# Load FAISS index once at module level.
# allow_dangerous_deserialization=True is required because FAISS uses pickle internally;
# safe here since we created the index ourselves from our own training documents.
db = FAISS.load_local("hybrid_docs.vdb", embeddings=embeddings,
allow_dangerous_deserialization=True)
VECTOR_ANALYSIS_PROMPT = """You are a Vector Similarity Search Specialist.
Analyze the similarity search results and determine the document classification.
Consider the confidence scores and consistency of matches across pages."""
@tool
def analyze_document_vectors(pdf_path: str) -> str:
"""Classify document using vector similarity search with agentic reasoning."""
base64_pages = pdf_to_base64(pdf_path)
first_embedding = create_multimodal_embedding(image_base64=base64_pages[0])
results = db.similarity_search_by_vector(embedding=first_embedding, k=3)
labels = [r.metadata["label"] for r in results]
classification = Counter(labels).most_common(1)[0][0]
confidence = labels.count(classification) / len(labels)
vector_agent = Agent(
model=create_bedrock_model(),
system_prompt=VECTOR_ANALYSIS_PROMPT,
conversation_manager=NullConversationManager(),
)
result = vector_agent(
f"Vector search results for {pdf_path}:\n"
f"Top match: {classification} (confidence: {confidence:.2f})\n"
f"All matches: {labels}\n"
f"Provide final classification with reasoning.",
structured_output_model=VectorAnalysisOutput,
)
return str(result.structured_output)
该智能体使用 perform_vector_classification 执行 FAISS 向量相似性搜索,将文档与存储在向量数据库中的预训练视觉模式进行匹配。
步骤 4:实现校验智能体
校验智能体使用"智能体作为工具"模式协调各专业智能体。
class OrchestratorOutput(BaseModel):
"""Structured output for the validation orchestrator."""
textual_analysis: str = Field(description="Textual agent classification: POLICY, AFFIDAVIT, or MISCELLANEOUS")
textual_confidence: float = Field(description="Textual agent confidence 0.0-1.0")
vector_analysis: str = Field(description="Vector agent classification: POLICY, AFFIDAVIT, or MISCELLANEOUS")
vector_confidence: float = Field(description="Vector agent confidence 0.0-1.0")
final_classification: str = Field(description="Final validated classification")
confidence: float = Field(description="Overall confidence score")
requires_human_review: bool = Field(description="Whether edge case needs human review")
decision_logic: str = Field(description="Brief explanation of decision")
justification: str = Field(description="Detailed reasoning from both specialists")
class MultiAgentDocumentClassifier:
def __init__(self, model=None):
self.model = model or create_bedrock_model()
self.orchestrator = Agent(
model=self.model,
tools=[analyze_document_text, analyze_document_vectors],
system_prompt="""You are a Document Classification Orchestrator.
Your workflow:
1. Use analyze_document_text for textual analysis
2. Use analyze_document_vectors for visual similarity analysis
3. Synthesize both into a final classification
Reasoning guidelines:
- Both agree → high confidence (0.85-0.95)
- Disagree → textual is more reliable for content-rich docs, vector for visually distinctive formats
- Very short text (<50 chars) or low textual confidence (<0.3) → defer to vector analysis
- Endorsements are POLICY documents
- Flag for human review when evidence is contradictory
Always use both tools before deciding."""
)
校验智能体交叉检查两个专业智能体的结果以确保质量和一致性。
步骤 5:对文档进行分类
各组件就位后,以下是 MultiAgentDocumentClassifier 端到端处理文档的方式:
# Method of MultiAgentDocumentClassifier
def classify_document(self, pdf_path: str) -> OrchestratorOutput:
"""Classify a document using multi-agent orchestration."""
filename = os.path.basename(pdf_path)
text_content = extract_pdf_text(pdf_path, max_chars=3000)
query = f"""Classify this insurance document: {filename}
Document text content (first 3000 characters):
{text_content}
Document file path for vector analysis: {pdf_path}
Use both analyze_document_text and analyze_document_vectors, then synthesize."""
result = self.orchestrator(query, structured_output_model=OrchestratorOutput)
return result.structured_output
使用分类器:
classifier = MultiAgentDocumentClassifier()
result = classifier.classify_document("documents/sample_policy.pdf")
print(f"Classification: {result.final_classification}")
print(f"Confidence: {result.confidence:.2f}")
print(f"Reasoning: {result.justification}")
系统将每个文档交给专业智能体处理,将其分析综合为最终分类,并附有全面的推理说明。
理解结果
对于此工作负载,我们选择 Amazon Bedrock 上的 Claude Haiku 4.5 作为推理模型。Haiku 4.5 满足了我们的准确率要求,同时实现了更低的延迟和成本,平均每个文档分类耗时 19.3 秒,准确率达 93%。这使其非常适合在不影响正确性的前提下优先考虑速度和成本效益的生产工作负载。
常见方案对比
我们将多智能体系统与三种常用的 AWS 方案进行了基准测试。目标很简单:在满足合规敏感型工作负载准确率要求的前提下,找出最直接的方案。
Amazon Textract 和 Amazon Comprehend 专为文本提取和实体识别而构建。它们在这些任务上表现出色。然而,它们并非为多类文档分类而设计,在这类场景中文档共享重叠的法律术语。两者在我们的测试集上仅达到 25% 的准确率。Amazon Bedrock Data Automation(BDA)表现明显更好,达到 70%,正确处理了大多数 affidavits 和 miscellaneous 文档,但仍有近三分之一的文档被错误分类。多智能体系统是唯一在所有文档类别上达到 100% 准确率的方案。

准确率差距在 policy 文档上最为明显:这些文档包含密集的法律文本,术语与其他文档类别高度重叠。只有多智能体系统能正确分类它们。Affidavits 显示出类似的模式:BDA 处理得较好,但 Amazon Textract 和 Amazon Comprehend 无法将它们与相邻的法律文档类型区分开来。Miscellaneous 文档具有独特的结构标记,所有方案都能正确分类。
在我们使用有限评估范围(3 个类别共 20 份文档)的测试中,多智能体系统达到了 100% 的准确率,比次优方案(BDA 的 70%)提升了 30%。在大规模且更多样化的文档集上,生产环境的准确率可能会有所不同。Amazon Textract 和 Amazon Comprehend 分别是文本提取和实体识别的专用工具,在这些任务上表现出色。然而,它们并非为细微的多类文档分类而设计,在这类场景中文档共享重叠的术语。这些结果反映的是初始运行,未进行微调或自定义分类逻辑。通过额外配置,特定用例的准确率可能会有所提升。
多智能体系统以处理时间(约每文档 23 秒)为代价换取了显著更高的准确率,非常适合分类错误会带来合规或财务风险的使用场景。在多智能体框架内,Claude Haiku 4.5 与 Claude Sonnet 4.5 的准确率相当,但运行速度快 17%。这使其成为以更低延迟和成本处理生产工作负载的更好选择。
生产环境护栏
Amazon Bedrock Guardrails 为模型交互提供内容过滤和安全控制。可配置策略支持拒绝话题、内容过滤器、词汇过滤器以及敏感信息脱敏,以在应用层实现负责任的 AI 部署。对于处理敏感保险文档的文档分类管道,需要明确的控制措施来确保输出保持准确、适当和可审计。没有这些控制措施,分类管道可能产生幻觉的类别、在日志或下游系统中泄露敏感数据,或做出违反合规要求的自信但错误的决策。
部署此多智能体分类系统时,我们建议以下最佳实践:
应用个人身份信息(PII)编辑过滤器,以防止投保人信息传播到分类日志中。
配置主题拒绝策略,将 AI 智能体限制在其分类范围内。
开启 Amazon Bedrock 模型调用日志记录,以捕获完整的请求-响应链路,包括护栏干预事件,用于审计。
在我们的解决方案中,Validation Agent 中的 requires_human_review 标志在置信度低于定义阈值时触发自动升级。这确保了不确定的分类结果会到达人工审核员,而不是传播到下游。
为避免产生后续费用,请删除本演练期间创建的资源:
删除本地资源:
从本地环境中移除 FAISS 向量数据库文件(hybrid_docs.vdb)。
删除您上传用于分类的测试 PDF 文档。
如果为本项目专门创建了 Python 虚拟环境,请将其删除。
删除 AWS 资源:
如果您在 Amazon Simple Storage Service(Amazon S3)中存储了训练文档,请删除 S3 存储桶及其内容。
清除测试期间生成的 Amazon CloudWatch 日志。
在 AWS Management Console 中检查您的 Amazon Bedrock 使用情况,以确认没有正在进行的调用。
注意:Amazon Bedrock 按模型调用计费,因此没有需要删除的持久化资源。但是,查看您的使用情况有助于您了解测试期间产生的费用。
有关详细的清理说明和脚本,请参阅 GitHub 仓库中的清理部分。
这篇文章演示了如何通过使用 Amazon Bedrock 基础模型和 Strands Agents SDK 的多 AI 智能体工作流程来提高文档分类准确性。通过编排三个专业化的 AI 智能体,您可以实现更准确的分类结果,结合文本分析和视觉分析的优势。该解决方案使用由 Anthropic 的 Claude Haiku 4.5 驱动的 Document Analysis Agent、使用 Amazon Titan Multimodal Embeddings 的 Vector Similarity Search Agent,以及用于质量保证的 Validation Agent。
这种多 AI 智能体方法相比传统的单模型分类系统具有多项优势。专业化的 AI 智能体在其各自的专业领域内自主工作,然后通过 Orchestrator 协作,提供既准确又可解释的结果。您可以首先使用自己的文档类型实现 Document Analysis Agent,然后添加 Vector Similarity Search Agent 来提高视觉独特性文档的准确性。尝试不同的置信度阈值来确定人工审核的比例,以平衡自动化与质量保证。
更多资源:
在我们的 GitHub 仓库中探索完整实现。
了解更多关于 Amazon Bedrock 上可用的基础模型。
阅读 Strands Agents SDK 文档以了解高级编排模式。
查看关于智能文档处理和多 AI 智能体架构的相关文章。