little-coder技能卡片与算法知识注入:如何给9.7B小模型装上"外挂小抄"
【免费下载链接】little-coderA harness optimized to smaller LLMs项目地址: https://gitcode.com/gh_mirrors/li/little-coder
little-coder 是一个专为小模型打造的本地编码智能体框架,它的核心思路不是让模型"变聪明",而是给模型按需发"小抄":每一轮对话自动挑选最相关的技能卡片(工具用法卡)与算法知识卡注入上下文。正是这套"知识注入"外挂,让 9.7B 的 Qwen3.5-9B 在 Aider Polyglot 基准上做到 45.6%,是同模型原生脚手架(19.1%)的 2.4 倍。下面用 5 分钟讲清楚这套机制是如何运作的。
📊 先看结果:同一模型,小抄带来 2.4 倍差距
上面是白皮书中的核心对比:同一个 9.7B 模型(Qwen3.5-9B),配上 little-coder 的脚手架后解出45.6%的题目,而同一模型的普通编码智能体只有19.1%——甚至逼近了 gpt-4.5-preview(44.9%)这类前沿大模型的成绩。整套实验只跑在一台消费级笔记本上(RTX 5070 Laptop,8GB 显存),没有任何云端推理。
结论先摆在这:模型不变,只改"脚手架",性能翻倍。这个脚手架的零件,就是下面要讲的技能卡片。
🗂️ 技能卡片是什么:30 份"即插即用"的 Markdown 小抄
little-coder 把所有"外挂知识"都写成了纯 Markdown 文件,放在 skills/ 目录下,共 30 份,分三类:
| 目录 | 数量 | 管什么 |
|---|---|---|
| skills/tools/ | 14 张 | 工具使用卡:read/edit/bash/dispatch等工具的正确姿势 |
| skills/knowledge/ | 13 张 | 算法小抄:动态规划、二分查找、双指针、回溯等 |
| skills/protocols/ | 3 份 | 研究协议:先取证再回答、任务分解等工作流 |
每张卡片就是一个很小的 md 文件,头部带一段"名片"元数据(frontmatter),声明它是给哪个工具的、命中哪些关键词、以及注入它要花多少token 成本。以 skills/knowledge/dynamic_programming.md 为例:成本 110 token,挂了dp、memoize、knapsack、longest subsequence等 13 个关键词,正文只有一小段"何时用动态规划"的判据。
这正是小模型友好的设计:单张卡只有几十到一百多 token,模型看得懂、读得起,人也能直接读文件做审计。
🎯 算法知识注入:按题打分,只送最相关的小抄
光有卡片库不够,关键是每一轮该送哪几张。.pi/extensions/knowledge-inject/ 这个扩展在每轮开始时装了个"评分器",流程只有三步:
- 打分:把你的题目文字和每张卡的关键词表逐一比对——单个词命中 +1.0 分,双词短语命中 +2.0 分
- 过滤:得分低于 2.0 的卡片直接出局,避免"什么都送"
- 预算装箱:在约 200 token 的预算内,按分数从高到低挑选,打包成一个
## Algorithm Reference块
举个例子:题目里出现 "find the minimum cost" 和 "number of ways",就会命中 dynamic_programming.md 的关键词,DP 小抄自动送达;而提到 "sorted"、"sliding window" 的题目则会收到 two_pointers.md;组合生成类题目收到 recursion_backtracking.md。卡片库里甚至有树重根(tree re-rooting)这种相当细的技巧(tree_rerooting.md)。
注意定位:项目给模型的系统提示 AGENTS.md 里明确写着,这些小抄是"小而针对性的学习辅助",模型应当信任、但不许照本宣科。
🛠️ 工具技能卡片:按"错误 > 最近 > 意图"三优先级自动挑卡
算法卡管"思路",工具卡管"手"。.pi/extensions/skill-inject/ 负责在约 300 token 预算内挑工具卡,优先级顺序很有讲究:
- 错误恢复:上一个工具调用失败了,就先把那个工具的卡送上去。比如
edit报"String not found",edit.md 卡片里专门写了"怎么修":重新read拿准空白字符、补上下文让匹配唯一,而不是退回write重写整个文件 - 最近性:最近 8 次调用过的工具,卡片优先入选
- 意图猜测:从提示词猜你接下来要干什么——"read / fix / replace" 指向读写类工具,"train / build / serve" 这类长跑任务则指向 shell_start.md 后台任务卡
用户也可以接管这个选择器:输入/skills查看当前加载了哪些卡、各花多少 token;/skills edit强制钉住某一张;/skills off恢复自动选择。想深入了解某张卡的写法,直接看 skills/tools/read.md 这类文件即可。
💡 关键细节:小抄放在对话末尾,而不是系统提示
为什么不干脆把所有知识塞进系统提示?因为对本地推理来说,系统提示一变,KV 缓存前缀就作废,服务器得把整个对话历史重新算一遍——长对话下这是致命的浪费。
little-coder 的解法(README.md 的故障排查一节有完整记录)是:把技能卡与知识块作为一条位于对话末尾的普通消息发送,而不是追加到系统提示。这样请求前缀保持逐字节一致,缓存命中率能稳定在 99.8% 左右,终端状态栏里的CH字段可以直接验证。
还有一层"防重复"机制:如果这一轮挑出的小抄和上一轮完全相同,就不重复发送——反正上一份还留在对话里,重发只会白白烧掉小模型宝贵的上下文窗口。
📈 逐语言成绩:六种语言全面领先
分语言看差距同样稳定:Python 52.9%、Java 52.1%、C++ 50.0%、JavaScript 46.9%、Go 38.5%、Rust 30.0%,每种语言都是同模型基线的两倍以上。对一个跑在 8GB 显存上的 9.7B 模型来说,这不是某道题的运气,而是系统性的抬升。
🧭 自己动手:从哪里读起
- 完整文档:README.md —— 安装、本地模型部署、模型配置都在这里
- 系统提示:AGENTS.md —— 定义了模型"每一轮会收到哪些指导块"
- 基准测试细节:docs/benchmark-baseline-aider.md
- 卡片库本体:skills/ —— 30 份全是纯 Markdown,可以直接通读
小结
给小模型装"外挂小抄"的方法论,其实就三条:
- 知识拆小:把工具和算法知识写成几十 token 的小卡片,标注关键词与成本(skills/)
- 按需选择:用简单的打分 + 预算规则,每轮只送最相关的卡片(.pi/extensions/knowledge-inject/ 与 .pi/extensions/skill-inject/)
- 注入位置聪明:放在对话末尾、不破坏 KV 缓存、内容不变就不重发
模型一个参数都没动,每轮多花两三百 token 的"小抄",换来 2.4 倍的解题率——这就是 little-coder 想证明的事:脚手架工程,本身就是一种能力。
【免费下载链接】little-coderA harness optimized to smaller LLMs项目地址: https://gitcode.com/gh_mirrors/li/little-coder
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考