当前位置: 首页 > article >正文

【仓颉 + 鸿蒙 + AI Agent】CangjieMagic框架(15):NaiveExecutor

CangjieMagic框架:使用华为仓颉编程语言编写,专门用于开发AI Agent,支持鸿蒙、Windows、macOS、Linux等系统。

这篇文章剖析一下 CangjieMagic 框架中的 NaiveExecutor。

1 NaiveExecutor是什么?

提问
使用
发送请求
返回回答
返回结果
回答
用户
Agent
NaiveExecutor
大语言模型

NaiveExecutor是一种简单直接的执行器,它的工作方式就像我们直接问一个人问题,然后等待回答一样简单。没有复杂的思考过程,没有繁琐的工具调用,就是"问一嘴,答一句"。

举个例子:当你问朋友"今天天气怎么样?“,朋友直接看看窗外说"今天天气晴朗”。这就是NaiveExecutor的工作方式!

2 NaiveExecutor的提示词模板

先来看看这个执行器使用的提示词模板:

private let NAIVE_PROMPT = """
{systemPrompt}{retrieval}{memory}{dialog}
"""

这个模板就像我们做菜的配方,分为四个部分:

  1. systemPrompt:相当于告诉厨师"你要做一道什么菜"
  2. retrieval:相当于提供菜谱和参考资料
  3. memory:相当于厨师的经验和记忆
  4. dialog:相当于之前的交流和反馈

举个生活例子:当你去理发店时,你会告诉理发师你想要什么发型(systemPrompt),可能会出示一张照片作参考(retrieval),理发师会记得你上次的喜好(memory),然后你们还会讨论细节(dialog)。

3 构建完整提示词的过程

发送给
系统提示
完整提示词
检索内容
记忆内容
对话历史
大语言模型

让我们看看getFullSystemPrompt成员函数是如何工作的:

private func getFullSystemPrompt(task: AgentTask): String {// The system prompt of a naive agent may be emptylet sysPrompt = if (task.agent.systemPrompt != "") {task.agent.systemPrompt} else {"Answer user question"}return NAIVE_PROMPT.format(("retrieval", ReactPromptUtils.buildAgentRetrievalPrompt(task)),("systemPrompt", sysPrompt),("memory", ReactPromptUtils.buildAgentMemoryPrompt(task)),("dialog", ReactPromptUtils.buildAgentDialogPrompt(task)))
}

这段代码做了什么呢?想象你在教一个孩子回答问题:

  1. 首先,你会告诉孩子他的角色:“你现在是一名小老师”(系统提示)
  2. 如果没有特别说明角色,就简单地说:“请回答问题”
  3. 然后你可能会给孩子一本参考书(检索内容)
  4. 提醒孩子之前学过的知识(记忆内容)
  5. 告诉孩子提问者之前问了什么(对话历史)

这样,孩子就有了完整的上下文,可以开始回答问题了!

4 同步执行过程详解

用户 NaiveExecutor Agent 大语言模型 提出问题 创建任务对象 构建完整提示词 发送请求 返回回答 返回结果 用户 NaiveExecutor Agent 大语言模型

现在来看看run成员函数的实现:

override public func run(agent: Agent, request: AgentRequest): AgentResponse {let task = AgentTask(agent, request)let dialog = task.execInfo.dialogLogUtils.info("${agent.name} runs")dialog.addMessage([ChatMessage.system(getFullSystemPrompt(task)),ChatMessage.user(request.question)])LogUtils.info(agent.name, dialog)let assistantMsg = ModelUtils.makeChat(agent.model, dialog).getOrThrow()dialog.addMessage(assistantMsg)LogUtils.info(agent.name, assistantMsg)return AgentResponse(assistantMsg.content, execInfo: task.execInfo)
}

我们来用一个日常场景解释这个过程:

想象你在咖啡店点咖啡:

  1. 创建任务对象:服务员接到你的订单(AgentTask
  2. 获取对话对象:服务员拿出记录本(dialog
  3. 记录日志:服务员告诉同事"有新订单"(LogUtils.info
  4. 添加系统提示和用户问题:服务员记下你是谁、想要什么咖啡(dialog.addMessage
  5. 向模型发送请求:服务员把订单交给咖啡师(ModelUtils.makeChat
  6. 获取回答:咖啡师制作咖啡并告知结果(assistantMsg
  7. 记录回答:服务员记录咖啡师的反馈(dialog.addMessage(assistantMsg)
  8. 返回结果:服务员把咖啡送到你的桌子(return AgentResponse

这个过程非常直接:收到问题,发送给模型,获取回答,返回结果。没有复杂的中间步骤!

5 异步执行:流式返回

块1
块2
块3
块n
用户提问
NaiveExecutor
创建对话
异步发送请求
返回结果
用户界面

接下来是asyncRun成员函数,让我们看看它是如何工作的:

override public func asyncRun(agent: Agent, request: AgentRequest): AsyncAgentResponse {let task = AgentTask(agent, request)let dialog = task.execInfo.dialogLogUtils.info("${agent.name} async runs")dialog.addMessage([ChatMessage.system(getFullSystemPrompt(task)),ChatMessage.user(request.question)])LogUtils.info(agent.name, dialog)let asyncChatResp = agent.model.asyncCreate(ChatRequest(dialog, temperature: agent.temperature))if (request.verbose) {task.execInfo.verboseChannel.close()}return AsyncAgentResponse(asyncChatResp.contentIter, execInfo: task.execInfo)
}

这就像是看电视直播与录播的区别:

  • 同步执行(录播):节目录制完成后才能观看
  • 异步执行(直播):节目边制作边播出,观众可以实时看到

举个例子:你在看一场足球比赛直播,进球的瞬间就能看到,不用等到整场比赛结束。同样,使用异步执行,用户不用等待完整回答生成,可以看到AI一点一点生成的内容。

这对于长回答特别有用!想象你问AI写一篇作文,使用异步执行,你可以看到它一句一句地"写"出来,而不是盯着空白屏幕等待整篇作文。

6 NaiveExecutor与其他Executor的对比

执行器类型
NaiveExecutor
ReactExecutor
PlanReactExecutor
优点: 简单高效
优点: 低延迟
缺点: 不支持工具
优点: 支持工具调用
优点: 思考-行动循环
缺点: 复杂度高
优点: 分解复杂问题
优点: 多步骤规划
缺点: 执行时间长

不同的执行器就像不同类型的交通工具:

  • NaiveExecutor:像一辆自行车,简单、灵活,适合短途旅行
  • ReactExecutor:像一辆汽车,功能更强,可以走更远的路
  • PlanReactExecutor:像一次航空旅行,需要规划航线,但能解决复杂问题

6.1 NaiveExecutor适用场景:

  1. 问答系统:比如一个简单的FAQ机器人,用户问"你们的营业时间是几点到几点?",直接返回答案。
  2. 文档助手:结合RAG系统,回答关于特定文档的问题,如"公司政策中对请假有什么规定?"
  3. 聊天机器人:简单的闲聊对话,不需要执行复杂操作。
  4. 内容生成:如写诗、写故事等纯文本生成任务。

6.2 代码实例:文档问答助手

@agent[model: "deepseek:deepseek-chat",executor: "naive",  // 使用NaiveExecutorrag: {source: "./公司政策.md",mode: "static"}
]
class 政策顾问 {@prompt("你是公司的政策顾问""根据公司政策文档回答员工的问题")
}main() {let advisor = 政策顾问()let result = advisor.chat("年假有多少天?")println(result)
}

这个例子中,我们创建了一个使用NaiveExecutor的Agent,它能够回答关于公司政策的问题,不需要复杂的工具调用,简单直接!

7 NaiveExecutor的设计亮点

NaiveExecutor设计亮点
代码复用
日志完善
同步异步统一
错误处理
兼容RAG和记忆
利用ReactPromptUtils
避免重复代码
详细执行日志
方便调试排错
统一接口
灵活应用
使用getOrThrow
确保响应有效
支持知识检索
支持历史记忆

NaiveExecutor虽然简单,但设计非常精巧:

  1. 代码复用:像厨师虽然做简单菜式,但仍然使用专业刀具一样,NaiveExecutor复用了框架的通用组件。
  2. 日志完善:就像飞行员的黑匣子,记录所有执行过程,方便调试。
  3. 同步异步统一:可以想象成一家餐厅既提供堂食也提供外卖,满足不同需求。
  4. 错误处理:像有安全气囊的汽车,当出现问题时能够妥善处理。
  5. 兼容RAG和记忆:虽然是简单执行器,但保留了"查资料"和"记笔记"的能力。

8 总结

问题
NaiveExecutor
构建提示词
调用模型
返回结果
简单直接
支持RAG
支持记忆
同步异步

这篇文章剖析了CangjieMagic框架中的NaiveExecutor:

  1. 它是什么:一个简单直接的执行器,“问一嘴,答一句”
  2. 它怎么工作:构建提示词,发送给模型,获取回答
  3. 它的特点:简单高效,支持RAG和记忆,但不支持工具调用
  4. 适用场景:简单问答、文档咨询、内容生成等

NaiveExecutor就像我们生活中的"微波炉",可能不如专业厨具功能强大,但对于很多日常需求来说,它简单、高效、足够好用!

在你开发自己的AI应用时,如果不需要复杂的工具调用和推理,可以考虑使用NaiveExecutor,它会让你的开发过程更加简单,同时也能提供良好的用户体验。

相关文章:

【仓颉 + 鸿蒙 + AI Agent】CangjieMagic框架(15):NaiveExecutor

CangjieMagic框架:使用华为仓颉编程语言编写,专门用于开发AI Agent,支持鸿蒙、Windows、macOS、Linux等系统。 这篇文章剖析一下 CangjieMagic 框架中的 NaiveExecutor。 1 NaiveExecutor是什么? #mermaid-svg-u9WgSijieH1Pk0xU…...

Office文档图片批量提取工具

Office.Files.Images 是一款专注于从 Word、Excel、PPT 等 Office 文档中批量提取图片的轻量级工具,支持 .docx、.xlsx、.pptx 格式文件。该软件体积仅 ‌343KB‌,无需安装即可运行,通过拖拽操作实现快速解析与导出,尤其适合需批量…...

33-公交车司机管理系统

技术: 基于 B/S 架构 SpringBootMySQLvueelementui 环境: Idea mysql maven jdk1.8 node 用户端功能 1.首页:展示车辆信息及车辆位置和线路信息 2.模块:车辆信息及车辆位置和线路信息 3.公告、论坛 4.在线留言 5.个人中心:修改个人信息 司机端功能…...

PyCharm 初级教程:从安装到第一个 Python 项目

作为 Python 程序员,无论是刚入门还是工作多年,PyCharm 都是一个绕不开的开发工具。它是 JetBrains 出品的一款强大的 Python IDE,有自动补全、调试、虚拟环境支持、代码检查等等功能,体验比命令行 记事本舒服一百倍。 今天这篇…...

文件上传漏洞3

1. 例题:文件上传限制 1)上传漏洞靶场介绍 项目名称: upload-labs开发语言: 使用PHP语言编写功能定位: 专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场关卡数量: 目前共21关,每关包含不同上传方式注意事项: 每关没有固定通关方法,不要自限…...

QML FontDialog:使用FontDialog实现字体选择功能

目录 引言相关阅读FontDialog基本介绍字体属性 实例演示项目结构代码实现Main.qmlmain.cpp 代码解析运行效果 总结 引言 在桌面应用程序开发中,字体选择是一个常见的需求。Qt Quick提供了FontDialog组件来实现这一功能。本文将介绍如何在Qt Quick应用程序中使用Fon…...

力扣刷题Day 27:环形链表(141)

1.题目描述 2.思路 创建一个结点集合,遍历链表,如果遇到已经加进集合的结点就说明链表有环。 3.代码(Python3) class Solution:def hasCycle(self, head: Optional[ListNode]) -> bool:node headnode_set set()while node…...

1.1软考系统架构设计师:系统架构的定义与作用 - 超简记忆要点、知识体系全解、考点深度解析、真题训练附答案及解析

超简记忆要点 定义:结构决策 | 抽象概念 | 多视图模型(逻辑/物理/动态)作用:解耦复杂需求 | 集成扩展 | 指导开发(蓝图)要素:构件(原子/复合) | 连接件(API/…...

研发效率破局之道阅读总结(3)工程优化

研发效率破局之道阅读总结(3)工程优化 Author: Once Day Date: 2025年4月22日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 程序的艺术_Once-Day…...

metasploit(2)生成dll木马

声明!本文章所有的工具分享仅仅只是供大家学习交流为主,切勿用于非法用途,如有任何触犯法律的行为,均与本人及团队无关!!! 一、dll文件基本概念 DLL 是一种包含可由多个程序同时使用的代码和数…...

数据结构--并查集-高效处理连通性问题

目录 一、理论基础 (1)并查集的功能及实现原理 (2)代码模版 (3)模拟过程 (4)应用 二、基础题练习 (1)寻找存在的路径(模版题) …...

PLOG安装

Plog可以通过以下命令安装 cd ~ && git clone https://github.com/SergiusTheBest/plog.gitcd plog && mkdir buildcd build && cmake ..make && sudo make installcd ~ && sudo rm -rf ./plog若无法科学上网,可使用git cl…...

LeetCode 热题 100_分割等和子集(89_416_中等_C++)(动态规划)

LeetCode 热题 100_分割等和子集(89_416) 题目描述:输入输出样例:题解:解题思路:思路一(动态规划): 代码实现代码实现(思路一(动态规划&#xff0…...

WPS Office安卓版云文档同步速度与PDF转换体验测评

WPS Office安卓版是很多人常用的移动办公软件。它支持在线编辑、文档同步、格式转换等功能,适合手机和平板用户随时处理文档。我们用它配合谷歌浏览器打开网页文档时,也可以将内容快速保存到云端或转换成PDF格式使用。 先说云文档同步。在打开WPS Office…...

Eureka、LoadBalance和Nacos

Eureka、LoadBalance和Nacos 一.Eureka引入1.注册中心2.CAP理论3.常见的注册中心 二.Eureka介绍1.搭建Eureka Server 注册中心2.搭建服务注册3.服务发现 三.负载均衡LoadBalance1.问题引入2.服务端负载均衡3.客户端负载均衡4.Spring Cloud LoadBalancer1).快速上手2)负载均衡策…...

【Linux网络】构建基于UDP的简单聊天室系统

📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...

【每天一个知识点】大模型的幻觉问题

“大模型的幻觉问题”是指大语言模型(如GPT系列、BERT衍生模型等)在生成内容时,产生不符合事实或逻辑的虚假信息,即所谓的“幻觉”(hallucination)。这在诸如问答、摘要、翻译、代码生成等任务中尤其常见。…...

机器学习06-RNN

RNN(循环神经网络)学习笔记 一、RNN 概述 循环神经网络(Recurrent Neural Network,RNN)是一类以序列数据为输入,在序列的演进方向进行递归且所有节点(循环单元)按链式连接的递归神…...

[大模型]什么是function calling?

什么是function calling? 大模型的 ​​Function Calling​​(函数调用)是一种让大语言模型(如 GPT、Claude 等)与外部工具、API 或自定义函数交互的机制。 它的核心目的是让模型能够根据用户的需求,​​…...

C语言高频面试题——嵌入式系统中中断服务程序

在嵌入式系统中,中断服务程序(ISR)的设计需遵循严格的规则以确保系统稳定性和实时性。以下是对这段代码的分析及改进建议: 代码分析 __interrupt double compute_area (double radius) { double area PI * radius * radius; pri…...

Java高频面试之并发编程-05

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:线程有哪些调度方法? 在Java中,线程的调用方法主要包括以下几种方式,每种方式适用于…...

野外价值观:在真实世界的语言模型互动中发现并分析价值观

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

【Linux】47.高级IO(1)

文章目录 1. 高级IO1.1 五种IO模型1.2 高级IO重要概念1.2.1 同步通信 vs 异步通信1.2.2 阻塞 vs 非阻塞 1.3非阻塞IO1.3.1 fcntl1.3.2 实现函数SetNoBlock1.3.3 轮询方式读取标准输入1.3.4 I/O多路转接之select1.3.4.1 初识select:1.3.4.2 select函数原型1.3.4.3 理…...

notepad++技巧:查找和替换:扩展 or 正则表达式

notepad 有很多优点:多标签,代码高亮,我最喜欢的是查找和替换。 除了可以一次性查找所有打开文件,还可以使用 扩展 or 正则表达式。 例如: 去掉空行:正则表达式: ^\s*$\r\n ^ 表示行首。\s*…...

【图像标注技巧】目标检测图像标注技巧

介绍一些图像标注技巧。之前引用过别人的文章 yolo目标检测 技巧 trick 提升模型性能,deep research检测调研报告也可以进行参考。 拉框类的标注,如果你不确定哪种方法好,你可以把所标注区域的都剪切出来,然后站在屏幕一米之外眯…...

MuJoCo中的机器人状态获取

UR5e机器人xml文件模型 <mujoco model"ur5e"><compiler angle"radian" meshdir"assets" autolimits"true"/><option integrator"implicitfast"/><default><default class"ur5e">&…...

pnpm解决幽灵依赖问题

文章目录 前言1. npm/yarn 现在还有幽灵依赖问题吗&#xff1f;2. pnpm 解决了幽灵依赖问题吗&#xff1f;3. pnpm 是如何解决的&#xff1f;举例说明 1. pnpm 的 node_modules 结构原理结构示意 2. 实际演示幽灵依赖的杜绝步骤1&#xff1a;初始化项目并安装依赖步骤2&#xf…...

测试第四课---------性能测试工具

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…...

frp远程穿透配置

文章目录 准备工作服务端配置(toml)客户端配置(toml)访问内网服务使用ini文件配置 frp是一个高性能的反向代理应用&#xff0c;用于将位于内网的服务通过代理暴露到公网。以下是其基本使用步骤&#xff1a; 准备工作 拥有一台具有公网IP的服务器&#xff0c;作为frp的服务端。…...

【C++】新手入门指南(下)

文章目录 前言 一、引用 1.引用的概念和定义 2.引用的特性 3.引用的使用 4.const引用 5.指针和引用的关系 二、内联函数 三、nullptr 总结 前言 这篇续上篇的内容新手入门指南&#xff08;上&#xff09;&#xff0c;继续带大家学习新知识。如果你感兴趣欢迎订购本专栏。 一、…...