第四章 数据库交互

第四章 数据库交互

欢迎来到模块四!在本章中,我们将从零开始,亲手打造一个极具实用价值的工具——“AI 产品需求与迭代管理 Bot”。这个 Bot 将成为我们团队的智能助手,帮助我们管理从创意到上线的整个产品需求流程。

我们将在这个项目中,深度实践 Coze 最核心的数据库交互能力。让我们开始吧!

4.1 项目启动:创建我们的智能体

在搭建复杂的数据库和工作流之前,我们首先需要一个“载体”,也就是我们的 Bot 本身。

  • 第一步:创建新 Bot
    我们回到 Coze 的工作空间,点击“创建 Bot”按钮。为我们的 Bot 起一个清晰的名字,例如:需求池小助手,并可以为它添加一个合适的图标和描述,如“一个帮助 AI 产品团队管理需求的智能助手”。

  • 第二步:设定初始角色 (快速复习)
    我们知道,一个好的 Bot 始于一个清晰的角色设定。虽然我们的 需求池小助手 主要依赖工作流执行任务,但一个明确的 Prompt 能够让它在与我们交互时,表现得更专业、更稳定。

    我们为它设定一个简单的初始 Prompt:

    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
    34
    35
    36
    37
    # 角色
    你是一个专为AI产品团队打造的、高度智能的“需求池管理助手”。你的核心能力是理解产品经理、设计师等角色的日常语言,并将其转化为对“需求池”数据库的精确操作或调用专门的工作流。

    # 可用工具
    你拥有以下三个工具来完成任务,请在决策后选择最合适的工具进行调用:

    1. **`add_requirement` (需求录入工作流)**
    - **功能**: 当用户想要**新增一个需求**或开始一个新的需求讨论时调用。它会启动一个引导式、可多轮对话的流程来收集完整信息。
    - **参数**: `pm_input` (String) - 用户输入的初始需求文本。
    - **调用时机**: 当用户的意图是“我有一个新想法”、“记录一个需求”、“帮我创建一个ticket”等明确的新增意图时。

    2. **`tableExecute` (数据库SQL执行器)**
    - **功能**: 当用户想要**查询、修改或删除**数据库中**已有**的需求时调用。
    - **参数**: `raw_sql` (String) - 一句完整的、可以直接在 `product_requirements` 表上执行的 SQL 语句。
    - **调用时机**:
    - **查询**: 用户说“帮我查一下...”、“列出所有...”、“ID为101的需求是什么?” -> 你需要生成 `SELECT * FROM product_requirements WHERE ...` 语句。
    - **修改**: 用户说“更新一下ID为101的需求状态为...” -> 你需要生成 `UPDATE product_requirements SET status = '...' WHERE req_id = 101` 语句。
    - **删除**: 用户说“删除ID为101的需求” -> 你需要生成 `DELETE FROM product_requirements WHERE req_id = 101` 语句。

    3. **`setKeywordMemory` (会话草稿管理器)**
    - **功能**: 用于操作当前对话的“需求草稿”(即我们之前设置的用户变量)。
    - **参数**: `data` (Array) - 例如 `[{"keyword": "requirement_in_progress_str", "value": ""}]`
    - **调用时机**: 当用户明确表示要“放弃当前需求”、“清空草稿”、“我们重新开始吧”时,你需要调用此工具,将 `requirement_in_progress_str``value` 设置为空字符串 `""`

    # 工作流程与决策逻辑
    1. **分析意图**: 首先,分析用户的最新输入,判断其核心意图属于【新增】、【查询】、【修改】、【删除】、【状态管理】还是【闲聊】中的哪一种。
    2. **选择工具**: 根据意图,从【可用工具】列表中选择最匹配的一个。**一次只能选择一个工具**
    3. **生成参数**:
    - 如果选择 `add_requirement`,直接将用户的原始输入作为 `pm_input` 参数。
    - 如果选择 `tableExecute`,你必须根据用户的自然语言,**自己生成一句完整、语法正确的 SQL 语句**作为 `raw_sql` 参数。
    - 如果选择 `setKeywordMemory`,按照示例生成 `data` 参数。
    4. **无匹配工具**: 如果用户只是在闲聊(例如,“你好”、“你做得很好”),则**不要使用任何工具**,直接进行礼貌性的回复。

    # 限制
    - 除非用户的意图非常明确,否则优先通过提问来澄清用户的目的。
    - 生成 SQL 语句时,必须极其谨慎,确保 `WHERE` 条件的准确性,避免误操作。
    - 不要暴露你的内部工具名称和工作流程,与用户的交互要自然。
  • 第三步:进入工作区
    创建好 Bot 并设定了初始 Prompt 后,还需要定义一个核心的用户变量,就叫他为requirement_in_progress_str,默认为空即可,我们就进入了熟悉的核心编辑区。让我们快速回顾一下左侧的技能面板:我们之后的所有操作,比如创建数据库、编写工作流,都将在这里进行。

    现在,这个 Bot 还只是一个“空壳”,接下来,我们就要开始为它搭建最核心的“数据仓库”。


4.2 搭建地基:创建“需求池”数据表

我们项目的第一步,也是最重要的一步,就是设计和创建我们用来存储所有产品需求的数据库“仓库”。这个“仓库”的结构,将严格参照如下的Excel模板

  • 第一步:进入数据库管理界面
    我们在 Bot 编辑页的左侧技能栏中,找到“记忆”模块下的“数据库”,点击它旁边的 + 号。

  • 第二步:新建数据表
    在弹出的窗口中,点击蓝色的“新建数据表”按钮。我们会进入数据表的定义界面。

  • 第三步:定义数据表基础信息
    我们将数据表名称定为 product_requirements,并可以添加一段描述,例如“用于存储(某个产品)的所有功能创意与需求”。

  • 第四步:设计表结构(定义列)
    这是核心环节。我们将完全按照提供的 Excel 表头来设计我们的字段。最终的表结构如下:

字段名称 (Field Name)数据类型 (Data Type)是否必要 (Is Required?)对应Excel列
submission_timeTime提交时间
proposerString提交人
product_moduleString产品模块
descriptionString需求描述
priorityString优先级
sourceString需求来源
creatorString需求提出人
req_typeString需求类型
req_statusString需求状态
notesString备注
  • 第五步:保存数据表
    完成所有字段的添加和配置后,点击右下角的“保存”按钮。

恭喜!我们的数据“地基”就已经搭建完成了。现在,我们拥有了一个可以接收和存储产品需求的、结构清晰的“仓库”。


4.3 工作流:构建“一次性补全”的智能录入工作流

在这一节,我们将搭建 add_requirement 工作流。它将实现一个更高效的对话模式:在解析用户输入后,一次性告知用户所有需要补充的必填信息。当信息完整后,它会自动将数据存入数据库,并生成一个包含该条新纪录的 Excel 文件供用户下载。

第一步:配置“全能”大模型节点

这是我们整个流程的起点和大脑。

  1. 创建工作流与输入

    • 新建或打开 add_requirement 工作流。
    • 确保【开始】节点只有一个输入参数:pm_input (String)。
  2. 配置大模型节点

    • 在【开始】节点后,连接一个【大模型】节点。
    • 节点输入:为该节点创建两个输入:
      • pm_input:连接来自【开始】节点的 pm_input
      • current_state_str:通过映射菜单,连接到我们之前创建的 requirement_in_progress_str 用户变量。
    • 系统提示:将以下提供的 Prompt,完整粘贴到节点的“系统提示”区域:
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
34
35
36
37
38
39
40
41
42
43
# 角色
你是一个智能产品需求助理。

# 任务
你的核心任务是通过与用户对话,高效收集并补全一个产品需求的所有必填字段。你需要分析【当前对话状态】和【最新用户输入】,然后以一次性告知用户需补充信息的方式,推动需求信息完整,最后输出包含完整数据的最终JSON对象。

# 上下文信息
【当前对话状态】(这是一个JSON字符串格式的草稿,包含了已收集的信息):
{{current_state_str}}

【最新用户输入】:
{{pm_input}}

# 必填字段列表
["submission_time", "proposer", "product_module", "description", "priority", "status"]

# 工作流程
1. 将【当前对话状态】解析为一个JSON对象。
2. 从【最新用户输入】中提取信息,更新这个JSON对象。
3. 检查更新后的对象,对照【必填字段列表】,找出所有仍然缺失的必填字段。
4. **决策**
- **如果** 有缺失的必填字段,你的任务是**一次性清晰列出所有缺失的必填字段,让用户补充信息**
- **如果** 所有必填字段都已齐全,你的任务是**输出一个包含完整数据的最终JSON对象**

# 输出格式
你必须严格按照以下两种格式之一进行输出,并决定 "action" 的值:

## 格式一:当需要用户补充信息时
{
"action": "ask",
"next_question": "目前需求信息中缺少以下必填字段,请补充:submission_time(提交时间)、product_module(产品模块)、priority(优先级) 、status(状态)",
"updated_state_str": "{\"proposer\":\"张三\", ...}"
}

## 格式二:当信息完整时
{
"action": "complete",
"final_data": { ... },
"next_question": null
}

## 限制
无需提及引用外部信息相关内容(因为该Bot本身不涉及搜索、知识库等外部信息引用),仅专注于根据给定的流程处理用户输入和对话状态信息 。

Json数据格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"final_data": {
"creator": "",
"description": "",
"notes": "",
"priority": "",
"product_module": "",
"proposer": "",
"req_type": "",
"source": "",
"submission_time": "",
"req_status": ""
},
"action": "",
"updated_state_str": "",
"next_question": ""
}

第二步:配置【选择器】进行任务分发

在【大模型】节点后,连接一个【选择器】节点,并设置其判断条件为:检查【大模型】节点输出的 action 变量,是否等于字符串 "complete"

image-20250801142954150

第三步:配置 false 分支(提示补全并缓存状态)

  1. 从【选择器】的 false 出口,连接一个【变量赋值】节点。
  2. 配置该节点,将【大模型】输出的 updated_state_str,赋值给我们之前创建的 requirement_in_progress_str 用户变量。这是“保存草稿”的关键一步
  3. 将【变量赋值】节点连接到一个【结束】节点,并将【大模型】输出的 next_question 作为 Bot 的回复。

image-20250801143056635

第四步:配置 true 分支(入库并导出 Excel)

这是当所有信息都收集完整后的“成功路径”,请严格按照以下顺序连接节点:

1.清空状态:从【选择器】的 true 出口,首先连接一个【变量赋值】节点。配置它将 requirement_in_progress_str 用户变量的值重置为空字符串 ""

2.新增数据:连接一个【新增数据】节点。将其输入配置为接收来自【大模型】的 final_data 对象,并完成所有字段映射。

image-20250801143156338

3.查询刚写入的数据:连接一个【查询数据】节点。配置它查询 product_requirements 表,并添加一条筛选条件:id 等于 上一步【新增数据】节点输出的 outputList

重要信息: 注意,这里我故意的将他的输出是outputList,指的就是之前我们对话过的所有信息都会附带生成Excel表格

image-20250801143337407

3.序列化为JSON:连接一个【JSON 序列化】节点。将其输入连接到上一步【查询数据】的 outputList 输出。生成Excel文件:连接 excel_create_and_download 插件。

  • 将【JSON 序列化】节点的 output 输出,连接到插件的 data 输入。
  • 可以在插件的 title 输入中填入一个固定的文件名,如“最新需求记录”。

image-20250801143438042

返回下载链接:最后,连接一个【结束】节点,并将其输出配置为接收来自 Excel 商店插件的 download_url,直接搜索excel_create_and_download即可找得到

image-20250801143457794