1. 项目概述:当AI成为你的数字伙伴

最近在GitHub上看到一个挺有意思的项目,叫“AIAIDo/aidog”。光看名字,你可能会联想到“AI助手”或者“数字宠物”,但深入了解一下,你会发现它的野心远不止于此。这本质上是一个旨在构建一个具备长期记忆、个性化交互能力的智能体(Agent)框架。简单来说,它想做的不是一次性的问答机器,而是一个能“记住”你、理解你的上下文、并随着时间推移与你共同成长的数字伙伴。

想象一下,你有一个私人助理,它不仅能处理你当下的指令,比如“帮我查一下明天的天气”或“写一封邮件”,更能记住你上周提过的项目进度、你偏好的沟通风格、甚至你常犯的一些小错误。下次你再和它交流时,它无需你重复背景,就能基于之前的“记忆”给出更精准、更贴心的回应。这就是“aidog”这类智能体框架试图实现的核心愿景——让AI交互从零散的、断片式的对话,进化为连续的、有深度的协作关系。

这个项目特别吸引我的地方在于,它没有停留在概念层面,而是提供了具体的实现路径和工具链。它探讨了如何为AI智能体构建“记忆系统”,如何让智能体在不同的任务和场景中保持一致的“人设”,以及如何通过有效的提示工程(Prompt Engineering)来引导智能体的行为。对于开发者、AI应用创业者,甚至是热衷于探索人机交互未来的极客来说,这个项目提供了一个非常棒的实验场和思考框架。接下来,我将结合自己的理解和一些实践尝试,深入拆解这个项目的核心思路、技术实现以及其中蕴含的挑战与机遇。

2. 核心架构与设计哲学解析

2.1 从“工具调用”到“伙伴养成”的范式转变

传统的AI应用,无论是基于大语言模型的聊天机器人,还是任务型助手,大多遵循“请求-响应”的范式。用户输入一个问题或指令,模型基于当前的提示词和上下文窗口内的信息,生成一个回答。这个过程是 无状态的 ,每一次交互都几乎是独立的。模型不会“记得”一分钟前、一小时前,更不用说一天前你们聊过什么。这种模式的局限性显而易见:对话缺乏连贯性,个性化程度低,用户需要不断重复背景信息。

“aidog”项目所代表的智能体框架,其核心设计哲学就是要打破这种无状态性,引入 状态(State) 记忆(Memory) 的概念。这不仅仅是技术上的升级,更是一种交互范式的根本转变——从把AI当作一个随用随弃的“工具”,转变为将其视为一个可以持续互动、共同成长的“伙伴”。

为了实现这一点,框架需要解决几个关键问题:

  1. 记忆存储什么? 不仅仅是对话历史,还包括用户的偏好、智能体自身的“性格”设定、任务执行的历史记录、从交互中学到的经验等。
  2. 记忆如何存储和检索? 海量的交互信息不可能全部塞进模型的有限上下文窗口。需要一套高效的存储、索引和检索机制,在需要的时候,快速找到最相关的记忆片段。
  3. 记忆如何影响行为? 检索到的记忆如何与当前的指令结合,共同形成给模型的最终提示(Prompt),从而让模型的输出体现出“记忆”的影响。

这个框架通常会将智能体的“大脑”分为几个模块:一个负责推理和生成的核心大模型(如GPT-4、Claude或开源模型),一个负责记忆存储与检索的向量数据库(如Chroma、Pinecone),一个负责规划复杂任务的工作流引擎,以及一个定义智能体基础行为方式的“角色”或“人设”系统。

2.2 角色系统:为智能体注入“灵魂”

一个没有个性的AI是乏味的,也难以建立长期的联系。“aidog”这类项目非常重视 角色系统(Persona System) 的设计。这不仅仅是给AI起个名字那么简单,而是一套完整的描述和行为约束。

一个典型的角色定义可能包括:

  • 基础身份 :名称、职业(如“高效的研究助理”、“富有创意的写作伙伴”)。
  • 核心目标 :它的存在是为了什么?(如“帮助用户高效处理信息,并提供有深度的见解”)。
  • 沟通风格 :是正式严谨,还是轻松幽默?喜欢用比喻还是直来直去?
  • 能力边界 :明确它擅长什么,不擅长什么,以及在不确定时应如何回应。
  • 行为准则 :一些必须遵守的规则,比如“永远保持友好和乐于助人”、“不生成有害内容”、“在提供建议时注明不确定性”。

在技术实现上,这些角色定义会被转化为一段结构化的系统提示(System Prompt),在每次与核心模型交互时,作为背景信息的一部分输入。这相当于为模型设定了一个初始的“人格底色”。更高级的实现中,角色信息也会被存入记忆库,并在后续的交互中通过检索得到强化和微调,使得智能体的行为能够保持一致性,甚至根据与用户的互动发生符合其“人设”的演变。

注意 :角色设计是一把双刃剑。过于刻板的角色会显得僵硬,而过于宽松的定义又可能导致行为漂移。一个好的实践是,角色定义应包含一些核心的、不变的原则,同时在风格和知识领域上保留一定的灵活性,允许通过交互进行“软调整”。

2.3 记忆系统的技术实现剖析

记忆系统是整个框架的基石。一个高效的记忆系统通常采用分层或分类型的存储策略,并结合向量检索技术。

1. 记忆的分类:

  • 短期记忆/对话历史 :保存最近若干轮的对话内容,直接用于维持对话的连贯性。这部分通常存储在内存或简单的缓存中,易于快速存取。
  • 长期记忆 :这是核心。又可以分为:
    • 事实性记忆 :用户提供的特定信息,如“我的项目代号是‘凤凰’,下周要跟客户张三汇报”。
    • 程序性记忆 :智能体学会的“技能”或“最佳实践”,例如“当用户要求总结长文档时,先提取大纲,再逐段精炼”。
    • 关联性记忆 :基于对话和事件抽象出的关系与模式,比如“用户通常在周一上午比较忙,偏好接收简洁的清单式汇报”。
  • 元记忆 :关于记忆本身的记忆,比如某条信息的重要性、可信度、被访问的频率等,用于指导记忆的存储、检索和遗忘(压缩)策略。

2. 存储与检索机制: 长期记忆的存储,目前最主流和有效的方式是使用 向量数据库 。其工作流程如下:

  • 编码 :当一段需要记忆的对话或信息产生时,使用一个嵌入模型(Embedding Model,如OpenAI的 text-embedding-3-small 或开源的 BGE 系列)将其转换为一个高维向量。这个向量包含了这段文本的语义信息。
  • 存储 :将这个向量和对应的原始文本(或摘要)一起存入向量数据库。
  • 检索 :当新的用户查询到来时,同样用嵌入模型将其转换为查询向量。然后在向量数据库中执行 相似性搜索 ,找出与查询向量最相似的若干个记忆向量,并返回对应的原始文本。
  • 合成 :检索到的相关记忆片段,连同当前的用户查询和短期记忆,被一起组合成最终的提示,发送给大语言模型进行推理和生成。

这种基于语义的检索,比传统的关键词匹配要强大得多,它能够找到在概念上相关,但字面上不匹配的记忆。

3. 记忆的更新与遗忘: 智能体不能只记不忘,那样记忆库会无限膨胀,导致检索效率下降和噪声干扰。因此需要设计记忆的更新、合并和遗忘策略。

  • 重要性评分 :可以为每条记忆附加一个重要性分数,这个分数可以通过模型判断、用户反馈(如点赞/点踩)或访问频率来自动调整。
  • 记忆合并 :当关于同一主题的记忆条目过多时,可以触发一个总结流程,用大模型将这些分散的记忆合并成一条更精炼、信息密度更高的记忆。
  • 定期清理 :根据重要性分数和时效性,定期清理或归档低重要性、过时的记忆。

3. 关键组件与实操部署指南

3.1 技术栈选型与考量

构建一个类似“aidog”的智能体,你需要搭建一个包含以下组件的技术栈:

  1. 大语言模型(LLM) :智能体的“大脑”。

    • 云端API OpenAI GPT-4/3.5-Turbo Anthropic Claude 系列。优势是能力强、省心,缺点是持续使用成本高,且有数据隐私考量。
    • 本地/自托管 Llama 3 Qwen Gemma 等开源模型。通过 Ollama vLLM Transformers 库部署。优势是数据完全私有、可控,长期成本可能更低,缺点是对硬件有要求,且某些场景下能力可能略逊于顶级闭源模型。
    • 选型建议 :对于原型验证和初期开发,建议从GPT-3.5-Turbo API开始,快速迭代功能。当应用逻辑成熟并考虑数据隐私时,再迁移到性能较好的开源模型(如70B参数的Llama 3)。
  2. 向量数据库 :智能体的“海马体”(负责长期记忆)。

    • 轻量级/嵌入式 Chroma LanceDB 。非常适合本地开发和小型应用,无需单独服务器,集成简单。
    • 云服务/生产级 Pinecone Weaviate Qdrant 。提供托管服务,易于扩展,功能强大(如过滤、多租户)。
    • 选型建议 :个人项目或概念验证(PoC)首选Chroma,几乎零配置。如果预计记忆量很大(数百万条以上)或需要高并发,应考虑Pinecone或自建Qdrant集群。
  3. 嵌入模型 :将文本转化为向量的“编码器”。

    • OpenAI API text-embedding-3-small/large ,质量高且稳定。
    • 开源模型 BGE(BAAI/bge-large-zh) 对于中文效果极佳; Snowflake Arctic Embed 是多语言通用模型。需要本地部署。
    • 选型建议 :如果使用OpenAI的LLM,配套使用其嵌入模型最方便。如果使用开源LLM或注重中文效果,BGE是绝佳选择。
  4. 应用框架与编排 :智能体的“神经系统”。

    • LangChain / LangGraph :功能极其全面的框架,提供了大量现成的模块(记忆、链、代理工具),但学习曲线较陡,抽象层次高。
    • LlamaIndex :更专注于数据索引和检索增强生成(RAG),在文档处理方面有优势。
    • 自定义轻量框架 :基于FastAPI等Web框架,直接调用模型API和向量数据库SDK进行组装。灵活性最高,但对架构设计能力要求也高。
    • 选型建议 :初学者可以从LangChain开始,利用其丰富的示例快速搭建原型。当对流程有深刻理解后,为了追求性能和可控性,可以转向更轻量的自定义架构。

3.2 基础环境搭建与核心代码 walkthrough

假设我们选择 FastAPI(后端) + OpenAI API(LLM & Embedding) + Chroma(向量库) 这套相对轻量且易于理解的组合。以下是一个高度简化的核心流程示例,旨在阐明逻辑。

环境准备:

# 创建虚拟环境(可选但推荐)
python -m venv venv
source venv/bin/activate  # Linux/Mac
# venv\Scripts\activate  # Windows

# 安装核心依赖
pip install fastapi uvicorn openai chromadb langchain-openai python-dotenv

项目结构:

aidog_core/
├── main.py          # FastAPI 主应用
├── agent/
│   ├── __init__.py
│   ├── memory.py    # 记忆系统
│   └── persona.py   # 角色系统
├── .env            # 存储API密钥等配置
└── requirements.txt

核心代码解析:

  1. 记忆系统实现 ( agent/memory.py ) :
import chromadb
from chromadb.config import Settings
from openai import OpenAI
import os
from datetime import datetime

class MemorySystem:
    def __init__(self, persist_directory="./chroma_db"):
        # 初始化Chroma客户端,数据持久化到本地目录
        self.client = chromadb.PersistentClient(path=persist_directory)
        # 获取或创建一个名为“aidog_memories”的集合(类似数据库的表)
        self.collection = self.client.get_or_create_collection(name="aidog_memories")
        # 初始化OpenAI客户端用于生成嵌入向量
        self.openai_client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
        self.embed_model = "text-embedding-3-small"

    def _get_embedding(self, text):
        """调用OpenAI API获取文本的嵌入向量"""
        response = self.openai_client.embeddings.create(
            model=self.embed_model,
            input=text
        )
        return response.data[0].embedding

    def store_memory(self, text, metadata=None):
        """存储一段记忆。metadata可包含重要性、类型、关联用户ID等信息"""
        if metadata is None:
            metadata = {}
        # 添加时间戳
        metadata['timestamp'] = datetime.now().isoformat()
        
        # 生成唯一ID和嵌入向量
        memory_id = f"mem_{datetime.now().strftime('%Y%m%d_%H%M%S%f')}"
        embedding = self._get_embedding(text)
        
        # 存入Chroma集合
        self.collection.add(
            embeddings=[embedding],
            documents=[text],
            metadatas=[metadata],
            ids=[memory_id]
        )
        return memory_id

    def retrieve_relevant_memories(self, query, n_results=5):
        """根据查询检索最相关的N条记忆"""
        query_embedding = self._get_embedding(query)
        # 执行相似性搜索
        results = self.collection.query(
            query_embeddings=[query_embedding],
            n_results=n_results
        )
        # results 包含 ids, documents, metadatas, distances
        if results['documents']:
            # 将检索到的文档(记忆文本)拼接起来
            return "\n---\n".join(results['documents'][0])
        return ""
  1. 角色与提示工程 ( agent/persona.py ) :
class AidogPersona:
    system_prompt = """你是一个名为‘小智’的AI助手。你的核心目标是成为用户可靠、高效的长期伙伴。
核心特质:
1. 友好且富有同理心,但保持专业。
2. 拥有长期记忆,能记住我们之前的对话内容。
3. 对于不确定的事情,会坦诚说明,而不是虚构。
4. 回答力求准确、清晰,在复杂问题上能提供结构化分析。

请始终以以上角色设定进行回应。"""
    
    @classmethod
    def format_prompt(cls, user_input, conversation_history, relevant_memories):
        """组装最终的提示词"""
        prompt = f"{cls.system_prompt}\n\n"
        
        if relevant_memories:
            prompt += f"【相关记忆回顾】\n{relevant_memories}\n\n"
        
        if conversation_history:
            prompt += f"【近期对话历史】\n{conversation_history}\n\n"
        
        prompt += f"【用户当前请求】\n{user_input}\n\n【小智的回应】:"
        return prompt
  1. 主应用逻辑 ( main.py ) :
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from agent.memory import MemorySystem
from agent.persona import AidogPersona
from openai import OpenAI
import os
from typing import List

app = FastAPI(title="Aidog Core API")
memory_system = MemorySystem()
openai_client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
llm_model = "gpt-3.5-turbo"

# 简单的对话历史缓存(生产环境应用Redis等)
conversation_cache = {}

class ChatRequest(BaseModel):
    user_id: str
    message: str

@app.post("/chat")
async def chat_with_aidog(request: ChatRequest):
    user_id = request.user_id
    user_message = request.message
    
    # 1. 从缓存获取该用户的短期对话历史
    history = conversation_cache.get(user_id, [])
    
    # 2. 从长期记忆中检索相关内容
    relevant_memories = memory_system.retrieve_relevant_memories(user_message)
    
    # 3. 格式化历史对话(例如,最近5轮)
    formatted_history = "\n".join([f"用户:{h['user']}\n小智:{h['assistant']}" for h in history[-5:]]) if history else ""
    
    # 4. 组装完整提示词
    full_prompt = AidogPersona.format_prompt(user_message, formatted_history, relevant_memories)
    
    # 5. 调用大语言模型
    try:
        response = openai_client.chat.completions.create(
            model=llm_model,
            messages=[{"role": "user", "content": full_prompt}],
            temperature=0.7,
            max_tokens=500
        )
        ai_response = response.choices[0].message.content
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"LLM调用失败: {str(e)}")
    
    # 6. 存储本次交互到长期记忆(可选择性地存储,并非每句都存)
    # 例如,只存储用户的重要陈述或AI生成的关键信息
    if is_worth_remembering(user_message, ai_response): # 这是一个需要实现的判断函数
        memory_system.store_memory(
            text=f"用户说:{user_message}\n小智回应:{ai_response}",
            metadata={"user_id": user_id, "type": "dialogue_exchange"}
        )
    
    # 7. 更新短期对话历史缓存
    history.append({"user": user_message, "assistant": ai_response})
    conversation_cache[user_id] = history[-10:] # 只保留最近10轮
    
    # 8. 返回响应
    return {"response": ai_response, "memory_used": bool(relevant_memories)}

def is_worth_remembering(user_msg, ai_resp):
    """一个简单的启发式函数,判断对话是否值得存入长期记忆。
    实际应用中,可以用另一个LLM调用来判断,或基于关键词规则。"""
    # 示例:如果用户消息包含“记住”、“重要”、“项目”等词,则值得记忆
    keywords = ["记住", "重要", "项目", "偏好", "不喜欢"]
    return any(keyword in user_msg for keyword in keywords)

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

这个简化的示例展示了核心的数据流:接收用户输入 -> 检索相关记忆 -> 组合上下文和角色提示 -> 调用LLM -> 存储有价值的新记忆 -> 返回响应。你可以通过运行 uvicorn main:app --reload 来启动这个服务,并通过 /chat 端点与之交互。

4. 高级特性与优化策略探讨

4.1 工作流与任务分解

一个成熟的智能体不应只被动响应,而应能主动规划并执行复杂任务。这就需要引入 工作流(Workflow) 任务分解(Task Decomposition) 的能力。

例如,用户指令是:“帮我分析一下我们上周讨论的‘智慧园区’项目,竞争对手的最新动态,并起草一份市场机会简报。” 这个任务可以分解为:

  1. 记忆检索 :从长期记忆中找出关于“智慧园区项目”的所有相关信息。
  2. 子任务规划
    • 子任务A:搜索并汇总主要竞争对手(名单可从记忆或用户处获取)过去一个月的最新动态、产品发布、融资新闻等。
    • 子任务B:基于项目资料和竞争对手动态,进行SWOT分析(优势、劣势、机会、威胁)。
    • 子任务C:根据以上分析,起草一份结构清晰的简报文档。
  3. 工具调用 :执行子任务A可能需要调用网络搜索API(如Serper.dev、Exa.ai)或联网搜索功能。
  4. 结果合成 :将子任务A和B的结果作为输入,执行子任务C。
  5. 交付与记忆 :将最终简报呈现给用户,并将本次分析的关键结论作为新的记忆存储。

实现上,可以使用 LangGraph 微软的AutoGen 这类框架来编排这种有状态、多步骤的工作流。它们允许你以图(Graph)的形式定义智能体的行动流程,节点代表任务或决策点,边代表状态流转的条件。

4.2 记忆的优化:总结、压缩与遗忘策略

随着时间推移,原始的记忆库会变得臃肿。直接存储所有对话的原始文本,不仅检索效率会降低,无关信息干扰也会增加。我们需要让记忆系统变得“智能”。

  • 定期总结 :可以设定一个后台任务,定期(如每天)对某个主题下的所有细碎记忆进行总结。例如,将一天内关于“项目A”的10条零散讨论,总结成一条“关于项目A,今日主要讨论了需求变更X、技术选型Y和风险Z”的结构化记忆。这大大提升了记忆的信息密度。
  • 重要性加权与衰减 :每条记忆可以有一个“重要性”分数和“新鲜度”分数。重要性可以通过初始赋值(用户标记、关键词触发)和后续的访问模式来调整。新鲜度随时间衰减。检索时,可以综合相似度、重要性和新鲜度进行排序。
  • 主动遗忘(压缩) :当某个主题的记忆条目超过阈值,或总记忆量过大时,触发压缩流程。使用LLM识别冗余、过时或低重要性的记忆,并将其归档或删除。这模仿了人类的记忆机制。

4.3 评估与持续改进:如何判断你的“数字伙伴”在变好?

构建智能体不是一劳永逸的,需要一套评估和迭代机制。

  • 主观用户体验 :最直接的反馈。用户是否觉得对话更连贯了?智能体是否更“懂我”了?可以通过简单的反馈按钮(👍/👎)收集。
  • 客观指标
    • 任务完成率 :对于指令明确的复杂任务,是否能成功完成所有步骤?
    • 记忆检索准确率 :在需要历史信息的对话中,检索到的记忆是否真正相关?
    • 响应相关性 :使用像 RAGAS 这样的评估框架,自动化评估响应是否基于提供的上下文(检索到的记忆)。
    • 幻觉率 :智能体是否减少了基于“记忆”胡编乱造的情况?
  • A/B测试 :对于重要的改进(如新的记忆检索策略、不同的角色提示),可以进行小流量的A/B测试,对比关键指标,用数据驱动决策。

5. 实战挑战与避坑指南

在实际开发和测试这类智能体系统的过程中,我遇到了不少坑,也总结出一些经验。

5.1 常见问题与解决方案

问题1:记忆检索“答非所问”或遗漏关键信息。

  • 原因 :嵌入模型对某些领域或表述方式不敏感;检索时只考虑了语义相似度,没考虑时效性、重要性。
  • 解决方案
    • 微调嵌入模型 :如果领域非常垂直(如法律、医疗),用自己的数据微调一个开源的嵌入模型(如BGE),能大幅提升检索质量。
    • 混合检索 :结合 向量检索 (语义)和 关键词检索 (精确匹配)。例如,对于项目代号、产品型号等专有名词,关键词检索更可靠。
    • 检索后重排序 :先用向量检索出Top K个结果(比如20个),再用一个更小的、专门训练过的交叉编码器模型对这K个结果进行精排序,选出最相关的Top N个。
    • 丰富元数据过滤 :存储记忆时,为其打上丰富的标签(如:主题、实体、日期、重要性等级)。检索时,除了向量相似度,还可以加上元数据过滤条件,例如 WHERE topic = ‘项目A’ AND date > ‘2024-01-01’

问题2:提示词过长,导致API调用成本激增或超出模型上下文限制。

  • 原因 :无节制地将所有相关记忆和长段对话历史都塞进提示词。
  • 解决方案
    • 记忆摘要 :如前所述,定期对记忆进行总结,存储摘要而非全文。
    • 动态上下文窗口管理 :实现一个智能的上下文组装器。优先放入最重要的信息(如系统指令、最近几轮对话),然后根据剩余token空间,按相关性从高到低放入检索到的记忆,直到填满窗口。
    • 分层记忆 :区分“工作记忆”(正在使用的)和“长期存储”(归档的)。只有高度相关的才从长期存储加载到工作记忆中。

问题3:智能体“性格漂移”或行为不一致。

  • 原因 :系统提示词(角色定义)被淹没在过长的上下文中;或者后续的用户输入和记忆过于强势,覆盖了初始的角色设定。
  • 解决方案
    • 角色提示词强化 :在组装最终提示时,将系统提示词放在最前面,并可能在某些关键节点(如每5轮对话后)以某种方式重新强调一下角色。
    • 将角色也作为可检索的记忆 :将角色定义的核心条款(如行为准则)也作为一条特殊的、高权重的记忆存入向量库。在每次检索时,强制将这条“角色记忆”也包含在检索结果中,确保其始终参与生成。

问题4:处理敏感信息与隐私安全。

  • 风险 :长期记忆库可能包含用户的私人对话、项目机密等敏感信息。
  • 解决方案
    • 本地化部署 :核心模型和向量数据库全部部署在用户可控的私有环境中。
    • 记忆脱敏 :在存储记忆前,使用命名实体识别(NER)模型识别并擦除或替换掉人名、电话、地址等敏感信息。
    • 访问控制 :为记忆系统实现严格的基于用户ID的访问控制,确保用户A无法检索到用户B的记忆。
    • 数据加密 :对存储在数据库中的记忆文本进行加密。

5.2 成本控制与性能优化

对于使用云端API的方案,成本是需要精细管理的。

  • 异步处理与缓存 :记忆的存储和检索(尤其是生成嵌入向量)可以做成异步任务,不阻塞主响应流程。对于常见的查询,可以缓存其检索结果一段时间。
  • 选择合适的模型 :不是所有任务都需要GPT-4。对于记忆检索后的内容合成、总结等任务,GPT-3.5-Turbo或更小的开源模型可能就足够了。可以将任务路由到不同成本的模型。
  • 监控与告警 :建立API调用次数、token消耗的监控仪表盘,设置预算告警,避免意外开销。

构建一个像“aidog”这样有记忆的智能体,是一个充满挑战但也极具成就感的工程。它迫使我们去思考人机交互的更深层问题:什么是有效的沟通?记忆如何塑造个性?如何让机器不仅聪明,而且“贴心”?目前的技术方案远非完美,幻觉问题、长上下文的理解、复杂任务的规划能力都还有很长的路要走。但这个方向无疑是激动人心的。从简单的工具到真正的伙伴,我们正在迈出关键的一步。我个人的体会是,与其追求一个无所不能的通用智能体,不如先从解决一个具体的、高频率的场景需求开始,比如一个能记住所有会议纪要并主动提醒你行动项的“项目助理”,或者一个了解你全部学习进度和薄弱点的“私人导师”。在一个小场景里把记忆和个性化的价值做透,其带来的体验提升将是颠覆性的。

更多推荐