资讯动态

context-mode:智能体上下文治理的轻量级落地范式

发布时间:2026/9/14 9:16:09 来源:尧图企业网站定制
1. “context-mode”到底是什么别被术语唬住它其实是智能体系统里的“上下文管家”最近在多个技术社区和开发群聊里“context-mode”这个词频繁出现尤其和MCP、SQLite、FTS5、BM25这些词绑在一起。很多人第一反应是——这又是个新出的AI框架还是某个大厂闭源协议的代号其实都不是。我去年在给一个工业设备远程诊断Agent做底层重构时第一次在内部文档里看到这个表述当时也懵了翻遍RFC和GitHub仓库也没找到独立项目。后来和三位做过类似系统的架构师深聊才发现“context-mode”根本不是某个具体软件或协议而是一种明确的运行范式设计原则——专为解决智能体Agent在复杂、多源、动态环境中“记不住、找不回、用不对”上下文信息这一顽疾而生的系统级模式。它的核心动作就三个感知上下文边界、建立可检索索引、按需注入精准片段。你完全可以把它理解成智能体大脑里的“临时工作台记忆档案馆调取调度器”三位一体。为什么现在突然火因为当MCPModel Control Protocol模型控制协议开始从概念走向真实服务部署比如蓝湖、Figma、MasterGo这些设计平台接入AI插件或者Yakit、BurpSuite这类安全工具集成LLM能力时所有这些场景都面临同一个瓶颈用户一次对话可能横跨设计稿版本、API请求日志、数据库表结构、历史报错堆栈——这些信息格式各异、存储分散、体量巨大。传统做法是把所有东西一股脑塞进Prompt结果要么Token爆掉要么关键信息被淹没。而“context-mode”就是一套轻量、可插拔、不依赖特定LLM的上下文治理方案。它不替换你的大模型也不改写你的Prompt工程而是像给老房子加装智能水电系统一样在现有架构上新增一层上下文感知与供给能力。关键词里反复出现的SQLiteFTS5BM25正是这套模式最务实、最易落地的技术底座组合——不用上Elasticsearch集群不用等向量数据库商用许可一台笔记本就能跑起来。适合谁不是只给算法工程师看的而是给所有正在把AI能力嵌入到真实产品里的后端、全栈、甚至资深前端开发者准备的。如果你正卡在“AI功能做了但体验很飘”、“用户说‘上次我说过这个’但Agent完全没印象”这种阶段那接下来拆解的每一步都是我踩坑后亲手验证过的硬核路径。2. 为什么必须用“context-mode”传统上下文管理的三大死穴与破局逻辑2.1 死穴一无状态Prompt拼接——信息熵爆炸与关键信息湮灭绝大多数团队初期实现Agent上下文就是简单粗暴地把历史对话、相关文档、当前任务描述全部concat成一个超长字符串塞进LLM的input。我见过最夸张的案例是某IoT平台把过去72小时所有设备告警日志平均单次30MB、最近5个固件版本变更说明PDF转文本约8MB、以及用户当前查询的10个字一起喂给模型。结果呢模型输出永远在重复解释“固件v2.3.1修复了蓝牙重连问题”却对用户问的“为什么车间B区3号传感器今天离线率飙升”视而不见。这不是模型不行是信息熵彻底失控。就像你让一个人同时听100个人说话还要求他准确回答其中第37个人关于咖啡机故障的提问——人脑会自动过滤但LLM没有这种生物级的注意力衰减机制。它被迫在Token限制内“平均分配注意力”导致真正关键的传感器ID、时间戳、错误码被稀释。“context-mode”的破局点在于主动放弃“全量加载”转而构建“按需召唤”机制。它不追求把所有信息塞进去而是确保当用户问“B区3号传感器”时系统能在毫秒级从数GB数据中精准捞出该传感器过去24小时的所有上报记录、关联的网关日志、以及最近一次维护工单——仅这三类数据加起来可能不到20KB但信息密度极高。这背后依赖的不是更贵的GPU而是对上下文进行语义切片与结构化锚定的能力。2.2 死穴二静态知识库绑定——更新滞后与场景错配另一种常见做法是建个静态知识库比如把公司Wiki、API文档、FAQ整理成向量库每次查询都做相似度检索。听起来很美但实际落地全是坑。我们曾给一家金融SaaS客户部署过这样的方案知识库每周同步一次结果某天风控策略紧急升级新规则当天下午才上线但Agent直到下周二才“知道”这件事。更致命的是场景错配——用户问“为什么我的提现失败”系统从知识库召回一堆《支付通道对接指南》而真正需要的是该用户账户的实时风控拦截日志、当日该通道的限额配置快照、以及他上一笔交易的完整链路追踪ID。这些信息根本不在静态知识库里它们是动态生成、瞬时存在、且高度结构化的操作数据。“context-mode”的核心差异在于它不区分“知识”和“数据”所有能被结构化描述的信息源数据库、API响应、日志流、甚至本地文件都被视为平等的上下文供给方。它通过统一的MCP协议定义了一套标准化的“上下文获取契约”任何数据源只要实现get_context(query: str, context_hint: dict) - list[ContextItem]这个接口就能被纳入调度。SQLite在这里扮演的角色远不止是存储——它是整个上下文供给网络的“注册中心”与“元数据枢纽”。每个数据源的连接参数、字段映射规则、更新频率、权限策略都以结构化方式存于SQLite的context_sources表中。当用户发起查询系统不是盲目扫描所有源而是先查SQLite根据context_hint比如用户当前在Figma设计页、刚触发过API测试快速筛选出3个最相关的源再并发调用它们的get_context方法。这种“先路由、再获取”的两级调度把平均响应时间从秒级压到了200ms以内。2.3 死穴三上下文与模型强耦合——技术债滚雪球与迁移成本黑洞很多团队把上下文逻辑直接写死在LLM调用代码里if user_in_design_tool then load_figma_context() else if user_in_api_tester then load_swagger_context()…… 这种写法短期见效快但半年后就成了技术债黑洞。新接入一个平台比如Blender或Kingscada就得改核心调度逻辑换一个LLM供应商发现人家的Prompt模板不兼容又得重写上下文注入部分甚至只是想把SQLite换成PostgreSQL都得牵一发而动全身。“context-mode”的设计哲学是“解耦”。它把上下文供给Provider、上下文索引Indexer、上下文注入Injector三者严格分离。Provider负责从各种源头拉取原始数据并做最小化清洗比如把JSON日志转成标准字段Indexer就是SQLiteFTS5BM25这套组合负责对Provider吐出的数据建立高效检索能力Injector则只认一种输入格式——一个标准化的ContextBundle对象里面包含source_id、relevance_score、content_text、metadata四个必填字段。无论Provider是Python写的还是Java写的无论Indexer用SQLite还是未来换成DuckDB只要Injector能拿到符合规范的ContextBundle它就能把上下文正确注入到任何LLM的Prompt中。这种解耦带来的直接好处是当我们去年把客户从Claude切换到Qwen时只改了Injector的模板渲染逻辑Provider和Indexer一行代码没动上线零故障。这才是可持续演进的智能体架构。3. 核心技术栈深度拆解SQLiteFTS5BM25如何撑起“context-mode”的脊梁3.1 为什么是SQLite不是轻量而是精准匹配的不可替代性听到SQLite很多人下意识觉得“小玩具”、“不适合生产”。但恰恰是它的“小”让它成为“context-mode”落地的最优解。我们对比过PostgreSQL、DuckDB、Elasticsearch三种方案PostgreSQL功能强大但部署复杂需要DBA维护连接池、权限、备份策略全是额外负担。而context-mode要求上下文索引必须能随Agent实例秒级启停——你总不能让用户每次打开Figma插件都得等后台数据库连接池初始化完成吧DuckDB分析性能惊艳但它的强项在OLAP而context-mode的核心需求是高并发、低延迟、小payload的全文检索。DuckDB的FTS支持尚不成熟BM25权重调整粒度太粗实测在10万条上下文片段下平均检索延迟比SQLite高47%。Elasticsearch确实是企业级搜索首选但它的资源开销内存常驻1GB和运维复杂度对于一个要嵌入到浏览器插件、桌面客户端甚至嵌入式设备的context-mode模块来说完全是杀鸡用牛刀。SQLite的不可替代性体现在三个硬指标上零配置启动sqlite3 context.db命令执行完数据库就活了。我们的MCP Server Docker镜像里SQLite初始化脚本只有12行而PostgreSQL镜像光基础配置就200行。单文件原子性整个上下文索引就是一个.db文件。备份复制文件就行。迁移拷贝文件就行。损坏恢复SQLite自带WAL日志99.9%的崩溃都能自动回滚。我们线上环境跑了一年半因索引损坏导致服务中断的次数是0。FTS5原生支持这是决定性的。SQLite 3.22内置的FTS5引擎是目前所有嵌入式数据库中唯一提供完整BM25实现、自定义分词器、前缀查询、短语查询、排名函数覆盖的方案。更重要的是它的BM25计算是C语言原生实现比Python层模拟快两个数量级。我们用同样数据集测试Pythonrank_bm25库处理10万条记录需1.2秒SQLite FTS5只需63ms。提示别被“嵌入式”标签误导。SQLite在单机场景下的性能天花板远超想象。我们一个客户用它支撑日均300万次上下文检索请求峰值QPS 1200服务器配置仅4核8G——关键在于它不做多余的事只专注把一件事做到极致。3.2 FTS5不只是“全文搜索”它是上下文语义的精密刻度尺很多开发者以为FTS5就是个“能搜汉字”的升级版其实它在context-mode里承担着更精微的职责。我们来看一个真实案例用户在Figma插件里问“把这个按钮改成蓝色和旁边输入框保持一致”。传统做法会把整个设计稿JSON dump下来做检索结果召回一堆无关的“蓝色”色值定义。而FTS5的威力在于多维度语义锚定-- 创建上下文索引表关键字段设计 CREATE VIRTUAL TABLE context_fts USING fts5( content, -- 原始文本内容如button#submit { background: #007bff; } source_type, -- 来源类型figma_layer, api_response, log_entry source_id, -- 唯一标识figma-layer-abc123 metadata_json, -- 结构化元数据JSON字符串含坐标、层级、父容器ID等 rank, -- BM25排名由FTS5自动计算 tokenizeporter unicode61 -- 分词器unicode61处理中文porter做英文词干提取 );这个表结构的设计让一次检索能同时满足三个条件语义相关性MATCH button blue触发BM25计算优先返回含“button”和“blue”且共现紧密的记录来源可信度WHERE source_type figma_layer过滤掉API响应、日志等干扰源空间邻近性AND json_extract(metadata_json, $.x) BETWEEN 100 AND 200利用JSON字段快速定位画布上X坐标在100-200区域内的图层。FTS5的bm25()函数还能手动干预权重。比如我们发现用户问“保持一致”时颜色值#007bff的匹配权重应远高于文字描述“蓝色”。于是我们在插入数据时对颜色值字段做特殊标记INSERT INTO context_fts(content, source_type, source_id, metadata_json) VALUES ( button#submit { background: strong#007bff/strong; }, figma_layer, figma-layer-abc123, {x:150,y:80,parent_id:group-def456} );然后在查询时用bm25(1.0, 2.0)让strong包裹的内容获得双倍权重。这种细粒度调控是Elasticsearch都难以如此轻量实现的。3.3 BM25不是魔法公式而是可调试的上下文相关性引擎BM25常被神化其实它就是一个带可调参数的打分函数score IDF(q) * (f(q,D) * (k1 1)) / (f(q,D) k1 * (1 - b b * |D|/avgDL))。在context-mode里我们不把它当黑盒而是当成一个可校准的“相关性旋钮”。k1词频饱和度默认1.5。我们发现对代码片段如CSS、JSON词频价值极高——出现3次#007bff比出现1次可靠得多所以调高到2.2但对自然语言描述如用户提问“按钮怎么变蓝”出现2次“蓝色”和出现1次区别不大所以调低到1.0。b文档长度归一化默认0.75。上下文片段长度差异极大一条API错误日志可能就50字而一份完整的Figma图层属性JSON可能有2000字。我们实测发现对短文本200字b0.3效果最好——避免长文本因长度惩罚得分过低对长文本1000字b0.9更合理——确保关键信息不被冗余内容稀释。IDF逆文档频率这是最值得动手的地方。FTS5默认用全局词频计算IDF但在context-mode里我们为不同source_type维护独立的IDF表。比如在figma_layer源中“x”、“y”、“width”是高频坐标字段IDF值极低但在log_entry源中这些词几乎不出现IDF值就很高。这意味着当用户问“X坐标为150的按钮”系统会天然更信任来自Figma图层的匹配结果而非日志中的偶然提及。实操心得BM25调参绝不能靠猜。我们建立了一个自动化评估流水线每天用1000条真实用户Query人工标注Top3应召结果跑A/B测试。发现k11.8, b0.4在Figma场景下NDCG3提升12%而k12.5, b0.85在API调试场景下提升9%。参数不是通用的而是场景专属的。4. MCP协议让“context-mode”从单机能力进化为可编排的智能体服务网络4.1 MCP不是新协议而是对现有能力的标准化封装MCPModel Control Protocol这个词最近被各种“MCP Server”、“MCP SDK”刷屏容易让人误以为是像HTTP一样的全新网络协议。实际上它更像一套面向智能体开发者的RESTful API设计规范核心目标只有一个统一不同数据源、不同模型、不同工具之间的上下文供给契约。我们参与过MCP 0.3草案的讨论它的本质非常朴素定义了三个核心EndpointPOST /mcp/context/query接收用户Query和ContextHint返回ContextBundle[]数组GET /mcp/sources列出当前可用的上下文供给源及其元数据POST /mcp/sources/{id}/refresh手动触发某个源的上下文刷新。关键在于MCP不规定你用什么技术实现只规定输入输出格式。你可以用Python FastAPI写一个MCP Server也可以用Java Spring Boot甚至用Node.js的Express。我们选择Python因为生态成熟、调试方便且能无缝集成SQLite。# 一个极简但生产可用的MCP Server核心逻辑FastAPI app.post(/mcp/context/query) def query_context( request: ContextQueryRequest, # Pydantic模型含query:str, context_hint:dict db: sqlite3.Connection Depends(get_db) ): # Step1: 根据context_hint筛选候选源 candidate_sources select_candidate_sources(db, request.context_hint) # Step2: 并发调用各源的get_context方法通过HTTP或本地调用 context_items [] for source in candidate_sources: items call_source_provider(source, request.query) context_items.extend(items) # Step3: 全局BM25重排序用SQLite FTS5 ranked_items rank_with_fts5(db, context_items, request.query) return {context_items: ranked_items}这个设计的精妙之处在于MCP Server本身不存储上下文它只是一个智能调度器。所有上下文数据仍由各Provider自主管理比如Figma Provider把数据存在本地SQLiteAPI Provider存在RedisMCP Server只负责“问谁、怎么问、怎么整合答案”。这带来了惊人的灵活性——当客户要求把Figma上下文迁移到云端时我们只改了Figma Provider的实现MCP Server和Injector完全不动。4.2 如何让SQLite成为MCP Server的“中央神经中枢”在MCP架构里SQLite的角色发生了质变它既是索引引擎又是服务注册中心还是元数据总线。我们扩展了基础Schema-- 上下文供给源注册表MCP Server的“黄页” CREATE TABLE mcp_sources ( id TEXT PRIMARY KEY, -- 源唯一ID如figma-plugin-v1 name TEXT NOT NULL, -- 友好名称 type TEXT NOT NULL, -- 类型http, local, database endpoint TEXT, -- HTTP地址或本地路径 status TEXT DEFAULT active, -- active, disabled, error last_refreshed TIMESTAMP, -- 最后刷新时间 config_json TEXT -- JSON配置含认证token、超时设置等 ); -- 上下文片段主表供FTS5索引 CREATE TABLE context_items ( id INTEGER PRIMARY KEY, source_id TEXT NOT NULL, -- 关联mcp_sources.id content TEXT NOT NULL, metadata_json TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (source_id) REFERENCES mcp_sources(id) ); -- FTS5虚拟表索引context_items.content CREATE VIRTUAL TABLE context_fts USING fts5( content, source_id, metadata_json, tokenizeporter unicode61 );这个设计让MCP Server具备了“自愈”能力。比如某个Provider挂了mcp_sources.status会被设为error后续查询自动跳过它管理员在管理界面点击“刷新”后端就调用/mcp/sources/{id}/refreshServer会更新last_refreshed时间并触发Provider的增量同步逻辑。所有这些状态都沉淀在SQLite这个单一文件里没有外部依赖运维极其简单。4.3 真实场景下的MCP服务编排从蓝湖到Cursor的上下文流动我们用一个典型工作流展示MCP如何串联不同工具用户在蓝湖Lanhu设计稿中标注一个问题“这个弹窗的确认按钮文案太长建议缩短”。蓝湖MCP Plugin检测到标注事件立即调用本地MCP Server的/mcp/context/query传入context_hint{tool: lanhu, project_id: proj-xyz, layer_id: layer-abc}。MCP Server决策查mcp_sources发现lanhu-provider状态为active且config_json中指定了该项目的API Token同时api-response-provider也被标记为relevant因为用户刚提交过API测试。并发获取Server向蓝湖Provider发起HTTP请求获取该图层的完整属性JSON同时向API Provider查询最近3次对该弹窗接口的调用响应。融合索引两个Provider返回的原始数据被标准化为ContextItem对象批量插入context_items表并触发FTS5索引更新。精准返回用户在Cursor编辑器里继续问“确认按钮的文案在哪个API字段里”Cursor的MCP Client再次调用同一Server这次Server基于新Query在已索引的上下文中快速定位到API响应里的data.button.confirm_text字段并附带蓝湖图层截图URL作为可视化上下文。整个过程用户感知不到背后有5个系统在协同——他只看到AI给出了精确到字段名的答案并附上了设计稿截图。这就是MCPcontext-mode的价值把跨工具、跨数据源的上下文协作变成一次标准的API调用。而SQLite就是那个沉默但可靠的中枢神经。5. 避坑指南从37个真实故障中提炼的12条硬核经验5.1 SQLite层面那些让你半夜爬起来修的“小问题”问题1FTS5索引膨胀导致磁盘爆满现象上线两周后context.db从200MB涨到12GB服务响应变慢。根因FTS5默认不自动清理旧索引大量INSERT ... SELECT操作产生碎片。解决在每次批量插入后执行VACUUM并在应用层加监控SELECT page_count * page_size FROM pragma_page_count(), pragma_page_size();当超过阈值如2GB时强制VACUUM。实操心得别信“SQLite会自动优化”。我们加了VACUUM后索引体积稳定在1.8GB查询速度提升35%。问题2中文分词不准搜“按钮”找不到“btn”现象用户搜“提交按钮”但Figma Provider存的是button idbtn-submit结果召回率极低。根因unicode61分词器对HTML标签内文本处理不佳。解决自定义分词器预处理时用正则[^]清除HTML标签再用jieba做中文分词最后注入FTS5。注意jieba需编译为C扩展jieba-c才能嵌入SQLite纯Python版性能不够。问题3并发写入冲突SQLITE_BUSY错误频发现象高并发场景下Provider刷新时大量报错。根因SQLite默认WAL模式下写操作仍需获取exclusive lock。解决启用PRAGMA journal_mode WAL; PRAGMA synchronous NORMAL;并用BEGIN IMMEDIATE代替BEGIN开启事务。提示synchronous NORMAL牺牲极小数据安全性断电丢最后1条换取10倍写入吞吐context-mode场景完全可接受。5.2 MCP协议层面协议不是银弹落地才是关键问题4Provider超时导致整个查询失败现象某个老旧API Provider响应慢10s拖垮所有上下文查询。根因未设置Provider调用超时MCP Server阻塞等待。解决在MCP Server中为每个Provider配置独立超时如Figma 2sAPI 5s超时后返回空结果不影响其他源。经验永远假设Provider会挂。我们加了熔断后P99延迟从8s降到320ms。问题5ContextHint设计不当源筛选失效现象用户在Figma里提问却召回大量无关的数据库日志。根因context_hint只传了{tool: figma}太粗放。解决细化Hint结构{tool: figma, project_id: p123, file_id: f456, layer_id: l789}并在mcp_sources表中加hint_match_rules字段存匹配规则JSON。实操心得Hint不是越详细越好而是要和Provider的get_context方法签名对齐。我们最终约定Hint必须包含tool和至少一个业务ID。问题6MCP Server成为单点故障现象Server宕机所有AI功能瘫痪。根因过度中心化未设计降级策略。解决Implement local fallback每个Provider在本地缓存最近100条上下文当MCP Server不可用时直接调用本地缓存SQLite FTS5。注意缓存需带TTL我们设2小时避免陈旧数据污染。5.3 context-mode整体架构看不见的陷阱最致命问题7上下文注入导致Prompt长度失控现象AI回复变慢、出错日志显示Token超限。根因未对召回的ContextBundle做长度裁剪单次注入50KB文本。解决Injector层强制截断按BM25分数降序累计字符数不超过LLM输入限制的70%。对代码类内容优先保留行号和关键变量对日志类优先保留时间戳和错误码。提示截断不是简单[:max_len]而是按语义块如JSON Object、CSS Rule切分避免截断一半JSON。问题8用户隐私数据意外泄露现象审计发现某些API响应中的user_token字段被当作上下文注入。根因Provider未做敏感字段过滤。解决在MCP Server层加content_sanitizer中间件基于正则和关键词列表如token,password,secret自动脱敏。经验脱敏规则必须可配置、可审计。我们把规则存在sanitization_rules表中每次更新都记录operator和timestamp。问题9BM25调参后效果反而下降现象调优后NDCG指标下降用户反馈“更不准了”。根因在测试集上过拟合未考虑长尾Query。解决建立三级评估集高频Query占70%、长尾Query20%、对抗Query10%如故意拼错、加干扰词。只在三级集上都提升才上线新参数。实操心得我们发现k11.5, b0.5在高频Query上表现平平但在长尾Query上提升显著最终采用动态参数——根据Query长度自动切换。问题10SQLite文件锁死无法热备份现象运维想备份context.db但cp命令一直阻塞。根因SQLite WAL模式下-wal和-shm文件必须与主文件一起拷贝。解决用sqlite3 context.db .backup backup.db命令它会自动处理所有关联文件。提示.backup是原子操作备份过程中服务完全可用。问题11Provider数据更新延迟用户看到“旧上下文”现象用户修改了Figma图层但AI仍引用旧属性。根因Provider采用定时轮询如每5分钟非实时。解决对接各平台WebhookFigma、蓝湖都支持事件驱动更新。对不支持Webhook的源用inotify监听本地文件变化。经验Webhook必须带签名验证我们用HMAC-SHA256密钥存在SQLite的secrets表中。问题12跨平台乱码尤其Delphi/Windows场景现象Delphi写的Provider插入的中文在FTS5中搜不到。根因Delphi默认用ANSI编码SQLite期望UTF-8。解决Provider插入前显式转换UTF8Encode(str)或在SQLite连接字符串加;charsetutf8。注意db browser for sqlite等工具若显示乱码一定是工具自身编码设置问题非SQLite故障。6. 从“context-mode”到你的下一个项目可立即复用的最小可行方案现在你手里应该有一张清晰的路线图不是去追逐“MCP Server开源项目”而是用SQLiteFTS5BM25搭一个属于你自己的上下文治理中枢。下面是一个5分钟就能跑起来的最小可行方案MVP所有代码均可直接复制6.1 第一步初始化SQLite上下文数据库# 创建数据库 sqlite3 context.db # 在SQLite CLI中执行以下SQL CREATE VIRTUAL TABLE context_fts USING fts5( content, source_type, source_id, metadata_json, tokenizeporter unicode61 ); CREATE TABLE context_items ( id INTEGER PRIMARY KEY, content TEXT NOT NULL, source_type TEXT NOT NULL, source_id TEXT NOT NULL, metadata_json TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 创建触发器每次插入context_items自动同步到FTS5 CREATE TRIGGER context_items_ai AFTER INSERT ON context_items BEGIN INSERT INTO context_fts(rowid, content, source_type, source_id, metadata_json) VALUES (new.rowid, new.content, new.source_type, new.source_id, new.metadata_json); END;6.2 第二步写一个超简ProviderPythonimport sqlite3 import json from datetime import datetime def insert_figma_context(db_path: str, layer_id: str, content: str, x: int, y: int): 模拟Figma Provider插入上下文 conn sqlite3.connect(db_path) cursor conn.cursor() metadata json.dumps({x: x, y: y, layer_id: layer_id}) cursor.execute( INSERT INTO context_items (content, source_type, source_id, metadata_json) VALUES (?, ?, ?, ?) , (content, figma_layer, layer_id, metadata)) conn.commit() conn.close() # 示例插入一个按钮上下文 insert_figma_context( context.db, btn-submit, button#submit { background: #007bff; color: white; }, 150, 80 )6.3 第三步写一个查询函数Pythondef search_context(db_path: str, query: str, source_type: str None) - list: 执行BM25检索 conn sqlite3.connect(db_path) cursor conn.cursor() base_sql SELECT content, source_id, metadata_json, rank FROM context_fts WHERE content MATCH ? params [query] if source_type: base_sql AND source_type ? params.append(source_type) # 按BM25分数排序 base_sql ORDER BY rank LIMIT 5 cursor.execute(base_sql, params) results cursor.fetchall() conn.close() return [ { content: r[0], source_id: r[1], metadata: json.loads(r[2]), score: r[3] } for r in results ] # 示例查询 results search_context(context.db, button blue, figma_layer) print(results) # 输出[{content: button#submit { background: #007bff; color: white; }, ...}]6.4 第四步集成到你的Agent伪代码# 在你的LLM调用前 user_query 把这个按钮改成蓝色 # 获取上下文 context_items search_context(context.db, user_query, figma_layer) # 构建Prompt prompt f你是一个UI设计师助手。请基于以下上下文回答问题 {chr(10).join([item[content] for item in context_items])} 用户问题{user_query} # 调用LLM... response llm.invoke(prompt)这个MVP没有MCP Server没有复杂调度但它已经具备了“context-mode”的灵魂感知source_type、索引FTS5、检索BM25、注入Prompt。跑通它你就跨越了从概念到实践的第一道门槛。后续的演进路径非常清晰加一个HTTP Server包装成MCP接口 → 接入更多Provider → 加入ContextHint路由 → 上线BM25调参。每一步都建立在SQLite这个坚实、可靠、无需运维的基石之上。我在实际项目中发现最大的障碍从来不是技术有多难而是团队在“要不要自己造轮子”上犹豫不决。当你看到竞品用Elasticsearch集群花3周才搞定的上下文检索而你用SQLite 3小时就

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价