数据截至 (上游 commit 358c16bbc6d6)
数据入口与缓冲区(为什么先攒再处理)
30 秒导读: 你往 Memobase 塞的每一段对话(blob),不会立刻触发一次昂贵的 LLM 抽取。它先原样落进数据库,再挂进一个按用户分组的缓冲区;只有当这个用户攒够了(token 超过阈值),系统才把这一批一次性喂给记忆管线。这样把"每次调 LLM 的固定成本"摊薄到很多条对话上——这就是本章要讲清的省钱设计。
本章只讲数据怎么进来、怎么被缓冲、批处理怎么省钱;真正把一批 blob 变成用户画像的三次 LLM 调用留给 02-extract-merge-pipeline.md。全景与阅读地图见 index.md。
1. 这是什么(零基础也能懂)
一句话定义: blob(二进制大对象在这里泛指"一段原始输入",主要是一段聊天记录)是 Memobase 的最小摄入单位;缓冲区(buffer)是一个按用户攒 blob 的暂存队列,攒够才批量处理。
它要解决的问题: 记忆系统的贵活儿是 LLM 抽取——从对话里提炼"这个用户喜欢什么、是谁"。如果每来一条消息就调一次 LLM,那 90% 的成本花在"启动一次 LLM 调用"的固定开销上,而 单条消息往往信息量很小。
直觉类比: 像拼车。一个人打车(每条 blob 单独处理)最贵;等同路的人凑一车再走(攒够一批再处理),每个人分摊的车费就低得多。缓冲区就是那个"等人上车"的站台。
用起来什么样: 调用方(SDK / HTTP)往某个 user_id 插入一段对话:
# 示意,非源码:一次 blob 插入
POST /api/v1/blobs/insert/{user_id}?wait_process=false
{
"blob_type": "chat",
"blob_data": {"messages": [
{"role": "user", "content": "我最近在学做意大利菜"},
{"role": "assistant", "content": "那你可以从番茄意面入手"}
]}
}
# 返回一个 blob id;至于要不要立刻抽取,由缓冲区攒够没决定
关键点:插入接口立即返回,是否真的跑 LLM,取决于这个用户的缓冲区是否被这条 blob 撑满。wait_process 决定"如果确实要处理,你是等它跑完(同步)还是让它在后台跑(异步)"。