【S1W2 交叉评测】对项目 CallItADay 的反馈 #1

Open
opened 2026-05-15 19:19:21 +08:00 by yishan · 1 comment

【S1W2 交叉评测】对项目 CallItADay 的反馈

1. 项目理解

我理解该项目主要面向:需要日常记录与AI陪伴的个人用户,提供一个日记+AI聊天的融合应用。

项目想解决的问题是:让用户在写日记的同时,拥有一个能"记住"过去、理解情绪、提供个性化陪伴的AI伙伴。核心路径为:用户写日记 → 日记自动向量化存入ChromaDB → AI聊天时通过意图分类决定是否调用工具检索记忆 → 结合记忆生成个性化回复。

技术架构清晰:React前端 + FastAPI后端 + PostgreSQL(结构化数据) + ChromaDB(向量检索) + AWS Bedrock(LLM),采用两轮Agent架构(意图分类 → 工具执行/直接回复),并设计了独立的"Soul"模块实现AI人格可配置。

2. 项目亮点

  • 两轮Agent架构设计合理:先做轻量意图分类(Turn1),再按需注入详细tool spec执行(Turn2),避免了每次都把所有工具描述塞入上下文,节省token、降低延迟
  • "Soul"独立模块设计:system_prompt.txt、intent_prompt.txt、tool_specs/均为独立文件,修改AI人格无需改代码,重启容器即可生效,扩展性好
  • 工具定义规范:3个tool(memory_search、memory_add、diary_retrieve)均有完整JSON Schema,含参数描述、返回类型、示例,符合Agent工具调用规范
  • Docker Compose一键部署:PostgreSQL + ChromaDB + Backend + Frontend 全容器化,依赖关系和健康检查配置完整,便于评审环境快速跑通
  • 情绪趋势分析:summary_builder中的mood_trend分析为Agent提供了用户情绪上下文,增强了回复的个性化
  • README文档完整:架构图、数据流、API端点、环境变量、开发指南一应俱全

3. 当前不足

3.1 工具参数硬编码,未由LLM动态生成

当前 _execute_tool 方法中,工具参数是硬编码的:

  • memory_search:直接用 user_message 整句作为 query,未让LLM提取关键搜索词
  • memory_add:直接用 user_message 整句作为 content,未让LLM提炼需要记住的信息
  • diary_retrieve:固定返回最近5条,忽略了tool spec中定义的 date 参数

这意味着用户说"我上周跑步受伤了,帮我查查之前有没有类似情况",memory_search 会用整句话去搜索,而不是提取"跑步受伤"作为query,检索效果会大打折扣。核心工具调用逻辑未真正闭环。

3.2 意图分类仅支持单工具调用

classify_intent 每次只返回一个 tool_name,但实际场景可能需要组合调用:

  • 用户说"我昨天写了什么?帮我记住我今天心情不错" → 需要 diary_retrieve + memory_add
  • 用户说"我之前提到过跑步吗?帮我记一下今天跑了5公里" → 需要 memory_search + memory_add

当前架构无法处理这类组合意图。

3.3 前端未传递 session_id

ChatSection.tsx 中 POST /api/chat 请求体只传了 message,未传 session_id

body: JSON.stringify({ message: userMessage.content }),

而后端 ChatRequest 的 session_id 默认为 "default",导致所有用户共享同一个会话,无法区分不同聊天会话。

3.4 缺少用户认证与多用户支持

当前系统无任何认证机制,所有日记和聊天记录混在一起。如果部署为公开服务,用户A能看到用户B的数据。

3.5 diary_retrieve 工具实现与 spec 不一致

tool spec 定义了 date 参数支持按日期检索,但 workflow.py_execute_tool 的 diary_retrieve 分支只调用了 get_recent_diaries(limit=5),完全忽略了日期参数,diary_tools.py 中的 get_diary_by_date 函数从未被调用。

4. 建议补充的内容

  • 实现LLM动态参数生成:在Turn2中,让LLM根据tool spec生成具体参数(如从用户消息中提取search query),而非硬编码
  • 支持多工具调用:意图分类返回 tool_name 列表而非单个,workflow 按序执行多个工具并合并结果
  • 修复前端 session_id 传递:在ChatSection中生成并传递session_id
  • 补全 diary_retrieve 的日期检索功能:在workflow中解析date参数并调用 get_diary_by_date
  • 增加基础认证:至少支持API Key或简单用户标识,区分不同用户的数据

5. 综合评价

  • 技术架构设计合理,两轮Agent + Soul模块 + 向量检索的思路清晰,有差异化亮点
  • 基础功能链路可运行,Docker部署完整,日记CRUD + AI聊天 + 记忆检索的主流程跑通
  • ⚠️ 核心功能闭环存在缺口:工具参数未由LLM动态生成、diary_retrieve日期检索未实现、单工具调用限制,这些影响了"跑通核心业务逻辑"的完成度
  • ⚠️ 缺少用户认证和会话管理,影响产品的实际可用性

总体判断:原型方向正确,核心链路基本跑通,但功能闭环有缺口。建议优先完善工具调用的参数生成逻辑,使核心Skills真正完整、有效、可运行。

# 【S1W2 交叉评测】对项目 CallItADay 的反馈 ## 1. 项目理解 我理解该项目主要面向:**需要日常记录与AI陪伴的个人用户**,提供一个日记+AI聊天的融合应用。 项目想解决的问题是:**让用户在写日记的同时,拥有一个能"记住"过去、理解情绪、提供个性化陪伴的AI伙伴**。核心路径为:用户写日记 → 日记自动向量化存入ChromaDB → AI聊天时通过意图分类决定是否调用工具检索记忆 → 结合记忆生成个性化回复。 技术架构清晰:React前端 + FastAPI后端 + PostgreSQL(结构化数据) + ChromaDB(向量检索) + AWS Bedrock(LLM),采用两轮Agent架构(意图分类 → 工具执行/直接回复),并设计了独立的"Soul"模块实现AI人格可配置。 ## 2. 项目亮点 - **两轮Agent架构设计合理**:先做轻量意图分类(Turn1),再按需注入详细tool spec执行(Turn2),避免了每次都把所有工具描述塞入上下文,节省token、降低延迟 - **"Soul"独立模块设计**:system_prompt.txt、intent_prompt.txt、tool_specs/均为独立文件,修改AI人格无需改代码,重启容器即可生效,扩展性好 - **工具定义规范**:3个tool(memory_search、memory_add、diary_retrieve)均有完整JSON Schema,含参数描述、返回类型、示例,符合Agent工具调用规范 - **Docker Compose一键部署**:PostgreSQL + ChromaDB + Backend + Frontend 全容器化,依赖关系和健康检查配置完整,便于评审环境快速跑通 - **情绪趋势分析**:summary_builder中的mood_trend分析为Agent提供了用户情绪上下文,增强了回复的个性化 - **README文档完整**:架构图、数据流、API端点、环境变量、开发指南一应俱全 ## 3. 当前不足 ### 3.1 工具参数硬编码,未由LLM动态生成 当前 `_execute_tool` 方法中,工具参数是硬编码的: - `memory_search`:直接用 `user_message` 整句作为 query,未让LLM提取关键搜索词 - `memory_add`:直接用 `user_message` 整句作为 content,未让LLM提炼需要记住的信息 - `diary_retrieve`:固定返回最近5条,忽略了tool spec中定义的 `date` 参数 这意味着用户说"我上周跑步受伤了,帮我查查之前有没有类似情况",memory_search 会用整句话去搜索,而不是提取"跑步受伤"作为query,检索效果会大打折扣。**核心工具调用逻辑未真正闭环。** ### 3.2 意图分类仅支持单工具调用 `classify_intent` 每次只返回一个 `tool_name`,但实际场景可能需要组合调用: - 用户说"我昨天写了什么?帮我记住我今天心情不错" → 需要 diary_retrieve + memory_add - 用户说"我之前提到过跑步吗?帮我记一下今天跑了5公里" → 需要 memory_search + memory_add 当前架构无法处理这类组合意图。 ### 3.3 前端未传递 session_id ChatSection.tsx 中 POST /api/chat 请求体只传了 `message`,未传 `session_id`: ```typescript body: JSON.stringify({ message: userMessage.content }), ``` 而后端 ChatRequest 的 session_id 默认为 "default",导致所有用户共享同一个会话,无法区分不同聊天会话。 ### 3.4 缺少用户认证与多用户支持 当前系统无任何认证机制,所有日记和聊天记录混在一起。如果部署为公开服务,用户A能看到用户B的数据。 ### 3.5 diary_retrieve 工具实现与 spec 不一致 tool spec 定义了 `date` 参数支持按日期检索,但 `workflow.py` 中 `_execute_tool` 的 diary_retrieve 分支只调用了 `get_recent_diaries(limit=5)`,完全忽略了日期参数,`diary_tools.py` 中的 `get_diary_by_date` 函数从未被调用。 ## 4. 建议补充的内容 - **实现LLM动态参数生成**:在Turn2中,让LLM根据tool spec生成具体参数(如从用户消息中提取search query),而非硬编码 - **支持多工具调用**:意图分类返回 tool_name 列表而非单个,workflow 按序执行多个工具并合并结果 - **修复前端 session_id 传递**:在ChatSection中生成并传递session_id - **补全 diary_retrieve 的日期检索功能**:在workflow中解析date参数并调用 `get_diary_by_date` - **增加基础认证**:至少支持API Key或简单用户标识,区分不同用户的数据 ## 5. 综合评价 - ✅ **技术架构设计合理**,两轮Agent + Soul模块 + 向量检索的思路清晰,有差异化亮点 - ✅ **基础功能链路可运行**,Docker部署完整,日记CRUD + AI聊天 + 记忆检索的主流程跑通 - ⚠️ **核心功能闭环存在缺口**:工具参数未由LLM动态生成、diary_retrieve日期检索未实现、单工具调用限制,这些影响了"跑通核心业务逻辑"的完成度 - ⚠️ **缺少用户认证和会话管理**,影响产品的实际可用性 **总体判断:原型方向正确,核心链路基本跑通,但功能闭环有缺口。建议优先完善工具调用的参数生成逻辑,使核心Skills真正完整、有效、可运行。**
Jinhui self-assigned this 2026-05-17 05:05:03 +08:00
Owner

感谢 @yishan 的详细反馈。项目在 S1W3 完成了一轮重大架构重构,以下逐条回应:

已修复

3.1 工具参数硬编码 → 已修复

bedrock_client.py 已删除,替换为 model_client.py(OpenAI 兼容)。工具参数现在由 LLM 根据 skill schemas 动态生成,通过 SkillRegistry.execute(tool_name, args) 执行,不再硬编码。

3.2 意图分类仅支持单工具调用 → 已修复

新的 LangGraph workflow 支持迭代式工具调用(layer1_max_iterations),可以连续执行多个工具。

3.5 diary_retrieve 与 spec 不一致 → 已修复

旧的硬编码 if/elif 链已被 SkillRegistry 替换,工具调用由 LLM 驱动的 StateGraph 路由。

架构升级

  • LangGraph StateGraph 真正接入:intent_and_tool_enrichmentexecute_toolpersist_layer1_resultgenerate_response
  • ChromaDB → Milvus + Elasticsearch:混合检索(RRF 融合 + CrossEncoder 重排)
  • 三模型配置:intent_recognition / tool_enrichment / response_generation,可通过 UI 管理
  • Tool Trace 可视化
  • Soul 文档持久化到 DB + changelog 支持

尚未修复

3.3 前端未传递 session_id → 待修复

ChatSection.tsx 仍只传 messagesession_id 未传递。

3.4 缺少用户认证与多用户 → 待修复


核心的 Agent 工具调用、参数生成、向量检索问题均已修复。认证和 session_id 问题仍在 backlog 中。

感谢 @yishan 的详细反馈。项目在 S1W3 完成了一轮重大架构重构,以下逐条回应: ## 已修复 ### 3.1 工具参数硬编码 → 已修复 ✅ `bedrock_client.py` 已删除,替换为 `model_client.py`(OpenAI 兼容)。工具参数现在由 LLM 根据 skill schemas 动态生成,通过 `SkillRegistry.execute(tool_name, args)` 执行,不再硬编码。 ### 3.2 意图分类仅支持单工具调用 → 已修复 ✅ 新的 LangGraph workflow 支持迭代式工具调用(`layer1_max_iterations`),可以连续执行多个工具。 ### 3.5 diary_retrieve 与 spec 不一致 → 已修复 ✅ 旧的硬编码 if/elif 链已被 SkillRegistry 替换,工具调用由 LLM 驱动的 StateGraph 路由。 ### 架构升级 - **LangGraph StateGraph** 真正接入:`intent_and_tool_enrichment` → `execute_tool` → `persist_layer1_result` → `generate_response` - **ChromaDB → Milvus + Elasticsearch**:混合检索(RRF 融合 + CrossEncoder 重排) - **三模型配置**:intent_recognition / tool_enrichment / response_generation,可通过 UI 管理 - **Tool Trace** 可视化 - **Soul 文档**持久化到 DB + changelog 支持 ## 尚未修复 ### 3.3 前端未传递 session_id → 待修复 ⏳ `ChatSection.tsx` 仍只传 `message`,`session_id` 未传递。 ### 3.4 缺少用户认证与多用户 → 待修复 ⏳ --- 核心的 Agent 工具调用、参数生成、向量检索问题均已修复。认证和 session_id 问题仍在 backlog 中。
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Jinhui/CallItADay#1
No description provided.