GenAI应用时代,开发思想如何变革

如果无法正常显示,请先停止浏览器的去广告插件。
分享至:
1. GenAI应 时代 开发思想如何变 演讲 :莫欣 北京智体纪元科技有限公司 / 创始 ?
2. 演讲 :莫欣 · 北京智体纪元科技有限公司创始 · Agently.tech AI应 开发框架负责 · 百度 桨PPDE、知乎知学堂合作讲师 · 前光年之外产品专家 · 前美团 级产品专家 · 全栈型产品经理,15年以上独 项 开发经验 · 深耕 数据、研发平台 具领域超过13年 · 深度参与美团数据平台建设0-100全过程 2022年末开始深 研究 模型应 开发 熟悉LangChain、AutoGen等应 开发框架 熟悉Agent、Agentic Work ow设计和开发 擅 设计及实现 模型能 与各类业务场景结合的落地 案 已为多家相关企业提供培训、咨询及技术 持服务 · · · · ·
3.
4. 录 03 04 05 01 让我们从 段没有任何实现代码但可以正确运 的空函数说起… 01 Function Calling、MCP背后的智能输出控制为什么很重要? 02 GenAI到底带来了什么实质变化和分 03 开发者不会消亡,但要进 04 GenAI应 协作关系冲击? 哪些改变? 开发框架如何帮助开发者适应新的 产关系?
5. 段没有任何实现代码但可以正确运 01 让我们从 的空函数说起…
6. 这是 段没有任何实现代码的空函数 @agent.auto_func def check_definition_from_question(question: str) -> { "official_name": ("str", ), "definition": ("str", ), "source_link": ("str", ) }: """Search definition in `question` from the Internet""" return
7. 运 下 print(check_definition_from_question(" 苏打的学名是什么")) { "official_name": "碳酸氢钠", "definition": "碳酸氢钠(英语:sodium bicarbonate、IUPAC名:sodium hydrogen carbonate、baking soda)是 种 机化合物,化学式为NaHCO3,俗称 苏 打、 苏打粉、苏打粉、重曹、焙 碱等,为 细 晶体,在 中的溶解度 于碳酸钠,呈弱 碱性。", "source_link": "https://zh.wikipedia.org/zh-hans/ %E7%A2%B3%E9%85%B8%E6%B0%A2%E9%92%A0" }
8. 这是另 段没有任何实现代码的空函数 @agent.auto_func def write_SQL_for_different_DB(question: str, meta_data: list[dict], db_type: str) -> { "runable_SQL": ("str", ), }: """ Search SQL examples for target database type `db_type` then write runable SQL to answer `question` according target database type SQL examples and `meta_data` """ return
9. 同样运 下 print(write_SQL_for_different_DB( question="昨天的不同商品的营业额分别是多少?", meta_data=[ { "table_name": "orders", "columns": [ { "name": "id", "type": "int" }, { "name": "item_order_ids", "type": "str", "desc": "JSON string of item order id list<list[int]>" }, { "name": "user_id", "type": "int", "desc": "customer id" }, { "name": "datetime", "type": "int", "desc": "timestamp" }, ], }, { "table_name": "item_orders", "columns": [ { "name": "id", "type": "int" }, { "name": "item_id", "type": "int" }, { "name": "item_name", "type": "str" }, { "name": "quality", "type": "int" }, { "name": "price", "type": "float", "desc": "price for each item" }, { "name": "discount", "type": "float", "desc": "discount for this item order" }, ], }, ], db_type="Presto", ))
10. 得到结果 { "runable_SQL": "WITH yesterday_orders AS ( SELECT id, CAST(json_parse(item_order_ids) AS ARRAY(ARRAY(INTEGER))) AS item_order_ids_array FROM orders WHERE date_diff('day', from_unixtime(datetime), current_date) = 1 ), flattened_orders AS ( SELECT o.id AS order_id, item_order_id FROM yesterday_orders o CROSS JOIN UNNEST(item_order_ids_array) AS t(item_order_ids) CROSS JOIN UNNEST(item_order_ids) AS t2(item_order_id) ) SELECT io.item_name, SUM(io.price * (1 - io.discount) * io.quality) AS turnover FROM flattened_orders fo JOIN item_orders io ON fo.item_order_id = io.id GROUP BY io.item_name ORDER BY turnover DESC", "reference_links": [ "https://prestodb.io/docs/current/functions/json.html", "https://prestodb.io/docs/current/functions/datetime.html" ] }
11. 在@agent.auto_func的背后发 了什么? import json import requests import Agently agent = ( Agently.create_agent(is_debug=True) .set_settings("current_model", "OAIClient") .set_settings("model.OAIClient.auth", { "api_key": "<DeepSeek-API-Key>" }) .set_settings("model.OAIClient.url", "https://api.deepseek.com/v1") .set_settings("model.OAIClient.options", { "model": "deepseek-chat" }) ) @agent.tool(tool_name="search") def search(keywords: "list")->str: """根据关键词,在互联 搜索相关信息""" payload = json.dumps({ "q": ' '.join(keywords) if isinstance(keywords, list) else keywords, }) headers = { 'X-API-KEY': "<SerperDev-API-Key>", 'Content-Type': 'application/json' } response = requests.request("POST", "https://google.serper.dev/search", headers=headers, data=payload) return response.text @agent.tool(tool_name="browse") def browse(url: "str")->str: return requests.get(url).content.decode()
12. 在@agent.auto_func的背后发 了什么? agent.set_settings("DeepSeek") @agent.tool(tool_name="search") @agent.tool(tool_name="browse") @agent.auto_func Some Processing Nodes Before NoCode Function Some Processing Nodes After IN CODE AT RUNTIME
13. IN CODE AT RUNTIME
14. IN CODE AT RUNTIME 搭了员 能访问的DeepSeek对话界 买了各种编程Copilot会员 ≠帮员 ”交付 个最终结果 ≠ 各类“Agent应 ≠在内
15. IN CODE AT RUNTIME …
16. 02 什么是智能输出控制?为什么它很重要?
17. 让我们再回到这张图 agent.set_settings("DeepSeek") @agent.tool(tool_name="search") @agent.tool(tool_name="browse") @agent.auto_func Some Processing Nodes Before NoCode Function Some Processing Nodes After IN CODE AT RUNTIME
18. 如果…… 各类工具 Tools 操作计算机 Computer Use 补充数据 Additional Data ··· 更多能力 More Abilities = ? 所有问题的 解决 案? Answer:42?
19. 并不! = 符合业务需要的 智能 + 模型驱动的 智能处理过程 模型提供的 基础智能
20. Function Calling举例 是 ?
21. Function Calling举例
22. Function Calling举例
23. 智能处理过程 盒化 可以根据业务实际情况,灵活调整处理过程
24. 同样是Function Calling还可以… 工具库 (海量) 建立索引方案 工具信息索引 模型处理 ---------------- 判断用户指令意图 判断是否有对应工具索引 !" 如果有对应索引 给出索引条件 用户指令 !" 如果没有可用工具 直接回复 查询工具库 获得工具信息 工具信息 输出索引条件 模型处理 ---------------- 判断用户指令意图 判断是否有可用工具 是 !" 如果有可用工具 生成工具调用指令 是否调用 否 输出模型回复 role: assistant type: text 输出工具调用指令 role: tool type: function 是 是否调用工具 !" 如果没有可用工具 直接回复 可以根据业务实际情况,灵活调整处理过程 否 输出模型回复 role: assistant type: text
25. 主构建智能处理过程需要解决的问题 !" 如果没有可用工具 直接回复 模型请求? 输出工具调用指令 role: tool type: function 是 是否调用工具 否 输出模型回复 role: assistant type: text 如何编排管理复杂处理过程? 如何对复杂处理过程进 格式化封装?
26. 智能输出控制 如何将外部模块数据输 模型请求? 如何识别 户意图 如何让模型根据分条件进 后续输出 如何将模型结果作为处理过程分 判断条件? 如何调 外部模块获得返回结果? 如何编排管理复杂处理过程? 如何对复杂处理过程进 格式化封装?
27. 构成GenAI应 的三个关键要素 理解能力 判断能力 模型 基础智能 底座模型 ChatBot 规划能力 表达能力 外部知识补充 GenAI应用 数据 模型微调 客服Bot 知识库Bot 知识补充 内部知识补充 RAG知识增强 调整模型 输出习惯 模型微调 行动规划/编排 控制 行为方法 工具/模块调用 应用开发 运行时处理 数据持久化 Assistant个人助理 智能营销流水线 ⻓文写作 新闻搜索汇总 智能设备控制 ...
28. 构成GenAI应 的三个关键要素 理解能力 判断能力 模型 基础智能 底座模型 ChatBot 规划能力 表达能力 智能输出控制 外部知识补充 GenAI应用 数据 模型微调 知识补充 最被忽视,但却是结果即交付的关键 内部知识补充 RAG知识增强 调整模型 输出习惯 模型微调 客服Bot 知识库Bot 行动规划/编排 控制 行为方法 工具/模块调用 应用开发 运行时处理 数据持久化 Assistant个人助理 智能营销流水线 ⻓文写作 新闻搜索汇总 智能设备控制 ...
29. 03 GenAI带来的实质变化和分 协作关系冲击
30. 我今天不谈AI Coding 都是程序员是个伪命题 但我要讲的变化和冲击 AI Coding影响更 更深远
31. 让我们来思考 个问题:为什么展示层是这样的?
32. 让我们来思考 个问题:为什么展示层是这样的? 基于业务模式设计的 数据操作指令集 基于业务架构设计的 结构化数据 严谨、准确、 度结构化
33. 让我们来思考 基于业务模式设计的 数据操作指令集 基于业务架构设计的 结构化数据 严谨、准确、 度结构化
34. 让我们来思考 基于业务模式设计的 数据操作指令集 严谨、准确、 基于业务架构设计的 结构化数据 度结构化
35. 应 的三层级架构(Three-Tires Architecture) 表示层 Presentation Tier 程序的 户界 和通信层,最终 户在此与应 程序交互 其主要 的是向 户显示信息并收集来 户的信息 通常是CLI / GUI / Web / Mobile App / 程序 应 应 使 业务逻辑( 层 Application Tier 也称为逻辑层或中间层,是应 程序的核 组特定的业务规则)处理表示层收集的信息,并添加、删除或修改数据层中的数据 通常使 API接 通讯,并隔离表示层和数据层之间的通讯 数据层 Data Tier 数据层(有时也称为数据库层、数据访问层或后端)是应 程序处理信息的地 需要根据业务场景、实体关系构建恰当的信息模型 通常以数据库系统为核 参考资料:https://www.ibm.com/think/topics/three-tier-architecture
36. 三层级架构带来的分 关系 业务问题和诉求表达 业务 员 业务 信息 管理 & 系统 操作 Business Information Management & Operation 产品运营 & 业务运营
37. 三层级架构带来的分 协作关系 业务问题和诉求表达 业务 员 如何读写数据? 业务 信息 管理 & 系统 操作 Business Information Management & Operation 产品运营 & 业务运营
38. GenAI在业务场景中的常 能 工具库 (海量) 建立索引方案 用户指令 工具信息 输出索引条件 模型处理 ---------------- 判断用户指令意图 判断是否有可用工具 是 !" 如果有可用工具 生成工具调用指令 是否调用 否 !" 如果没有可用工具 直接回复 输出模型回复 role: assistant type: text !" 如果有对应索引 给出索引条件 工具信息索引 模型处理 ---------------- 判断用户指令意图 判断是否有对应工具索引 查询工具库 获得工具信息 !" 如果没有可用工具 直接回复 输出工具调用指令 role: tool type: function 是 是否调用工具 否 输出模型回复 role: assistant type: text
39. GenAI在业务场景中的常 能 !" 如果没有可用工具 直接回复 知识学习及 应答 输出工具调用指令 role: tool type: function 是 是否调用工具 Knowledge Learning & Response 输出模型回复 否 role: assistant type: text
40. 新能 转化为结构化指令 进 步,将模糊表达 转化为数据访问 案 基于业务模式设计的 基于业务架构设计的 数据操作指令集 结构化数据 严谨、准确、 度结构化
41. 进 如何读写数据? 业务 信息 管理 & 系统 操作 Business Information Management & Operation 产品运营 & 业务运营
42. 进 层 如何对反馈结果 进 恰当呈现? 如何规划后续 交互? 如何实际完成 相关操作? 如何反馈结果? 稳固的业务 如何为处理过程 边界在哪 如何防控不恰当 提供恰当的数据? Data 操作? ? Tier 数据层 业务 信息 管理 & 系统 操作 Business Information Management & Operation 产品运营 & 业务运营
43. 进 业务 信息 管理 产品运营 & & 业务运营 系统 操作 Business Information Management & Operation
44. 04 开发者不会消亡!但需要进 改变!
45. 不可否认,GenAI的出现让
46. 不可否认,GenAI的出现让
47. IN CODE AT RUNTIME …
48. 在GenAI时代,开发 员还需要关 所以,我可以... 把它做成独 APP发布到线上给 付记账 更多 吗? 利 这个APP收费赚钱吗? 再做个电商/教育/XX APP吗? 反正上 业务流程梳理 个APP我做着感觉没什 么难度! 业务架构设计
49. 在GenAI时代,开发 员还需要关 受 到 冲 击
50. 我 过的 种协作 外部模型接 外部模型接 请求Prompt管理 封装 模型 请求 接 交互界 返回结果封装 私有模型 部署推理 式…
51. 我 封装 输 封装 输出 交互 界
52. 我 交互 界
53. 当 程师真正开始接受in code at runtime… 更复杂的 流程编排能 SOA、 状态化等架构思想 级联遍历、递归、动态拼装等 难以 图形化界 简单表达的编排 更全 的 信息系统观 GenAI能 融 业务流程 能够灵活调 系统中的其他模块 获取信息、协同完成任务 重新建 开发范式认知 掌握in code模型输出控制 法 能够从 户的每 次交互 每 个 动中发现更多信息 在 向业务 户的流程中 也可以引 GenAI能 处理 IN CODE AT RUNTIME
54. 开发需要使 04 为什么GenAI应 开发框架?它能解决哪些问题?
55. 很多开发者可能都听过下 这种论调… “ 不要使 任何框架,直接调 模型接 在AI应 范式都没有确定的早期阶段 所有的开发框架都是过度封装!
56. 可是这真的对吗? “ ? 不要使 任何框架,直接调 模型接 在AI应 范式都没有确定的早期阶段 所有的开发框架都是过度封装! 意识≠了解所有琐碎细节 GenAI能 建
57. 好的开发框架应该… 建 GenAI能 ❌ 不同模型接 请求格式、消息队列差异和其他潜规则 ❌ 如何将不同结构的数据置 ❌ 不同模型接 请求Prompt 返回消息结构的格式差异 ✅ 理解模型能 ✅ 选择能 的通常性边界和适 场景 与当前业务问题适配的模型 ✅ 基于模型能 规划业务执 流程 ❌ 约束不同模型返回结构化数据时的控制 法差异 ✅ 基于业务场景对输出效果进 观测校验 ❌ 如何进 ✅ 将业务场景、执 流程转化为代码实现 ✅ 协同调 … 和其他系统模块 可靠的结构化解析和流式解析 请求Prompt ❌ 如何将不同结构的数据置 … 意识≠了解所有琐碎细节 模型能
58. 好的开发框架应该… 建 GenAI能 意识≠了解所有琐碎细节 简化基础、底层、规范性、重复性 作的开发 让开发者将注意 集中到关键业务、事务逻辑上
59. 好的开发框架应该…
60. 那么你说的这个体验,它到底是个什么体验呢? @agent.auto_func def write_SQL_for_different_DB(question: str, meta_data: list[dict], db_type: str) -> { "runable_SQL": ("str", ), }: """ Search SQL examples for target database type `db_type` then write runable SQL to answer `question` according target database type SQL examples and `meta_data` """ return 规范融合,贴近 指令和开发语 然语 将 程师思维
61. 那么你说的这个体验,它到底是个什么体验呢? ( agent .input({ "row_data": row_data }) .instruct("请根据{INPUT.row_data}提供的数据样例,给出:\n" \ "1. 符合SQLite要求的CREATE TABLE IF NOT EXISTS建表语句," \ f"表名必须为{ self.table_name }," \ "额外增加 个名为`embedding_queries`的列,存放TEXT数据," \ "以及 个名为`document`的列,存放TEXT数据;\n" \ "2. {INPUT.row_data}的Key和新建表的列的映射关系。\n" \ "注意:\n" \ "所有 库数据都会经过json.dumps()函数处理,如果有复杂结构会转换为TEXT\n" \ "列名都应该为英 表示,防 出现编码错误" ) .output({ "sql": ("str", "建表语句"), "mapping": ("{ <Key 1>: <列名 1>, ... }", "映射关系") }) .start() ) 保留Prompt表意灵活性,增强输出格式稳定性控制
62. 那么你说的这个体验,它到底是个什么体验呢? 持MCP
63. 那么你说的这个体验,它到底是个什么体验呢? ( workflow = Agently.Workflow() workflow .connect_to("initialize") .connect_to("make_next_plan") .if_condition( lambda return_value, storage: return_value["type"] == "输出结果" ) .connect_to("reply") .connect_to("end") .else_condition() .connect_to("use_tool") .connect_to("make_next_plan") @workflow.chunk() async def initialize(inputs, storage): ... @workflow.chunk() def make_next_plan(inputs, storage): agent = storage.get("$agent") result = ( agent ... .start() ) return result["next_step_action"] ) workflow.start( "请帮我查找数据库中是否存在 程信息," \ "将所有找到的 程信息通过邮件发送到moxin@agently.tech", storage = { "$agent": agent, "print_process": True, "mcp_server_params": [...] } ) @workflow.chunk() async def reply(inputs, storage): ... @workflow.chunk() async def use_tool(inputs, storage): ... 流畅编程体验,轻松将可视化 作流迁移到代码中
64. 那么你说的这个体验,它到底是个什么体验呢? [🪛 我觉得需要使 具]: 🤔 我想要解决的问题是: 列出数据库中的所有表,以确定是否存在存储 🤔 我想要使 程信息的表。 的 具是: list_tables 🎉 我得到的结果是: [{'name': 'sqlite_sequence'}, {'name': 'schedule'}, {'name': 'shopping_list'}] ... [🪛 我觉得需要使 具]: 🤔 我想要解决的问题是: 查询schedule表中的所有 🤔 我想要使 程信息 的 具是: read_query 🎉 我得到的结果是: [{'id': 1, 'date': '2025-04-18', 'time': '10:30', 'event': '线上会议', 'participant': 'XX负责 ... [🪛 我觉得需要使 具]: 🤔 我想要解决的问题是: 将查询到的 🤔 我想要使 X总'}] 程信息通过邮件发送到moxin@agently.tech 的 具是: sendEmailWithoutAttachment 🎉 我得到的结果是: 邮件成功发送 ... [💬 我觉得可以回复了]: 对了,这段代码实际运 程信息如下:[{'id': 1, 'date': '2025-04-18', 结果是这样的 ✅ 我得到的最终结果是: 已经成功查询到 程信息并发送到moxin@agently.tech邮箱。 'time': '10:30', 'event': '线上会议', 'participant': 'XX负责 X总'}]
65. 那么你说的这个体验,它到底是个什么体验呢? 以及,我的确收到了这个Agent脚本发来的邮件 源码地址:https://github.com/AgentEra/Agently/blob/main/examples/planning_loop_demo.py
66. 上 是我们在当前版本做的部分 Agently.tech 作 e c r u o e! S - n Ope e to us Fre
67. 我们还在路上…
68. THANKS 探索 AI 应 边界 Explore the limits of AI applications

首页 - Wiki
Copyright © 2011-2025 iteam. Current version is 2.146.0. UTC+08:00, 2025-10-19 04:07
浙ICP备14020137号-1 $访客地图$