7.1 为何需要数据库:记忆与状态管理
内容讲解
默认情况下,AI Bot 是**“无状态”的。这意味着除了短暂的当前对话上下文,它不记得任何过去的事情。每次对话都是一次全新的开始。然而,在许多真实场景中,我们需要 Bot 拥有记忆**,能够持久化地存储和检索信息。这就是**数据库(Database)**的作用。
数据库为 Bot 提供了以下关键能力:
- 长期记忆:记住用户的偏好、历史订单、个人信息等。例如,一个订餐 Bot 应该记住你常去的地址和喜欢的口味。
- 状态跟踪:在复杂的多轮任务中,跟踪当前的进度。例如,一个游戏 Bot 需要记录玩家当前的等级、装备和任务状态。
- 数据共享:在多个用户或多个 Bot 之间共享信息。例如,一个团队任务管理 Bot 需要让所有成员都能看到最新的任务列表。
- 数据分析:收集和存储用户交互数据,用于后续的分析和 Bot 优化。
Coze 内置了一个简单易用的 键值(Key-Value)数据库,让开发者无需关心复杂的数据库配置和管理,就能轻松为 Bot 添加持久化存储能力。
7.2 Coze 内置数据库的使用
内容讲解
Coze 的内置数据库可以被看作是一个巨大的“字典”或“表格”。你通过一个唯一的 **“键”(Key)**来存取一个对应的 “值”(Value)。这个“值”可以是文本、数字,或者更复杂的结构化数据。
核心概念:
- Table(表):数据库的基本组织单位。你可以创建多个表来存储不同类型的数据,例如
users表和orders表。 - Key(键):表中的唯一标识符,用于定位一条记录。通常我们会使用用户的 ID (
user_id) 或会话 ID (session_id) 作为主键。 - Value(值):与键关联的实际数据。它可以是单个值,也可以是一个包含多个字段的对象。
操作步骤:在 Bot 中启用数据库
- 进入 Bot 编辑页面:打开你的 Bot。
- 添加数据库能力:在左侧的技能编排区,找到“数据库”部分。
- 创建数据表:点击“添加”,然后“创建表”。
- 表名:输入一个有意义的名称,例如
user_preferences。 - 主键:定义表的主键,例如
user_id。 - 字段:添加你想要存储的数据字段,例如
favorite_movie_type(文本类型) 和viewed_count(数字类型)。
- 表名:输入一个有意义的名称,例如
- 保存:点击“确认”后,这张表就与你的 Bot 关联起来了。
7.3 数据的增、删、改、查操作
内容讲解
对数据库的操作,通常是通过工作流(Workflow)中的数据库节点来完成的。Coze 提供了直观的节点来执行标准的 CRUD 操作。
database_create(创建/插入):向表中添加一条新的记录。database_update(更新):修改表中已有记录的某个或某些字段的值。database_read(读取/查询):根据主键(Key)从表中检索一条记录。database_delete(删除):根据主键从表中删除一条记录。
实战:创建一个记录用户偏好的工作流
让我们创建一个名为 record_preference 的工作流,用于记录用户喜欢的电影类型。
工作流设计
record_preference_workflow
记录不存在
记录已存在
database_read
Table: user_preferences
Key: {{A.user_id}}
Start
input: user_id, movie_type
database_create
Table: user_preferences
Data: {user_id: ..., favorite_movie_type: ...}
database_update
Table: user_preferences
Key: {{A.user_id}}
Data: {favorite_movie_type: ...}
End
实现要点:
- Start 节点:定义输入为
user_id和movie_type。 - database_read 节点:首先尝试读取该用户的记录,判断是新用户还是老用户。
- 判断逻辑:
database_read节点的输出会包含一个error字段。如果error存在(表示记录未找到),则流程走向“创建”分支;否则走向“更新”分支。 - database_create / database_update 节点:根据判断结果,执行相应的写操作。
7.4 综合实战:实现一个带记忆的“待办事项助手”
项目目标:创建一个功能完备的 To-Do List Bot。用户可以添加新任务、查看所有任务、以及将任务标记为“已完成”。Bot 必须为每个独立用户维护其专属的待办列表。
第一步:数据库设计
- 创建表:在 Bot 的数据库能力中,创建一个名为
todo_lists的表。 - 主键:设置主键为
user_id,这是一个至关重要的步骤,它保证了每个用户的数据是隔离的。 - 字段设计:添加一个名为
tasks的字段,其数据类型选择为 对象数组 (Array)。这允许我们在一个字段里存储一个列表,列表中的每个元素都是一个代表任务的对象。 - 任务对象结构:定义
tasks数组中每个对象的结构,包含两个属性:content(String): 任务的具体内容。status(String): 任务的状态,默认为pending(待办),可变为done(已完成)。
第二步:创建三个核心工作流
1. 工作流:add_task_workflow
- 功能:向指定用户的任务列表中添加一个新任务。
- 流程图:
1graph TD 2 A[Start<br>input: user_id, task_content] --> B{Code: 构造新任务对象<br>code: `return {"content": task_content, "status": "pending"}`<br>output: new_task}; 3 B --> C{database_update: 追加任务<br>Table: todo_lists<br>Key: {{A.user_id}}<br>Mode: Append to Array<br>Field: tasks<br>Value: {{B.new_task}}}; 4 C --> D[End<br>output: "任务已成功添加!"];
- 节点说明:我们使用了
database_update节点的“追加到数组”(Append to Array)模式,这比“先读再写”更高效。
2. 工作流:view_tasks_workflow
- 功能:查询并格式化展示用户的所有待办任务。
- 流程图:
1graph TD 2 A[Start<br>input: user_id] --> B{database_read<br>Table: todo_lists<br>Key: {{A.user_id}}<br>Output: user_data}; 3 B --> C{Code: 格式化输出<br>input: {{B.user_data.tasks}}<br>code: 遍历任务列表,生成带编号和状态的字符串<br>output: formatted_list}; 4 C --> D[End<br>output: {{C.formatted_list}}];
- 节点说明:Code 节点用于将从数据库读出的原始数据(对象数组)转换成人类易读的文本格式,例如:`1. [待办] 学习Coze数据库
- [已完成] 喝杯咖啡`。
3. 工作流:complete_task_workflow
- 功能:将用户指定的某个任务状态标记为“已完成”。
- 流程图:
1graph TD 2 A[Start<br>input: user_id, task_index] --> B{database_read<br>Table: todo_lists<br>Key: {{A.user_id}}<br>Output: user_data}; 3 B --> C{Code: 修改任务状态<br>input: {{B.user_data.tasks}}, {{A.task_index}}<br>code: 将指定索引任务的status改为'done'<br>output: updated_tasks}; 4 C --> D{database_update: 写回整个列表<br>Table: todo_lists<br>Key: {{A.user_id}}<br>Mode: Overwrite<br>Field: tasks<br>Value: {{C.updated_tasks}}}; 5 D --> E[End<br>output: "任务已标记为完成!"];
- 节点说明:这里需要先读出整个任务列表,在 Code 节点中修改其中一个元素的状态,然后再用修改后的完整列表覆盖写回数据库。
第三步:配置 Bot 的 Prompt
1# 角色 2你是一个高效的待办事项(To-Do List)助手。 3 4# 技能 51. **识别意图**:你能理解用户是想“添加任务”、“查看任务”还是“完成任务”。 62. **提取参数**: 7 - 对于添加任务,你需要提取任务内容。 8 - 对于完成任务,你需要提取任务的编号。 93. **调用工作流**:根据用户意图,调用相应的工作流来执行操作。 10 - 意图“添加” -> 调用 `add_task_workflow`,传入 `task_content` 和 `{{user_id}}`。 11 - 意图“查看” -> 调用 `view_tasks_workflow`,传入 `{{user_id}}`。 12 - 意图“完成” -> 调用 `complete_task_workflow`,传入 `task_index` 和 `{{user_id}}`。 134. **回复结果**:将工作流的输出结果清晰地回复给用户。 14 15# 限制 16- 如果用户指令不明确,你需要主动询问以获取必要信息(例如,“您想完成哪个任务?请输入任务编号。”)。 17- 所有操作都必须通过调用工作流完成。 18
本章总结
本章我们为 Bot 赋予了最重要的能力之一——记忆。通过学习,你不仅理解了数据库在 Bot 开发中的核心价值,还掌握了如何在 Coze 中设计数据表、配置字段,并通过工作流节点执行增、删、改、查 (CRUD) 操作。最后,通过从零到一构建一个功能完备的“待办事项助手”,我们将所有知识点融会贯通,实现了一个真正有用的、能提供个性化服务的持久化应用。
拥有了数据库能力,你的 Bot 不再是一个健忘的对话伙伴,而是一个能够长期服务、持续学习的智能助理。
《第7章:数据库与持久化存储》 是转载文章,点击查看原文。