我搭了一个智能体,帮你”魂穿”体验另一个人的一天!

0 评论 427 浏览 41 收藏 21 分钟

如何真正理解他人的生活?这款名为'魂穿:体验TA的一天'的智能体给出了全新答案。通过AI模拟不同角色的完整一天,在5-8个关键决策点做出选择,用户能沉浸式体验外卖员、历史人物甚至3岁孩童的日常生活。本文将深度拆解这个基于工作流架构的LLM应用,揭秘其人物解析、决策循环与复盘总结三大核心模块的技术实现。

你有没有想过,真正理解另一个人是什么感受?

不是站在外面观察,而是真正”成为”他们——感受他们的疲惫、他们的纠结、他们的喜悦,体验他们一天中遇到的每一个关键决策。

这就是我最近搭建的智能体:”魂穿:体验TA的一天”。

这篇文章分享一下这个智能体的搭建过程,帮助大家了解一下工作流架构和LLM应用开发的玩法。

为什么做这个?

共情是人类最珍贵的能力之一,但也是最难培养的。

  • 理解缺失:我们很容易站在自己的立场评判他人,却很难真正理解他们的处境和选择。
  • 体验成本高:想要理解一个外卖员、一个3岁小孩、一个80岁老人的生活,现实中需要巨大的时间和机会成本。
  • 沉浸感难营造:即使看过再多的纪录片、文章,也很难真正”代入”另一个人的视角。

所以我做了这个智能体:通过AI模拟另一个人完整的一天,让你在5-8个关键决策点做出选择,体验每个选择带来的连锁反应,最后获得一天的总结和决策复盘。

它不想取代真实的体验,而是把体验的门槛降低——让你能够低成本、低风险地”穿越”到不同身份、不同时代的人身上。

智能体的体验链接在文章最后。

定位&整体交互

产品定位

目标用户:想要理解不同群体的人、对历史和人物感兴趣的用户、教育工作者、想要提升共情能力的人

核心价值:通过AI模拟生成沉浸式的身份体验,让用户在决策中理解另一个人的处境和选择逻辑

能力边界

  • 支持现代角色(外卖员、清洁工、3岁小孩、80岁老人等)
  • 支持历史人物(乾隆皇帝、诸葛亮、李白等)
  • 支持复合身份(大城市的5岁男童、旅居的自由职业者等)
  • 每次体验包含5-8个关键决策点,完整的一天流程

整体交互设计

交互流程非常简单直观:

三个工作流协同

整个智能体基于工作流架构搭建,分为三个核心模块:

工作流1:人物解析与场景构建(主流程)

输入:用户想要体验的角色(如”体验外卖员的一天”)

处理流程

1. 人物解析节点(LLM):识别人物类型和关键特征

  • 判断是历史人物/岗位角色/年龄层角色/复合身份
  • 提取年龄、职业、时代背景、生活状况等关键信息

2. 角色档案生成节点(LLM):生成详细的角色档案

  • 设定时间背景
  • 生成角色的基本信息、性格特点、近期状况
  • 输出符合角色特征的描述

3. 一天规划节点(LLM):规划一天的事件序列

  • 确定起床/睡觉时间
  • 生成5-8个符合角色身份的关键事件
  • 每个事件包含决策主题和场景设定

流程非常简单,一路走到底型:

工作流2:决策循环(子流程,核心体验模块)

输入:单个事件对象(包含时间、地点、事件描述、决策主题等)

这是整个体验的核心,通过循环节点调用这个子工作流。

子工作流的处理逻辑:

这个工作流会被循环调用5-8次,每次处理一个事件。

关键技术点

1. 状态管理:状态完全在循环体内管理

  • 第一次循环时,初始化状态(体力=100,精力=100)
  • 每次循环结束后,状态在状态更新节点中更新
  • 更新后的状态通过输出变量传递给下一个循环
  • 循环结束后,最终状态传递给总结节点

2. 场景生成的沉浸感

  • 使用第一人称描述(”我蹲在…””我跨上电动车…”)
  • 场景描述包含时间、地点、环境细节
  • 内心思考部分使用” 我在想”来增强代入感

3. 决策选项的设计

  • 每个决策点提供4个选项
  • 选项要符合角色身份和处境
  • 选项之间有明显的利弊权衡,不存在”完美答案”
  • 选项直接嵌入在user_message中,用序号(1. 2. 3. 4.)标记

4. 结果描述的自然过渡

  • 使用”—“分隔线区分场景和结果
  • 使用”### 然后”作为口语化的标题,自然地开始描述
  • 避免系统化的表述(如”我选择了…”),保持故事的流畅性
  • 不包含具体时间点,只描述决策带来的结果

工作流3:总结与复盘

当所有决策循环完成后,进入总结阶段:

1. 一天总结节点(LLM)

  • 生成”### 这一天就这样过去了”等口语化的标题
  • 包含” 总体回顾”和” 主观感受”两个部分
  • 总结一天的体力/精力消耗、关键事件、整体感受

2. 决策复盘报告节点(LLM)

  • 决策回顾 (50-100字):回顾当时的情况和决策逻辑
  • 未来影响 (100-150字):预测这个决策在未来可能产生的影响
    • 对每个决策点进行复盘分析
    • 每个决策包含:
    • 使用纯Markdown格式输出,确保格式渲染正确

技术实现细节

接下来逐个功能点拆分。

1. LLM节点与JSON解析的配合

整个工作流中,大部分LLM节点输出JSON格式:

{

“user_message”: “用户看到的内容(Markdown格式)”,

“context_data”: {

// 后续节点需要的结构化数据

}

}

每个LLM节点后都跟着一个Python代码节点来解析JSON,提取context_data供后续节点使用,同时提取user_message用于展示给用户。

关键设计:user_message必须是对当前步骤执行结果的概括,而不是”正在处理”等过程性提示,这样用户能实时看到进度。

JSON解析节点的通用代码

import json

import re

def main(params: dict) -> dict:

input_str = params.get(‘llm_output’) or params.get(‘input’, ”)

if not input_str:

return {}

# 处理可能被markdown代码块包裹的情况

input_str = re.sub(r’^“`json\s*’, ”, input_str, flags=re.MULTILINE)

input_str = re.sub(r’“`\s*$’, ”, input_str, flags=re.MULTILINE)

input_str = input_str.strip()

try:

parsed_data = json.loads(input_str)

context_data = parsed_data.get(‘context_data’, {})

user_message = parsed_data.get(‘user_message’, ”)

return {

‘context_data’: context_data,

‘user_message’: user_message

}

except json.JSONDecodeError:

return {}

这里有三个细节,需要做到位:

  1. 处理可能被markdown代码块包裹的JSON(去除“`json标记)
  2. JSON解析失败时的降级处理(返回空字典)
  3. 确保提取的字段都有默认值,避免后续节点报错

2. 循环节点的状态传递

循环节点的设计,本质上是让你用工作流构造一个”工具插件”,循环调用、处理事件。

关键设计:状态完全在循环体内管理,不依赖循环体外的全局变量。

状态管理方式

  • 第一次循环时,在循环开始节点初始化状态(体力=100,精力=100,历史记录为空)
  • 每次循环结束后,状态在状态更新节点中更新
  • 更新后的状态通过输出变量(previous_physical_energy、previous_event_history等)传递给下一个循环
  • 循环结束后,最终状态会传递给总结节点

循环参数组装节点的代码

def main(params: dict) -> dict:

parsed_person = params.get(‘parsed_person’, {})

character_profile = params.get(‘character_profile’, {})

day_plan = params.get(‘day_plan’, {})

# 从day_plan中获取事件列表,数组长度即为循环次数

events = day_plan.get(‘events’, [])

# 组装循环参数数组(只包含静态参数,不包含动态状态)

event_loop_params = []

for i in range(len(events)):

loop_param = {

‘parsed_person’: parsed_person,

‘character_profile’: character_profile,

‘day_plan’: day_plan,

‘current_event’: events[i],

‘current_event_index’: i

}

event_loop_params.append(loop_param)

return {‘event_loop_params’: event_loop_params}

循环结束后,通过代码节点将循环的返回结果(数组)转换为event_history和decision_history:

def main(params: dict) -> dict:

# 获取循环返回的数组,支持多种可能的字段名

answer_data = params.get(‘Results’) or params.get(‘Answer’) or params.get(‘loop_output’, [])

event_history = []

decision_history = []

for item in answer_data:

# 提取事件信息和决策信息,组装成event_history和decision_history

# …

return {

‘event_history’: event_history,

‘decision_history’: decision_history

}

3. Markdown格式的严格控制

为了确保前端能够正确渲染,所有LLM节点的输出都严格遵循Markdown格式规范:

  • 标题格式 使用###
  • 粗体文本 使用**文本**
  • 列表 使用-或数字列表
  • 分隔线 使用—

特别注意的是,节点7(决策复盘报告)直接输出纯Markdown文本,而不是JSON包装,这样可以避免JSON转义导致的Markdown渲染问题。

4. 提示词工程的精细化

每个LLM节点都有详细的提示词,包含:

  • 角色设定:明确LLM扮演的角色(如”你是一个场景生成助手”)
  • 输入说明:清晰说明输入变量的含义和格式
  • 输出格式:严格要求输出格式,提供示例
  • 风格要求:强调沉浸感、口语化、自然流畅等

场景生成节点的提示词关键部分

角色信息:

{{parsed_person}}

角色档案:

{{character_profile}}

当前事件:

{{current_event}}

请生成一个生动的场景,要求:

1. 使用第一人称描述(”我蹲在…””我跨上电动车…”)

2. 场景描述要生动具体,包含时间、地点、环境细节(80-120字)

3. 内心思考要符合角色身份和处境,使用” 我在想”标记(50-100字)

4. 决策选项要有明显的利弊权衡,每个选项10-20字

5. 使用Markdown格式输出,包含三级标题和列表

请严格按照以下JSON格式返回:

{

“user_message”: “### [时间] ([时间段]) [地点]\n\n[场景描述]\n\n### 我在想\n\n[角色思考]\n\n### [决策问题]\n\n1. [选项1]\n2. [选项2]\n3. [选项3]\n4. [选项4]”,

“context_data”: {

“scene_context”: “…”,

“location”: “…”,

“decision_point”: {

“question”: “…”,

“options”: […]

}

}

}

关键点

  • 必须使用结构化输出(JSON格式),确保后续节点能正确解析
  • 输出格式要严格规定,包含示例,避免模型自由发挥
  • 风格要求要明确具体(第一人称、口语化、沉浸感等)

[配图建议6:可以展示场景生成节点的完整提示词,或者展示输出示例]

5. 错误处理与容错

代码节点中实现了完善的错误处理,确保流程不会因为数据格式问题中断。

JSON解析失败时的降级处理

try:

parsed_data = json.loads(input_str)

context_data = parsed_data.get(‘context_data’, {})

except json.JSONDecodeError:

# 解析失败时返回空字典,而不是抛出异常

return {‘context_data’: {}}

数据格式不一致时的类型检查

# 确保体力精力值在0-100范围内

updated_physical_energy = context_data.get(‘updated_physical_energy’, 100)

if isinstance(updated_physical_energy, str):

try:

updated_physical_energy = int(updated_physical_energy)

except ValueError:

updated_physical_energy = 100

updated_physical_energy = max(0, min(100, int(updated_physical_energy)))

循环返回结果的结构化解析,支持多种可能的字段名

# 兼容不同的返回结构

answer_data = params.get(‘Results’) or params.get(‘Answer’) or params.get(‘loop_output’, [])

if not isinstance(answer_data, list):

if isinstance(answer_data, dict) and ‘Results’ in answer_data:

answer_data = answer_data[‘Results’]

else:

answer_data = []

实际效果展示

  • 用户选择”体验韦小宝的一天”
  • 生成的场景描述(包含时间、地点、场景、内心思考、4个选项)
  • 用户选择某个选项后的结果反馈
  • 最终的一天总结和决策复盘报告

体验一个完整流程后,用户能够:

  • 理解外卖员面临的时间压力、体力消耗、经济压力
  • 体验决策的复杂性(比如”安抚康熙还是天地会”的两难选择)
  • 看到每个选择带来的短期和长期影响
  • 获得共情和理解,而不是简单的同情

拓展和延伸

场景延伸

这个智能体的核心是基于LLM的场景生成和决策模拟能力。

类似的玩法可以延伸到:

  • 教育场景:让学生体验历史人物的决策困境,理解历史事件的复杂性
  • 职业规划:让求职者体验不同职业的真实工作场景
  • 社会认知:帮助人们理解不同社会群体的生活状态
  • 心理健康:通过体验他人的处境,培养共情能力

技术延伸

工作流架构的优势在于模块化和可扩展性:

  1. 知识库增强:可以为历史人物添加专门的知识库,提高场景生成的历史准确性
  2. 多分支剧情:可以根据不同的决策路径生成不同的后续事件,实现真正的分支剧情
  3. 状态系统扩展:可以增加更多状态维度(如经济状况、人际关系、情绪状态等),让体验更加丰富
  4. 多角色互动:可以支持多个角色的同时体验,模拟复杂的社交场景

关于智能体平台

搭建这个智能体使用的是工作流平台,它提供了完整的工作流搭建能力:

  • 可视化工作流:通过拖拽节点就能搭建复杂的业务流程
  • LLM节点:内置多种大模型,支持灵活的提示词工程
  • 代码节点:支持Python代码,实现复杂的数据处理逻辑
  • 循环节点:支持循环调用子工作流,实现批量处理
  • 变量管理:完善的状态管理和变量传递机制

最关键的是,你可以把搭建好的智能体直接发布到小程序,不需要自己搞备案、买服务器,用户体验流畅,价值完全不同。

(主工作流)

(子工作流)

写在最后

这个智能体的核心价值不在于技术有多复杂,而在于它把”理解他人”这件事的门槛降低了。

通过AI模拟,我们可以在几十分钟内体验另一个人完整的一天,感受他们的处境和选择。这种体验虽然不能完全替代真实经历,但足以让我们获得宝贵的共情和理解。

如果你也想搭建类似的智能体,或者对技术实现细节感兴趣,欢迎交流。

体验链接:https://yuanqi.tencent.com/webim/?sessionid=#/chat/SgGAyd?appid=2003750988803319040&experience=true

欢迎体验”魂穿:体验TA的一天”,并反馈任何建议或BUG。

本文由 @崔峻 原创发布于人人都是产品经理。未经作者许可,禁止转载

题图来自Pexels,基于CC0协议

更多精彩内容,请关注人人都是产品经理微信公众号或下载App
评论
评论请登录
  1. 目前还没评论,等你发挥!