Chain·解读——访客提问,语料库以你的声音作答
L0 · 愿景
- introduction ——"把压缩过程倒过来":一个经过整理的知识库,访客可以对它提问,由 AI 用你自己的声音作答,答案扎根于你自己写下的文字并带有引用;"模式即角色——四个应用共享同一份语料库(自用 / 公开 / 招聘方 / 朋友)";ACL 是硬墙,角色是软的框架。
- lossy-self-presentation ——三种损耗(记忆 / 捕获 / 传递);StandMeet 存储的是图结构,并在查询发生时针对具体问题做线性化。
- dont-repeat-myself ——每一次系统替你吸收的重复讲解,都是省下来的时间。
- differentiation ——检索是对话式的:一个具体问题对应一个具体答案,而不是一份排名列表。
L1 · 承诺
任何人都可以提出一个具体问题,并得到一个用主人的口吻表达、有依据、带引用、并按其角色调整过框架的具体答案——一份语料库,按提问者、按每个问题分别做线性化。
L2 · 需求(旅程与功能)
访客旅程集合(详见 features-and-journeys),运行在三个功能面上:公开页面——根路径是首页 microsite(a5e1cada9,2026-09-04;没挂 microsite 时从代码直接提供由 SDK widget 组成的 DefaultHome,28f750caf / 185c4321b,app/src/app/default-home.tsx),ChatRoom 是内建的带码聊天(app/src/app/visitor-root.tsx:10),外加 /wiki / /output / /writings 阅读页——推理/对话引擎、以及访客会话——包括阅读页上的 AskAboutThis(早先的 FloatingChatDock 已移除,1d9500acd,2026-08-16)。(每条旅程的细节记录在那份文档里;本 chain 不重复陈述。)
L3 · 设计决策
- 角色框架——访客的规则与人设来自在代码签发时冻结的 RoleSnapshot;愿景中的"四个应用"其实是同一份语料库之上的角色配置。
- 检索——corpus-retrieval:Meilisearch 词法索引(Postgres FTS 作退路)加树形导航;刻意不用向量检索(相关性 = 主人自己建立的链接)。图遍历也已落地,但不是这里写的那种有界深度 BFS —— 它是
corpus_links,一个1 跳的 op,返回{outgoing, backlinks},要不要再往下走由 agent 自己决定(对某个邻居再调一次)。BFS 是错的心智模型:相关性就是那些链接,所以深度是一个阅读决定,不是一个查询参数。"把图线性化"现在在检索层也成立了,不只是数据层。 - 依据(Grounding)——引用以
grounding_refs的形式随落库的那一轮一起存(Citation VO 与消息行原子写入,backend/internal/routes/public/agent_turn.go:205、conversation/ops/conversations_shape.go:85),在对话记录里渲染成 CitationsList(app/src/components/visitor/ChatTranscript.tsx);原来的chat.show_groundingop 随 dispatcher 重构一起没了(5bd5ed95f,2026-08-01)。 - 循环终止——force-final-answer:带
ReturnDirectly的ask_visitor结束循环。 - 结果呈现面——ui-cards(
ui://卡片,用于 corpus_search/list、摘要、日程时段)。 - 入口中立——entry-agnostic-agent:聊天入口只是中立启动边界的众多消费者之一。
L4 · 工程实现
backend/internal/conversation/inference——eino ADK 循环(Anthropic 原生 / OpenAI 兼容适配器);SSE 代理也在这里实现(unbuffered-sse-passthrough)。backend/agentcore——BuildVisitorAgent(driver, input)(visitor_build.go:50),启动接缝所在处。- prompts——
visitor-header片段(backend/internal/owner/entity/prompt_fragments.go,在conversation/usecase/visitor_chat_prompt.go里组装);part_ids+ hash 是漂移检测仪(system-prompt-hash-regression),钉住组装后提示词的身份。 mcp-servers/retrieval——八个工具,corpus_search / read / list / links / map / resolve / peek / grep(main.go:39-46),运行在沙盒中,通过 capsocket 访问宿主数据(隔离,一条窄套接字)。backend/internal/infra/session——visitor_session、query_queue.go。app/src/lib/page/use-chat.ts、use-chat-session.ts——薄的 SSE 消费端;ChatRoom/ChatTranscript/AskAboutThis组件;SDK 的CorpusWidget带 subtree / sort / limit 查询语言(113ba6a1a,2026-09-06),让 microsite 能内联展示语料。
L5 · 验证
E2e 规格标签(记录于 features-and-journeys 中):[✓ public-page]、[✓ byoai-chat]、[✓ visitor-chat-permissions-deny],加上 visitor-chat 套件;eval-harness 通过 EvalDriver 驱动同一条真实循环(golden/插件/检索组装 + 启动测试)。
现状与缺口
循环、人设冻结、依据呈现面、卡片都已落地——这条 chain 过去等着的两个面也落地了:爬取面(corpus_links 沿 note_refs 走,mcp-servers/retrieval/main.go:42;corpus_grep 作为永不漏的通道;corpus_search 在分词器看不见查询时会明说,bd45353f4)和渲染面(阅读页上的 KaTeX / Mermaid / callout / TikZ,rendering-engines)。"根据你已链接的思考来作答"现在是对 owner 链接的一次真正遍历,不再是文本上的 FTS(corpus-retrieval)。仍然单薄的不是机制而是度量:质量由 eval-harness 离线检查,不在活的循环上(eight-controls-applied)。