ADK pull 下来的本地项目结构:YAML 和 Python 文件组织
目录结构总览
一次成功的 poly pull 后,本地目录结构大致是:
project-root/
├── agent_settings/ # 智能体身份和行为
│ ├── role.yaml # 角色设定
│ ├── personality.yaml # 语气和风格
│ └── rules.txt # 固定规则(始终为真的指令)
├── topics/ # 知识话题(RAG 召回)
│ ├── Frequently Asked Questions.yaml
│ ├── Billing Issues.yaml
│ └── ...
├── functions/ # Python 业务逻辑
│ ├── check_billing.py
│ ├── verify_identity.py
│ └── ...
├── flows/ # 多步引导式对话
│ ├── greeting/
│ │ ├── flow_config.yaml
│ │ ├── flow_step_welcome.yaml
│ │ └── flow_step_intro.yaml
│ └── reservation/
│ ├── flow_config.yaml
│ ├── flow_step_*.yaml
│ └── transition_check_availability.py
├── config/ # 其他配置
│ ├── entities/ # 自定义实体类型
│ │ └── billing_amount.yaml
│ ├── handoffs/ # 转接人工配置
│ ├── sms_templates.yaml # 短信模板
│ └── variant_attributes.yaml
├── voice/ # 语音渠道配置
├── chat/ # 聊天渠道配置
├── test_suite/ # 模拟测试用例
└── .polyconfig # ADK 内部配置(不要手动改)
每类资源的职责
| 目录 | 职责 | 和 Studio 的对应 |
|---|---|---|
agent_settings/ | 智能体始终遵守的设定 | Agent Settings 页面里的各项配置 |
topics/ | 知识话题——用户问什么问题,智能体答什么 | Knowledge → FAQs 区域 |
functions/ | Python 业务逻辑——计算、API 调用、条件判断 | Studio Functions 区域 |
flows/ | 多步引导式对话的完整步骤 | Studio Flows 编辑器 |
config/ | 实体类型、转接配置、短信模板等 | Studio 分散在各个设置区域 |
voice/ / chat/ | 渠道专属设置 | Studio Channels 区域 |
一个 topic YAML 长什么样
enabled: true
actions: ""
content: |
本店接受 Visa、Mastercard 和 PayPal 支付。
退款通常需要 3-5 个工作日处理。
example_queries:
- What payment methods do you accept?
- 退款需要多久到账?
- Can I pay with PayPal?
每个字段对应 Studio 界面里的一个输入框:
| 字段 | 对应 Studio 输入 |
|---|---|
enabled | 话题是否激活 |
actions | Actions 字段(触发 Flow、转接人工等) |
content | 回答内容(多行) |
example_queries | 示例问题列表 |
资源交叉引用语法
不同文件之间的引用使用占位符语法,ADK 在 push 时自动解析:
| 语法 | 含义 | 示例 |
|---|---|---|
{{fn:function_name}} | 引用一个 Python 函数 | Flow 里调用 billing 检查函数 |
{{entity:entity_name}} | 引用一个实体类型 | Flow Collect Step 里指定要收集的实体 |
{{ho:handoff_name}} | 引用一个转接目标 | Flow 里配置转接人工时引用 |
{{vrbl:variable_name}} | 引用一个状态变量 | 跨步骤传递数据 |
这种语法让你在 YAML 里引用 Python 函数、实体类型等都很直观。
知识 vs 行为的边界
ADK 文档里特别强调这个区分,因为这是新手最容易犯的错:
| 类型 | 放在哪里 | 内容 |
|---|---|---|
| 知识 / 事实 | topics/ | 主题特定的信息,通过 RAG 动态召回 |
| 行为 / 逻辑 | agent_settings/rules.txt(始终为真的指令)或 flows/ + functions/(条件逻辑) | 智能体应该做什么、什么时候做 |
常见错误:
- 把行为指令写进 topic 的
content里 → 应该用 topic 的actions字段或写进rules.txt - 把事实性知识写进
rules.txt→ 浪费 LLM context,应该放topics/ - 用 prose 条件句写分支逻辑 → 应该用 Python 函数实现精确的 if/else 判断