Skip to content

Commit cb0a10a

Browse files
Gemini CLIclaude
andcommitted
docs: add .env.example template and ADK architecture optimization guide
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 7fcabac commit cb0a10a

2 files changed

Lines changed: 175 additions & 0 deletions

File tree

data_agent/.env.example

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
# ============================================================
2+
# GIS Data Agent v4.0 — Environment Configuration Template
3+
# ============================================================
4+
# Copy this file to .env and fill in your values:
5+
# cp .env.example .env
6+
#
7+
# IMPORTANT:
8+
# - Do NOT use 'export' prefix (python-dotenv handles bare KEY=VALUE)
9+
# - Use forward slashes in Windows paths (D:/path/to/file)
10+
# - Do NOT commit .env to version control
11+
# ============================================================
12+
13+
# ==========================
14+
# REQUIRED: Database
15+
# ==========================
16+
POSTGRES_HOST=localhost
17+
POSTGRES_PORT=5432
18+
POSTGRES_DATABASE=gis_agent
19+
POSTGRES_USER=postgres
20+
POSTGRES_PASSWORD=your_password
21+
22+
# ==========================
23+
# REQUIRED: AI Model
24+
# ==========================
25+
# Option A: Vertex AI (recommended for production)
26+
GOOGLE_GENAI_USE_VERTEXAI=TRUE
27+
GOOGLE_CLOUD_PROJECT=your-gcp-project-id
28+
GOOGLE_CLOUD_LOCATION=us-central1
29+
30+
# Option B: Google AI Studio API Key (simpler setup)
31+
# GOOGLE_GENAI_USE_VERTEXAI=0
32+
# GOOGLE_API_KEY=AIzaSy...your_api_key
33+
34+
# ==========================
35+
# REQUIRED: Authentication
36+
# ==========================
37+
# Generate with: chainlit create-secret
38+
CHAINLIT_AUTH_SECRET=your_random_secret_key_here
39+
40+
# ==========================
41+
# OPTIONAL: OAuth2 Login
42+
# ==========================
43+
# Uncomment to enable "Sign in with Google" button
44+
# OAUTH_GOOGLE_CLIENT_ID=your_google_client_id
45+
# OAUTH_GOOGLE_CLIENT_SECRET=your_google_client_secret
46+
47+
# ==========================
48+
# OPTIONAL: Agent Behavior
49+
# ==========================
50+
# Dynamic planner uses transfer_to_agent; false = fixed SequentialAgent pipelines
51+
DYNAMIC_PLANNER=true
52+
53+
# ==========================
54+
# OPTIONAL: Map Services
55+
# ==========================
56+
# Gaode Maps (高德) — geocoding & reverse geocoding
57+
# GAODE_API_KEY=your_gaode_api_key
58+
59+
# Tianditu (天地图) — basemap tiles (Vec + Img)
60+
# TIANDITU_TOKEN=your_tianditu_token
61+
62+
# ==========================
63+
# OPTIONAL: Cloud Storage
64+
# ==========================
65+
# Huawei Cloud OBS (S3-compatible)
66+
# HUAWEI_OBS_AK=your_access_key
67+
# HUAWEI_OBS_SK=your_secret_key
68+
# HUAWEI_OBS_SERVER=https://obs.cn-north-4.myhuaweicloud.com
69+
# HUAWEI_OBS_BUCKET=your_bucket_name
70+
71+
# AWS S3
72+
# AWS_ACCESS_KEY_ID=your_access_key
73+
# AWS_SECRET_ACCESS_KEY=your_secret_key
74+
# AWS_REGION=us-east-1
75+
# AWS_S3_BUCKET=your_bucket_name
76+
77+
# Google Cloud Storage
78+
# GCS_BUCKET=your_bucket_name
79+
80+
# ==========================
81+
# OPTIONAL: Enterprise Bots
82+
# ==========================
83+
# WeChat Work (企业微信)
84+
# WECOM_CORP_ID=your_corp_id
85+
# WECOM_APP_SECRET=your_app_secret
86+
# WECOM_TOKEN=your_callback_token
87+
# WECOM_ENCODING_AES_KEY=your_aes_key
88+
# WECOM_AGENT_ID=1000002
89+
# WECOM_SHARE_BASE_URL=https://your-domain.com
90+
91+
# DingTalk (钉钉)
92+
# DINGTALK_APP_KEY=your_app_key
93+
# DINGTALK_APP_SECRET=your_app_secret
94+
# DINGTALK_ROBOT_CODE=your_robot_code
95+
# DINGTALK_SHARE_BASE_URL=https://your-domain.com
96+
97+
# Feishu / Lark (飞书)
98+
# FEISHU_APP_ID=your_app_id
99+
# FEISHU_APP_SECRET=your_app_secret
100+
# FEISHU_VERIFICATION_TOKEN=your_verification_token
101+
# FEISHU_ENCRYPT_KEY=your_encrypt_key
102+
# FEISHU_SHARE_BASE_URL=https://your-domain.com
103+
104+
# ==========================
105+
# OPTIONAL: Redis (Real-time Streams)
106+
# ==========================
107+
# Falls back to in-memory if not configured
108+
# REDIS_URL=redis://localhost:6379/0
109+
110+
# ==========================
111+
# OPTIONAL: Observability
112+
# ==========================
113+
# LOG_LEVEL=INFO
114+
# LOG_FORMAT=text
115+
# AUDIT_LOG_RETENTION_DAYS=90
116+
117+
# ==========================
118+
# OPTIONAL: Usage Limits
119+
# ==========================
120+
# DAILY_ANALYSIS_LIMIT=20
121+
# MONTHLY_TOKEN_LIMIT=0
122+
123+
# ==========================
124+
# OPTIONAL: Extensions
125+
# ==========================
126+
# ArcPy Integration (use forward slashes!)
127+
# ARCPY_PYTHON_EXE=D:/path/to/arcgis/python.exe
128+
129+
# MCP Toolbox
130+
# MCP_TOOLBOX_URL=http://localhost:8080
131+
132+
# Google Earth Engine
133+
# GEE_SERVICE_ACCOUNT_KEY=path/to/key.json
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# 架构设计优化建议:基于 Google ADK 多智能体最佳实践
2+
3+
## 1. 现状评估与架构亮点
4+
当前项目(GIS Data Agent)的代码逻辑(主要位于 `data_agent/agent.py`)已经具备了相当成熟的架构思想,特别是非常出色地遵循了 Google Agent Developer Kit (ADK) 的核心设计模式:
5+
6+
* **分层的智能体组合 (Hierarchical Task Decomposition)**
7+
* **静态工作流 (Workflow Agents)**:通过 `SequentialAgent` 定义了固定且严格的业务流水线(如 `DataPipeline` 的 Ingestion -> Analysis -> Viz -> Summary),确保了核心生产流程的可预测性。
8+
* **动态协调者模式 (Coordinator/Dispatcher Pattern)**:通过 `planner_agent` 作为枢纽,利用 LLM 的意图理解能力将任务派发给专业的 Explorer、Processor 等 Agent。这符合 ADK 推荐的 Hub-and-Spoke 路由架构。
9+
* **状态解耦与通信 (Shared Session State)**
10+
* 系统完美遵循了 ADK 中通过 `output_key` 进行跨 Agent 通信的规范(上游输出状态,下游通过 `{}` 模板读取)。这种松耦合设计使得每个 Agent 可以被独立测试和复用。
11+
12+
---
13+
14+
## 2. 存在的不足与架构优化建议
15+
16+
虽然系统具备良好的基础架构,但在处理复杂的 GIS 场景时,在并发管理、容错机制、路由效率和人为干预方面仍存在以下优化空间:
17+
18+
### 2.1 隐患:并发流的时序依赖隐患 (Parallel Fan-Out 误用风险)
19+
* **问题描述**:在开启 `PARALLEL_INGESTION` 时,系统使用 `ParallelAgent``knowledge_agent`(业务知识检索)与 `data_engineering_agent`(数据探查与处理)并行执行。因为这两个分支并发运行,如果 `data_processing_agent` 在进行空间特征处理时需要参考刚刚检索出来的领域规范或计算公式,它将无法获取到(并行状态在合并前互不可见)。
20+
* **优化建议**
21+
* **AgentTool 模式 (推荐)**:将 `knowledge_agent` 从并行的 Peer Agent 降级,使用 ADK 的 `AgentTool` 进行包装。把它作为一种“工具”放入 `data_processing_agent``tools` 列表里。这样,处理 Agent 在遇到不懂的领域规则时,可以**主动调用**知识 Agent 进行查询,而不是盲目并行。
22+
* 或者,如果数据处理强依赖检索到的规范,应放弃这里的 `ParallelAgent`,改回串行架构。
23+
24+
### 2.2 缺失:基于 LoopAgent 的迭代反馈与审查 (Generator-Critic Pattern)
25+
* **问题描述**:代码中当前依赖 `after_tool_callback=_self_correction_after_tool` 进行工具报错时的自我修正。但这仅能处理**语法/系统级报错**。在复杂的 GIS 空间计算中,可能代码不报错但业务结果错误(如:多边形自交、指标不达标、破碎度 FFI 异常)。当前直线型的 Pipeline 无法“打回去重做”。
26+
* **优化建议**
27+
* 引入 ADK 的 **`LoopAgent`** 结合 **Generator-Critic(生成器-批评家)模式**
28+
*`data_analysis_agent`(生成器)之后增加一个 `quality_checker_agent`(批评家)。
29+
* 将它们放入 `LoopAgent` 中:`Analysis` 生成空间布局 -> `Checker` 检验拓扑和约束 -> 如果不达标,`Checker` 触发事件并附带修改意见,循环回到 `Analysis` 修正,直到 `Checker` 判定达标(或达到 `max_iterations`)才跳出循环进入下一步。
30+
31+
### 2.3 性能瓶颈:动态路由带来的 Token 损耗与延迟
32+
* **问题描述**:在 `Dynamic Planner` 架构中,`planner_agent` 给所有子 Agent 设置了 `disallow_transfer_to_peers=True`。这意味着子 Agent 执行完毕后,必须将控制权交回给 Planner,由 Planner 的 LLM 决定下一步。这会导致极高的上下文传递开销,仅仅为了让 Planner 做出一个显而易见的决定(如“分析完了,转给 Visualization”)。
33+
* **优化建议**
34+
* **子工作流打包**:对于逻辑上高度粘合的连续动作,不要把它们作为平级的子节点挂在 Planner 下。
35+
* **架构重构**:使用 `SequentialAgent` 将它们组合成子工作流(例如 `Analysis_And_Viz_Workflow`),然后将这个整体挂载给 Planner。Planner 只需要做一次调度,子工作流内部自动串行跑完,大幅降低路由延迟和 Token 消耗。
36+
37+
### 2.4 风险:高价值决策缺少 Human-in-the-Loop (HITL) 机制
38+
* **问题描述**:整个数据治理或优化流程是一个“一按到底”的黑盒。GIS 选址或土地性质修改属于高风险业务决策,如果 Agent 执行了不符合现实条件的推演,或者即将向数据库执行破坏性的操作,目前系统缺乏拦截机制。
39+
* **优化建议**
40+
* **PolicyEngine 拦截**:利用 ADK 提供的 `PolicyEngine``SecurityPlugin` 机制。
41+
* 在关键 Agent 或敏感 Tool(如 `commit_spatial_changes`)上设置拦截策略:当准备执行时,`SecurityPlugin` 挂起执行,向外抛出 `PolicyOutcome.CONFIRM` 事件。
42+
* **人工审批**:前端界面弹出一个审批框(例如展示优化前后的对比图),人类分析师点击“批准”后,系统发送 `FunctionResponse` 允许 Agent 继续执行。这不仅提升了系统安全性,也是企业级 AI Agent 的核心特性。

0 commit comments

Comments
 (0)