从零到一:如何自建 Agent?阿里工程师的实践分享

提示词工程的关键在于理解模型的工作原理,并根据具体任务进行精细调整。除了角色设定和 XML 结构,以下是一些可以尝试的提示词优化策略:

1. 明确指令:确保指令清晰、简洁、无歧义,避免模型产生误解。
2. 限定范围:明确模型可以使用的知识和资源,防止模型产生幻觉。
3. 引导输出:通过示例或格式要求,引导模型产生符合预期的输出。
4. 利用上下文:将任务相关的上下文信息融入提示词,帮助模型更好地理解任务。
5. 迭代优化:不断测试和调整提示词,根据模型生成的反馈进行改进。

提示词优化啊,简直就是炼丹!除了文中提到的,我觉得还可以考虑以下几点:
1. Prompt 模板:可以维护一套 Prompt 模板,根据不同任务类型选择合适的模板,减少重复工作。
2. 负面提示:明确告诉模型不应该做什么,可以有效避免一些错误。
3. 思维链(Chain of Thought):引导模型逐步思考,给出reasoning过程,提高结果的准确性。
4. Prompt 压缩:对于长 Prompt,可以使用一些技术进行压缩,比如关键词提取、信息摘要等。

不如试试分层压缩?对不重要的信息进行高度压缩,对关键信息进行低度压缩,甚至不压缩。这样可以保证关键信息不丢失,同时又能有效控制Token消耗。当然,需要仔细评估哪些信息是关键的。

我从一个更“抖机灵”的角度来回答一下:

其实, anything 都可以用 XML 结构化!只要你愿意,甚至可以把“今天中午吃什么”这个问题也用 XML 来描述,包括餐厅名称、菜品种类、价格范围、口味偏好等等。

这样做的好处是……

可以让你看起来更 professional!:joy:

开个玩笑,不过也说明了 XML 的通用性和灵活性。关键在于,我们要根据实际需求来选择合适的信息类型和结构,避免过度设计和滥用 XML。

非常有意思的提问。我补充一些:

* 错误日志和排错方案:通过分析历史错误日志和相应的排错方案,Agent可以学习如何诊断和修复代码中的问题,提高代码的健壮性。
* 安全漏洞和防御措施:集成安全知识库可以帮助Agent识别潜在的安全漏洞,并生成更安全的代码。

知识优先级上,我觉得分层考虑比较好:

1. 核心层:与Agent核心功能直接相关的知识,如编程语言规范、API文档等,优先级最高。
2. 扩展层:用于提升Agent性能和用户体验的知识,如用户行为数据、最佳实践等,优先级次之。
3. 辅助层:用于支持Agent解决特定问题的知识,如错误日志、安全漏洞等,优先级最低。

总的来说,知识库的建设是一个持续迭代的过程,需要不断根据Agent的使用情况和用户反馈进行调整和完善。

FaaS 的优点很明显,就是免运维,聚焦业务逻辑。缺点也很突出,冷启动问题,不适合对延时非常敏感的场景。如果不用 FaaS,可以考虑传统的云服务器 ECS,自己管理服务器,灵活度高,但是需要付出运维成本。或者用容器服务,比如 Kubernetes,可以兼顾灵活性和自动化运维。

抛砖引玉一个,之前看到有人用时间衰减的机制来管理上下文,越久远的信息权重越低,可以逐渐被丢弃。感觉挺有意思的,不过具体效果还得看场景。另外,也可以考虑让用户自己选择保留哪些历史对话,增加一些控制权。

我理解 XML 的优势在于其严格的标签定义,这可以帮助模型更准确地解析指令,尤其是在处理复杂的嵌套逻辑时。除了文章中提到的应用,我认为 XML 还可以用于知识图谱的构建,利用标签来定义实体和关系,便于模型进行推理和学习。不过,JSON 在 Web 开发中更常见,可能需要权衡一下。

格式和方法当然重要,但我觉得最核心的还是清晰的表达。无论你用什么格式,最终都要确保模型能够准确理解你的意图。

我见过一些人写的提示词,恨不得把所有信息都塞进去,结果模型反而懵了。记住,简洁即是美。用最少的文字,表达最清晰的意图,才是最好的提示词。

还有一点,多做实验。不同的模型对提示词的敏感度不同,同样的提示词,在不同的模型上效果可能千差万别。所以,一定要多做实验,找到最适合你的模型的提示词策略。

XML 确实是个好东西,能让模型更好地理解提示词的结构和含义。不过,提升大模型提示词效果的方法可不止 XML 一种,我来分享几个我常用的:

* JSON: 和 XML 类似,JSON 也是一种结构化的数据格式,清晰明了,方便模型解析。特别是处理复杂的数据结构时,JSON 更加简洁易用。
* Markdown: 如果提示词包含大量的文本内容,可以使用 Markdown 格式,让文本更易读,模型也能更好地理解。
* 思维链(Chain of Thought): 引导模型逐步思考,先进行推理,再给出答案。这种方法可以提高模型解决复杂问题的能力。
* Prompt Engineering: 这门学问可大了,包括各种提示词撰写技巧,比如使用明确的指令、提供具体的示例、避免模糊的描述等等。掌握这些技巧,能让你的提示词事半功倍。

抛开成本谈技术都是耍流氓。除了生码能力,我更关注模型的token限制和inference速度。如果模型擅长生成复杂的代码,但是tokenize效率低,或者上下文窗口太小,跑一次inference要等半天,那还不如选一个稍微简单点但是速度快的模型。毕竟,用户体验才是王道啊!

其实很多BPMN流程引擎也能实现类似Agent的调度,主要看重的是可视化和可编排能力,缺点是相对来说比较重,不够轻量化

可以用状态设计模式自己实现。简单场景下自己写更灵活,但复杂场景还是 LangGraph 这种框架更省心,毕竟人家已经封装了很多最佳实践。

感觉还可以用一些通用的压缩算法,比如gzip或者br,在传输之前将数据进行压缩,然后在Agent端进行解压,也可以减少token的使用。但是需要小心压缩和解压带来的性能开销。

用 JSON Schema 约束输出,减少冗余字段。极端情况下,可以考虑自定义一套更紧凑的编码方式,牺牲可读性换取 Token 节省。

可以考虑使用 WebSocket over API Gateway。API Gateway 负责管理 WebSocket 连接,FaaS 函数处理消息。不过需要确保 API Gateway 支持 WebSocket 协议,而且可能会引入额外的延迟。

除了 LangGraph,还可以考虑使用 Airflow、Prefect 等工作流引擎,或者自己手撸一个状态机。工作流引擎更通用,但可能比较重,状态机更轻量但需要自己实现状态管理和调度逻辑。

可以试试 Protocol Buffers 或者 MessagePack 这种二进制序列化格式,压缩率比文本格式的 XML 和 JSON 高很多。不过需要考虑前后端的序列化和反序列化成本。

用 Serverless 的消息队列服务(如 Kafka、RabbitMQ)做中转。Agent 将消息放入队列,前端通过订阅队列获取消息。这种方式解耦性更好,但实现起来更复杂。

可以试试Serverless版的Socket.IO, 理论上也是可以支持的,把状态放在redis里,然后socket.io做消息推送,应该也能实现类似的效果