CrabNote螃蟹笔记

闪记精灵

闪记精灵

闪记精灵 闪记精灵 Modified March 19, 2025 折腾过程中意外百宝箱数据库实现逻辑为Text to Sql 模式,在执行过程的 per prompt 可以看到提示词 使用Text to Sql 的优势在于,用户不需要去关注SQL语句,只需要用自然语言表述出自己想要查询的数据内容,降低了用户的使用门槛 Code block Markdown You are an expert SQL analyst. When appropriate, generate SQL queries(SELECT,UPDATE,INSERT,DELETE) based on the user question and the database schema. Always not use '::' to convert data type When use SELECT, not use SELECT . When you generate a query, use the 'sql execute' tool to execute the query on the database and get the results. Then, use the results to answer the user's question. database schema: [{"columns":[{"description":"消费内容 ","name":"field0","nullable":"NOT NULL","type":"String"},{"description":"消费类型 Literal[“交通”, “餐饮”, “购物”, “娱乐”]","name":"field1","nullable":"NOT NULL","type":"String"},{"description":"支付方式 分为现金、银行卡、微信、支付宝。default:现金","name":"field2","nullable":"NULL","type":"String"},{"description":"消费金额 ","name":"field3","nullable":"NOT NULL","type":"DECIMAL(10,2)"},{"description":"消费时间 default date:今天 default time:8:00","name":"field4","nullable":"NOT NULL","type":"timestamp"},{"description":"消费地点 default: 未知","name":"field5","nullable":"NULL","type":"String"}],"description":"记账数据库","tableName":"table 20250225kwCZ01592849"}] 该提示词分为三个部分: ✨ 基础提示词 You are an expert SQL analyst. When appropriate, generate SQL queries(SELECT,UPDATE,INSERT,DELETE) based on the user question and the database schema. 用于根据根据用户的提问和数据库表结构生成对应的 sql 语句 🚫 限制 1. 不能直接查询所有 When use SELECT, not use SELECT . 限制了不能直接不带条件查询数据库中所有数据 2. 使用 sql execute 工具执行 SQL 语句 When you generate a query, use the 'sql execute' tool to execute the query on the database and get the results. Then, use the results to answer the user's question. 使用 sql execute 工具执行生成的 SQL 语句,并将查询结果作为答案返回给用户 📊 表结构 database schema: [{"columns":[{"description":"消费内容 ","name":"field0","nullable":"NOT NULL","type":"String"},{"description":"消费类型 Literal[“交通”, “餐饮”, “购物”, “娱乐”]","name":"field1","nullable":"NOT NULL","type":"String"},{"description":"支付方式 分为现金、银行卡、微信、支付宝。default:现金","name":"field2","nullable":"NULL","type":"String"},{"description":"消费金额 ","name":"field3","nullable":"NOT NULL","type":"DECIMAL(10,2)"},{"description":"消费时间 default date:今天 default time:8:00","name":"field4","nullable":"NOT NULL","type":"timestamp"},{"description":"消费地点 default: 未知","name":"field5","nullable":"NULL","type":"String"}],"description":"记账数据库","tableName":"table 20250225kwCZ01592849"}] 添加了数据库后,就会自动生成该数据库的表结构,并填写到per prompt的database schema部分 由此可知,在创建表结构时,需要认真填写所有的信息。这些信息都会作为生成 SQL 语句的参考 【坑一】数据库报错信息不具体 无法通过报错信息准确判断出问题,并且在执行过程中也无法看到执行的 SQL 语句信息 【坑二】数据库只能执行简单SQL,并且每轮对话只能执行一次SQL操作 1. 只能执行简单SQL • 第一版提示词如果内容中包含多条消费记录,先对消费记录进行拆分,然后将这些消费记录整合成一次完整的数据库操作,记录到数据库中,在对话框测试后,报错说插入失败,可能存在数据格式错误或技术故障 • 第二版提示词 如果内容中包含多条消费记录,则使用 语句将消费记录保存到数据库中(失败) • 第三版提示词 如果内容中包含多条消费记录,先对消费记录进行拆分,然后将这些消费记录整合成一次完整的数据库操作,记录到数据库中(失败) • 怀疑是SQL语句转化出现问题,直接给具体的SQL语句再次执行(失败) Code block SQL INSERT INTO table 20250225kwCZ01592849 (field0, field1, field2, field3, field4, field5) VALUES ('豆浆', '餐饮', '现金', 3.00, '2025 02 28 08:00:00', '未知'), ('牛肉刀削面', '餐饮', '现金', 15.00, '2025 02 28 12:00:00', '未知'), ('水饺', '购物', '现金', 12.00, '2025 02 28 18:00:00', '未知'); 反复测试后,发现一条 insert into 语句插入多组数据都回导致sql 执行失败 只有在插入一条数据的情况下,是能执行成功的 2. 无法一次性执行多条语句 • 拆分成多条插入语句,然后一次性执行(失败) Code block Markdown 1. 先对用户输入的内容进行理解,判断是一条消费记录还是多条消费记录 2. 如果是一条消费记录就执行一次数据库操作 3. 如果内容中包含多条消费记录,先对消费记录进行拆分,然后根据消费记录依次执行数据库操作 实在折腾的没办法,那就干脆把多条记录拆分开来。通过多轮对话的方式,一次插入一条消费数据 Code block Markdown 工作流 1. 理解用户输入的消费信息 2. 将消费信息依次拆分成独立的消费记录 3. 从第一条消费记录开始,提示用户确认操作内容 """ ✍ 第 x 条操作 消费内容: xxx 消费类型: xxx 消费金额: xxx 消费时间: xxx 消费地点: xxx 请确认以上信息是否正确,输入”确认“以执行保存操作。 如果有任何需要修改的地方,请告诉我。 """ 4. 待用户确认后,执行这条消费记录的数据库操作,并等待数据库执行完成 5. 自己查询下刚刚的操作是否成功,若未记录成功,请重新记录 6. 然后重复步骤 3,直到所有消费记录记录完成 该提示词测试通过,紧接着又出现了新的问题: 【虚假插入】有概率返回信息说数据插入成功,而实际数据库中并 不存在该记录 【重复插入】多轮对话中,第一条记录重复插入多次 【坑三】按步骤执行时,无法查找出所有数据 只要在按步骤执行获取所有消费记录这个操作,一定会执行失败 但是,如果在对话框中输入“获取所有消费记录”却又能成功 最后是写成固定SQL语句,才保证了每次执行的成功 Code block Markdown 查询所有数据:SELECT field0 AS 消费内容, field1 AS 消费类型, field2 AS 支付方式, field3 AS 消费金额, field4 AS 消费时间, field5 AS 消费地点 FROM table 20250225kwCZ01592849; 【坑四】图表配置过长时,原始URL链接不识别 Code block Bash https://quickchart.io/chart?v=2.9.4&c={ type: 'gauge', data: { datasets: [ { value: 50, data: [20, 40, 60], backgroundColor: ['green', 'orange', 'red'], borderWidth: 2, }, ], }, options: { valueLabel: { fontSize: 22, backgroundColor: 'transparent', color: ' 000', formatter: function (value, context) { return value + ' mph'; }, bottomMarginPercentage: 10, }, }, } 该原始链接不会被MD图片标签语法识别为URL链接,导致无法加载图片 甚至就连手动将该地址丢进地址栏访问问后,都会出现报错信息 经过多轮测试,最终解决方案,填写解码后的URL链接。这个链接既能被MD语法识别,也不会出现访问错误问题 总结 1. 百宝箱数据库功能刚刚推出,还存在较多不完善的地方,需要等待官方逐一修复解决 [https://quickchart.io/chart?v=2.9.4&c={ type: 'gauge', data: { datasets: [ { value: 50, data: [20, 40, 60], backgroundColor: ['green', 'orange', 'red'], borderWidth: 2, }, ], }, options: { valueLabel: { fontSize: 22, backgroundColor: 'transparent', color: ' 000', formatter: function (value, context) { return value + ' mph'; }, bottomMarginPercentage: 10, }, }, }](https://quickchart.io/chart?v=2.9.4&c=%7B%0A%20%20type%3A%20%27gauge%27%2C%0A%20%20data%3A%20%7B%0A%20%20%20%20datasets%3A%20%5B%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20value%3A%2050%2C%0A%20%20%20%20%20%20%20%20data%3A%20%5B20%2C%2040%2C%2060%5D%2C%0A%20%20%20%20%20%20%20%20backgroundColor%3A%20%5B%27green%27%2C%20%27orange%27%2C%20%27red%27%5D%2C%0A%20%20%20%20%20%20%20%20borderWidth%3A%202%2C%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%5D%2C%0A%20%20%7D%2C%0A%20%20options%3A%20%7B%0A%20%20%20%20valueLabel%3A%20%7B%0A%20%20%20%20%20%20fontSize%3A%2022%2C%0A%20%20%20%20%20%20backgroundColor%3A%20%27transparent%27%2C%0A%20%20%20%20%20%20color%3A%20%27%23000%27%2C%0A%20%20%20%20%20%20formatter%3A%20function%20(value%2C%20context)%20%7B%0A%20%20%20%20%20%20%20%20return%20value%20%2B%20%27%20mph%27%3B%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20bottomMarginPercentage%3A%2010%2C%0A%20%20%20%20%7D%2C%0A%20%20%7D%2C%0A%7D) 折腾过程中意外百宝箱数据库实现逻辑为Text to Sql 模式,在执行过程的 per prompt 可以看到提示词 使用Text to Sql 的优势在于,用户不需要去关注SQL语句,只需要用自然语言表述出自己想要查询的数据内容,降低了用户的使用门槛 该提示词分为三个部分: ✨ 基础提示词 You are an expert SQL analyst. When appropriate, generate SQL queries(SELECT,UPDATE,INSERT,DELETE) based on the user question and the database schema. You are an expert SQL analyst. When appropriate, generate SQL queries(SELECT,UPDATE,INSERT,DELETE) based on the user question and the database schema. 用于根据根据用户的提问和数据库表结构生成对应的 sql 语句 🚫 限制 1. 不能直接查询所有 When use SELECT, not use SELECT . When use SELECT, not use SELECT . 限制了不能直接不带条件查询数据库中所有数据 2. 使用 sql execute 工具执行 SQL 语句 When you generate a query, use the 'sql execute' tool to execute the query on the database and get the results. Then, use the results to answer the user's question. When you generate a query, use the 'sql execute' tool to execute the query on the database and get the results. Then, use the results to answer the user's question. 使用 sql execute 工具执行生成的 SQL 语句,并将查询结果作为答案返回给用户 📊 表结构 database schema: [{"columns":[{"description":"消费内容 ","name":"field0","nullable":"NOT NULL","type":"String"},{"description":"消费类型 Literal[“交通”, “餐饮”, “购物”, “娱乐”]","name":"field1","nullable":"NOT NULL","type":"String"},{"description":"支付方式 分为现金、银行卡、微信、支付宝。default:现金","name":"field2","nullable":"NULL","type":"String"},{"description":"消费金额 ","name":"field3","nullable":"NOT NULL","type":"DECIMAL(10,2)"},{"description":"消费时间 default date:今天 default time:8:00","name":"field4","nullable":"NOT NULL","type":"timestamp"},{"description":"消费地点 default: 未知","name":"field5","nullable":"NULL","type":"String"}],"description":"记账数据库","tableName":"table 20250225kwCZ01592849"}] database schema: [{"columns":[{"description":"消费内容 ","name":"field0","nullable":"NOT NULL","type":"String"},{"description":"消费类型 Literal[“交通”, “餐饮”, “购物”, “娱乐”]","name":"field1","nullable":"NOT NULL","type":"String"},{"description":"支付方式 分为现金、银行卡、微信、支付宝。default:现金","name":"field2","nullable":"NULL","type":"String"},{"description":"消费金额 ","name":"field3","nullable":"NOT NULL","type":"DECIMAL(10,2)"},{"description":"消费时间 default date:今天 default time:8:00","name":"field4","nullable":"NOT NULL","type":"timestamp"},{"description":"消费地点 default: 未知","name":"field5","nullable":"NULL","type":"String"}],"description":"记账数据库","tableName":"table 20250225kwCZ01592849"}] 添加了数据库后,就会自动生成该数据库的表结构,并填写到per prompt的database schema部分 由此可知,在创建表结构时,需要认真填写所有的信息。这些信息都会作为生成 SQL 语句的参考 【坑一】数据库报错信息不具体 无法通过报错信息准确判断出问题,并且在执行过程中也无法看到执行的 SQL 语句信息 【坑二】数据库只能执行简单SQL,并且每轮对话只能执行一次SQL操作 1. 只能执行简单SQL • 第一版提示词如果内容中包含多条消费记录,先对消费记录进行拆分,然后将这些消费记录整合成一次完整的数据库操作,记录到数据库中,在对话框测试后,报错说插入失败,可能存在数据格式错误或技术故障 • 第二版提示词 如果内容中包含多条消费记录,则使用 语句将消费记录保存到数据库中(失败) • 第三版提示词 如果内容中包含多条消费记录,先对消费记录进行拆分,然后将这些消费记录整合成一次完整的数据库操作,记录到数据库中(失败) • 怀疑是SQL语句转化出现问题,直接给具体的SQL语句再次执行(失败) 反复测试后,发现一条 insert into 语句插入多组数据都回导致sql 执行失败 只有在插入一条数据的情况下,是能执行成功的 2. 无法一次性执行多条语句 • 拆分成多条插入语句,然后一次性执行(失败) 实在折腾的没办法,那就干脆把多条记录拆分开来。通过多轮对话的方式,一次插入一条消费数据 该提示词测试通过,紧接着又出现了新的问题: 【虚假插入】有概率返回信息说数据插入成功,而实际数据库中并 不存在该记录 【重复插入】多轮对话中,第一条记录重复插入多次 【坑三】按步骤执行时,无法查找出所有数据 只要在按步骤执行获取所有消费记录这个操作,一定会执行失败 但是,如果在对话框中输入“获取所有消费记录”却又能成功 最后是写成固定SQL语句,才保证了每次执行的成功 【坑四】图表配置过长时,原始URL链接不识别 [https://quickchart.io/chart?v=2.9.4&c={ type: 'gauge', data: { datasets: [ { value: 50, data: [20, 40, 60], backgroundColor: ['green', 'orange', 'red'], borderWidth: 2, }, ], }, options: { valueLabel: { fontSize: 22, backgroundColor: 'transparent', color: ' 000', formatter: function (value, context) { return value + ' mph'; }, bottomMarginPercentage: 10, }, }, }](https://quickchart.io/chart?v=2.9.4&c=%7B%0A%20%20type%3A%20%27gauge%27%2C%0A%20%20data%3A%20%7B%0A%20%20%20%20datasets%3A%20%5B%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20value%3A%2050%2C%0A%20%20%20%20%20%20%20%20data%3A%20%5B20%2C%2040%2C%2060%5D%2C%0A%20%20%20%20%20%20%20%20backgroundColor%3A%20%5B%27green%27%2C%20%27orange%27%2C%20%27red%27%5D%2C%0A%20%20%20%20%20%20%20%20borderWidth%3A%202%2C%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%5D%2C%0A%20%20%7D%2C%0A%20%20options%3A%20%7B%0A%20%20%20%20valueLabel%3A%20%7B%0A%20%20%20%20%20%20fontSize%3A%2022%2C%0A%20%20%20%20%20%20backgroundColor%3A%20%27transparent%27%2C%0A%20%20%20%20%20%20color%3A%20%27%23000%27%2C%0A%20%20%20%20%20%20formatter%3A%20function%20(value%2C%20context)%20%7B%0A%20%20%20%20%20%20%20%20return%20value%20%2B%20%27%20mph%27%3B%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20bottomMarginPercentage%3A%2010%2C%0A%20%20%20%20%7D%2C%0A%20%20%7D%2C%0A%7D) 该原始链接不会被MD图片标签语法识别为URL链接,导致无法加载图片 甚至就连手动将该地址丢进地址栏访问问后,都会出现报错信息 经过多轮测试,最终解决方案,填写解码后的URL链接。这个链接既能被MD语法识别,也不会出现访问错误问题 总结 1. 百宝箱数据库功能刚刚推出,还存在较多不完善的地方,需要等待官方逐一修复解决 2. 目前数据库只能在对话流中使用,对话流又是一个强依赖 prompt 的模式。当尝试实现较为复杂的操作时,会导致编写和测试成本急剧升高。这时候,就需要选择工作流模式去降低实现成本。希望官方也给工作流添加一个数据库节点 智能体信息 智能体名称 闪记精灵 https://tbox.alipay.com/pro/share/202502APnubb00279390?platform=WebService 智能体介绍 我是闪记精灵。只需要将消费信息发送给我,我能记录您的每一次消费细节。同时,凭借强大的数据分析能力,为您提供专属消费行为模式分析 智能体类型 对话型+数据库 奖项 百宝箱第五届“deepseek 来袭”比赛【二等奖】 智能体名称 智能体名称 闪记精灵 https://tbox.alipay.com/pro/share/202502APnubb00279390?platform=WebService 闪记精灵 https://tbox.alipay.com/pro/share/202502APnubb00279390?platform=WebService 智能体介绍 智能体介绍 我是闪记精灵。只需要将消费信息发送给我,我能记录您的每一次消费细节。同时,凭借强大的数据分析能力,为您提供专属消费行为模式分析 我是闪记精灵。只需要将消费信息发送给我,我能记录您的每一次消费细节。同时,凭借强大的数据分析能力,为您提供专属消费行为模式分析 智能体类型 智能体类型 对话型+数据库 对话型+数据库 奖项 奖项 百宝箱第五届“deepseek 来袭”比赛【二等奖】 百宝箱第五届“deepseek 来袭”比赛【二等奖】 实现功能 记录消费信息 当输入信息中包含多条消费记录时,有概率会只能成功记录第一条信息 还在努力尝试优化提示词 ing... 当输入信息中包含多条消费记录时,有概率会只能成功记录第一条信息 还在努力尝试优化提示词 ing... 💡作用:输入消费的时间地点内容,智能体会分析并保存到数据库中 ⚙️测试用例: 🦄回复结果: 通过多轮对话的方式,让用户识别将要保存的信息。当发现记录错误时可以直接提出修改,待用户确认后数据才会保存到数据库中 计算恩格尔系数 💡作用:读取数据库中所有消费记录,然后将进行恩格尔系数计算,并以图表展示数据 ⚙️测试用例: 🦄回复结果: 分析消费类型分布 💡作用:读取数据库中所有消费记录,统计各消费类型和消费金额,并以图表展示数据分析结果 ⚙️测试用例: 🦄回复结果: 实现过程 创建数据库 数据表列名 列描述 数据类型 是否必填 消费内容 消费的事项或物品 文本 是 消费类型 分为餐饮、交通、购物、娱乐 文本 是 支付方式 分为支付宝,微信,现金,银行卡 文本 否 消费金额 数值 是 消费时间 默认日期为今日,默认时间为八点 时间 是 消费地点 消费的具体场所 文本 否 数据表列名 数据表列名 列描述 列描述 数据类型 数据类型 是否必填 是否必填 消费内容 消费内容 消费的事项或物品 消费的事项或物品 文本 文本 是 是 消费类型 消费类型 分为餐饮、交通、购物、娱乐 分为餐饮、交通、购物、娱乐 文本 文本 是 是 支付方式 支付方式 分为支付宝,微信,现金,银行卡 分为支付宝,微信,现金,银行卡 文本 文本 否 否 消费金额 消费金额 数值 数值 是 是 消费时间 消费时间 默认日期为今日,默认时间为八点 默认日期为今日,默认时间为八点 时间 时间 是 是 消费地点 消费地点 消费的具体场所 消费的具体场所 文本 文本 否 否 设置提示词 提示词主要分为,基础提示词和指令两个部分 • 基础提示词定义了智能体最基本的行为(角色,任务,工作流) • 指令部分用于给智能体添加一些具体的数据分析行为 绘制图表部分用到了quickchart这个网站 通过chart.js的规则编写图表配置语法,以此生成图表URL链接。在访问URL后就能获得对应图表的图片 【发现】数据库使用 Text to Sql 模式