组队
heart-heart-heart

Heart Heart Heart

Do you think I'll ever be REAL? - Neuro-sama

LLMAgent多模态上下文工程Harness 工程Observability

1. Prelude

今天的大语言模型已经很擅长聊天。给模型一段角色设定和一些历史消息,我们很容易得到一个能够自然交流、模仿语气,甚至表现出特定性格的聊天机器人。

但一个真正长期存在的“角色”,不应该只存在于一次模型调用里。

它应该记得过去发生过什么,保持相对稳定的人格,并让过去的经历影响未来的行为。它也不应该只会生成文字:当它答应提醒用户、查询信息或执行任务时,背后应该有真实的系统行为。

随着能力增加,另一个问题也会出现:当 Agent 做出一个决定时,我们能否知道它当时看到了什么、记起了什么、调用了什么工具,以及状态如何发生变化?

本题希望你围绕这些问题,设计并实现一个具有持续状态、人格、记忆和行动能力的智能角色 Agent。

你不需要完成一个完整产品,也不需要把所有模块做到 Production Ready。请根据时间选择最值得验证的设计,并完成足以证明核心思路可行的实现。

2. 基本假设

技术选型没有限制。

你可以使用云端或本地模型,也可以自由选择编程语言、Agent Framework、数据库、游戏引擎和第三方服务。

与题目重点关系不大的模块,可以直接使用成熟方案,也可以 Mock。语音识别、语音合成、Live2D、3D Avatar、搜索服务等能力都不要求自行实现。

评价重点不是“从零实现了多少组件”,而是各个组件是否形成了合理的系统。

3. Lv1:成为一个持续存在的角色

Lv1 关注三个基本问题:对话连续性、人格和情绪状态。

Agent 应该能够进行正常的多轮交流。过去的对话需要以某种方式影响之后的回答。随着历史不断增长,你需要考虑上下文如何被保留、压缩、筛选或重新组织,但具体方法不限。

角色也应该具有相对稳定的身份和行为方式。这里的“稳定”并不意味着角色永远不能改变。关系、经历和长期互动都可能让角色发生变化。我们希望看到的是一种可以解释的连续性,而不是每次调用都重新生成一个人格。

除此之外,Agent 还应该拥有某种可观察的情绪或内部状态。它不应该只依赖一句“请表现得开心一点”的 Prompt,而应该存在能够被更新、读取,并实际影响之后回复或行为的状态。

Lv1 的核心目标很简单:证明这个角色不是一个完全无状态的文本生成器。

4. Lv2:拥有过去,也能够行动

Lv2 是本题的主体。

如果 Lv1 解决的是“这个角色是谁”,那么 Lv2 需要进一步解决两个问题:“它经历过什么?”以及“它能够做什么?”

4.1 Memory

大语言模型本身并不会天然拥有跨会话的长期记忆。因此,你需要设计一个独立于当前上下文的记忆系统。

这里的重点不是简单保存聊天记录,而是思考什么应该成为记忆,以及什么时候应该重新想起它

长期事实、用户偏好、过去的事件、关系变化和 Agent 自己的经历,可能具有不同的性质。不同记忆也可能过期、冲突、被修正,或者随着新信息而发生变化。

你不需要建立复杂的分类体系,但应该意识到:Memory 是一个信息生命周期系统,而不仅仅是一个 Vector Database。

除了“记住”,还需要考虑“忘记”和“更新”。当新信息与旧信息矛盾时,系统应该有某种处理方式;当用户明确要求忘记某件事情时,也应该能够产生实际效果。

同样重要的是回忆。随着记忆越来越多,Agent 不可能在每次交互中读取全部历史。系统需要根据当前上下文选择值得重新进入思考的记忆。

具体可以使用关键词、Embedding、数据库查询、图结构、模型判断,或者其他任何方式。

我们真正关注的是:角色的过去是否能够以合理的方式影响未来。

4.2 Action

Agent 不应该永远停留在“生成一段文字”。

它至少需要具备一种对话之外的行动能力,例如调用外部服务、查询信息、运行程序、操作文件、创建任务,或者与其他系统交互。

具体工具并不重要。重要的是 Agent 能够判断什么时候仅仅需要回答,什么时候应该采取行动,并根据行动结果继续完成任务。

系统还应该能够区分“说自己做了某件事”和“真正执行了某个行为”。

换句话说:语言输出和系统行为应该是两个可以区分的概念。

你可以采用 Tool Calling、Action Model、状态机,或者任何你认为合适的设计。

5. 可观测性与审计

当 Agent 开始拥有长期记忆和外部行动以后,调试会迅速变得困难。

如果它引用了一条错误的记忆,调用了不合适的工具,或者出现了异常行为,仅仅保存聊天记录通常不足以定位问题。

因此,系统应该提供某种行为记录机制。

你应该能够在一次交互之后,大致回答这些问题:

  • Agent 使用了哪些上下文和记忆;
  • 内部状态是否发生变化;
  • 是否调用了工具,以及输入和结果是什么;
  • 最终产生了什么语言或行为。

具体的数据模型没有限制。日志、事件流、SQLite、JSONL、Tracing 系统都可以。

重点不是做一个完整的 Observability Platform,而是让系统能够回答:刚才究竟发生了什么?

如果还能进一步解释某个决策为什么发生,会更有价值。

Lv2 最终应该形成一个完整的数据流:历史信息能够形成记忆,记忆能够在未来被重新使用,Agent 能够执行真实行动,而这些过程又能够被观察和分析。

这些能力不应该只是几个互不相关的 Demo。

6. Lv3:如果 Agent 有了身体

Lv3 是可选方向。

你可以使用 Live2D、3D Avatar,或者其他能够持续展示角色形象的形式。

重点不在模型精度、动画数量或者画面效果,而在于:Agent 的内部状态能否通过身体表现出来。

例如,情绪、思考、说话、等待、执行工具等状态,都可以影响角色的表情或动作。

这些表现不需要实时生成。预先制作少量动画或表情完全可以接受。

我们关注的是 Avatar 是否真正成为 Agent 状态的一种输出,而不是一个独立播放动画的前端组件。

7. Lv4:实时交流

Lv4 同样是可选方向。

你可以尝试让 Agent 通过语音、Avatar 或其他媒介进行更加实时的互动。

最基本的语音能力包括语音输入和语音输出。可以直接使用现有的语音识别和语音合成服务。

如果系统已经拥有情绪状态,可以进一步思考这些状态是否应该影响声音。例如语速、停顿、音高、风格或者其他语音特征。

Lv4 还需要实现至少一种实时互动形式。

这里我们只保留一个明确要求:从用户提交输入,到 Agent 出现第一个用户可感知的反馈,不应超过 10 秒。

这里的“反馈”不一定是完整回答。角色进入思考状态、开始播放语音、显示任务进度,都可以算作反馈。

我们鼓励 Streaming 和渐进式响应,因为真实交互系统中的延迟,不仅取决于任务什么时候完成,也取决于用户什么时候能够意识到系统已经开始处理。

8. 开放问题

本题没有唯一正确的架构。

在设计过程中,你可能需要自己回答很多问题。

人格应该主要存在于 Prompt 中,还是应该成为显式状态?Agent 是否应该拥有关于自己的记忆?用户与 Agent 的关系是否需要建模?

事实、推断和经历是否应该使用不同的记忆策略?错误记忆如何修正?旧记忆什么时候失效?

工具产生的结果是否值得进入长期记忆?具有副作用的操作是否应该要求确认?行动失败是否应该影响角色状态?

如果工具需要长时间执行,角色应该如何表现?如果用户打断 Agent,系统应该如何处理?

这些问题没有标准答案。

我们更关心你如何定义问题、做出取舍,并解释自己的设计。


Appendix A. Glossary

本表面向没有 Agent、人工智能或相关工程经验的读者。

解释有意进行了简化。如果某个概念与你的方案有关,可以通过对应的 Learn more 继续了解。

AI 与 Agent

词汇简短解释Learn more
Agent能根据输入和自身状态,决定“说什么”或“做什么”的程序。Intelligent agent - Wikipedia · Building effective agents - Anthropic
LLM / Large Language Model / 大语言模型根据已有文字预测后续文字的 AI 模型,例如 ChatGPT 背后的模型。Large language model - Wikipedia · Introduction to LLMs - Google
模型调用 / Model Call把输入发送给 AI 模型,并取得一次输出。Introduction to LLMs - Google
Prompt提供给模型的文字指令和背景信息。Prompt engineering guide - OpenAI
上下文 / Context模型在当前一次生成过程中能够看到的信息。Context windows - Anthropic
Conversation / 对话用户与 Agent 之间连续进行的一组消息。Chatbot - Wikipedia
Session / 会话一次相对独立的使用过程。关闭或重新开始后通常会产生新的 Session。Session - MDN Glossary
Persona / 人设对角色身份、性格、说话方式和行为边界的描述。Persona - Wikipedia
State / 状态程序当前保存的信息,例如“Agent 现在很开心”。State - Wikipedia
状态机 / State Machine用“当前状态 + 发生的事件”决定下一个状态的程序结构。Finite-state machine - Wikipedia
Agent Framework帮助开发 Agent 的现成软件框架。通常提供模型、工具、状态等基础能力。Software framework - Wikipedia · LangGraph overview

API、工具与行为

词汇简短解释Learn more
API一个程序提供给另一个程序使用的接口。Introduction to APIs - MDN
云端 API通过网络调用运行在别人服务器上的服务。Web API - Wikipedia
本地模型 / Local Model直接运行在自己电脑或服务器上的 AI 模型。Transformers documentation - Hugging Face
Tool / 工具Agent 可以调用的外部功能,例如查天气、执行程序或创建提醒。Tool use - Anthropic
Tool Calling / 工具调用让模型决定使用哪个工具,并生成调用参数。Function calling - OpenAI
Action / 行为Agent 真正执行的动作,而不只是生成文字。ReAct paper
Mock用简单的假实现代替暂时不想真正开发的组件。Mock object - Wikipedia
Mock Service用假的服务模拟真实 API,例如假的外卖下单接口。Mock object - Wikipedia
Side Effect / 副作用一个操作除了返回结果,还真正改变了外部状态。例如删除文件。Side effect - Wikipedia

记忆与数据

词汇简短解释Learn more
Memory / Agent MemoryAgent 保存过去信息,并在未来重新使用这些信息的机制。Generative Agents paper
长期记忆 / Long-term Memory在一次 Session 结束后仍然保留的信息。Memory in LangGraph
Memory Taxonomy把不同种类的记忆进行分类的方法。Taxonomy 就是“分类体系”。Taxonomy - Wikipedia
Embedding / 嵌入把文字转换成一组数字,使意思相近的文字在数学上也比较接近。Embeddings - Google Machine Learning
Vector / 向量一串数字。Embedding 的结果通常就是一个向量。Vector - Wikipedia
向量检索 / Vector Search根据向量之间的相似程度寻找内容。常用于搜索“意思相近”的记忆。What is vector search? - Elastic
Vector Database / 向量数据库专门保存和搜索大量向量的数据库。Vector database - Wikipedia
知识图谱 / Knowledge Graph用“实体”和它们之间的“关系”来组织知识。Knowledge graph - Wikipedia
数据库 / Database用于长期保存和查询数据的软件。Database - MDN Glossary
SQLite很轻量的数据库。整个数据库通常可以放在一个文件里。About SQLite
JSON一种常见的结构化文本数据格式。JSON - MDN
JSONL / JSON Lines每一行都是一条独立 JSON 数据的文件格式。很适合保存日志。JSON Lines

调试、日志与审计

词汇简短解释Learn more
Audit / 审计记录 Agent 做过什么,方便之后检查和追踪。Audit trail - Wikipedia
Audit Trail / 审计轨迹按时间留下的一系列行为记录。Audit trail - Wikipedia
Log / 日志程序运行时产生的记录。Logging - Wikipedia
stdout程序默认输出文字的地方。终端里看到的输出通常来自这里。Standard streams - Wikipedia
Trace / 链路追踪把一次请求经过的多个步骤串起来观察。Traces - OpenTelemetry
Observability / 可观测性通过日志、指标和 Trace 理解系统内部发生了什么。Observability primer - OpenTelemetry
Observability Platform集中查看日志、指标和 Trace 的工具或系统。Observability primer - OpenTelemetry
Replay / 重放使用过去记录的数据重新模拟一次执行过程。Event Sourcing - Martin Fowler

工程与项目范围

词汇简短解释Learn more
Demo用来证明某个想法确实能运行的简单演示。Software prototyping - Wikipedia
最小实现只实现验证核心想法所需要的部分。Minimum viable product - Wikipedia
闭环系统的输出会产生结果,而结果又会继续影响系统之后的行为。Feedback - Wikipedia
Production Ready已经足够稳定、可靠,可以长期给真实用户使用。Google SRE Book - Production Environment
第三方服务不是自己开发,而是由其他公司或项目提供的功能。Web API - Wikipedia

虚拟形象与 3D

词汇简短解释Learn more
Avatar / 虚拟形象在屏幕或虚拟世界中代表角色的视觉形象。Avatar - Wikipedia
Live2D用二维图片制作可变形、可动画角色的一套技术和工具。Live2D Cubism Manual
3D Avatar使用三维模型表示的虚拟角色。VRM documentation
Game Engine / 游戏引擎帮助开发实时 2D、3D 程序的软件框架。Game engine - Wikipedia
Unity常见的实时 2D / 3D 游戏引擎。Unity Learn
Unreal EngineEpic 开发的实时 3D 游戏引擎。Unreal Engine for New Users
Godot开源的 2D / 3D 游戏引擎。Introduction to Godot
WebGL浏览器中的 3D 图形接口,可以直接在网页里画 3D 内容。WebGL - MDN
Expression / 表情虚拟角色脸部状态的变化,例如微笑、皱眉。Live2D Expressions
Motion / 动作虚拟角色的一段动画,例如挥手、走路、待机。Live2D Motion
Idle / 待机没有其他动作时持续播放的基础动画状态。Animation State Machines - Unity
Avatar Controller把 Agent 的状态转换成角色表情和动作的程序组件。Animation State Machines - Unity

语音与实时交互

词汇简短解释Learn more
Speech Recognition / 语音识别把人说的话转换成文字。Speech recognition - Wikipedia
ASRAutomatic Speech Recognition,语音识别的常见缩写。Speech recognition - Wikipedia
Speech Synthesis / 语音合成让计算机根据文字生成人声。Speech synthesis - Wikipedia
TTSText-to-Speech,“文字转语音”的常见缩写。Web Speech API - MDN
Voice Parameters控制合成声音的参数,例如语速、音高和音量。SpeechSynthesisUtterance - MDN
Style语音模型提供的说话风格,例如开心、悲伤或客服式语气。Speech synthesis - Wikipedia
Streaming / 流式处理不等完整结果产生后再返回,而是边产生边发送。Streams API - MDN
Latency / 延迟从用户发出请求,到系统开始产生结果所花的时间。Latency - MDN Glossary
实时 / Real-time系统需要在较短且可预期的时间内对输入作出响应。Real-time computing - Wikipedia

如果只想先看最重要的词

第一次阅读题目时,不需要先学完上面的全部内容。

建议先理解下面这些词:

Agent → LLM → Prompt → Context → State → Memory → Tool → Action → API → Audit → Streaming

理解这几个概念以后,已经足够开始思考 Lv1 和 Lv2 的方案。Live2D、WebGL、ASR、TTS 等词汇,可以在决定挑战 Lv3 或 Lv4 后再学习。

出题人:可可