上周 AI 给我写了一个小工具,7 个文件、190 行代码,跑起来是对的,输出也没问题。然后我卡在"要不要交给别人用"这一步。
卡住的原因不是它跑不通,是我讲不清里面有什么。有没有函数定义了却从来没人调用?某个判断条件写成 > 还是 >=,差的是二十块还是两百块?作者有没有留一句"这块回头再改"的记号?
一个文件一个文件贴进对话框问是不行的。问到第三个就断了:问"这个函数被谁调用",它答不上来,因为调用它的那个文件我没贴进去。
我把这件事换成了一个入库问题:把整个项目做成一个可以提问的知识库,然后按问题拿答案。阿里云百炼的知识库能力栈正好覆盖这条链路,我用一个 190 行的小项目把四层都走了一遍,下面是 10 月 20 号在我自己电脑上跑出来的记录。
能力栈的四层与对应命令
| 层次 | 职责 | 命令 | 我这次的读数 |
|---|---|---|---|
| 数据中心 | 文件注册与格式校验 | knowledge doc upload |
原样传 1.7 秒(成功 1 / 跳过 6),转格式后 3.8 秒(成功 7 / 跳过 0) |
| 索引 | 文档切片并建索引 | knowledge create --wait、knowledge doc list |
建库 7.4 秒,final_status: COMPLETED,7 条全部 FINISH |
| 问答服务 | 绑定库并对外提供问答 | knowledge service create --scene chat、knowledge chat |
服务状态 draft / 版本 beta,7 题耗时 5.0 到 48.8 秒 |
| 版本发布 | beta 转正式版 | knowledge service deploy、service get |
发布 1.3 秒,版本 1,状态 deployed,正式版对照 14.5 秒 |
四层之外还有回收:service delete、knowledge delete、file delete。这一轮我创建了 16 个云端资源,最后全部删净并逐项复核。
第一层 数据中心:格式约束在注册阶段
--file 收目录时会递归扫描,不支持的格式跳过并计入 skipped。我第一条命令把项目目录原样传上去:
bl knowledge doc upload --file ./demo-shop --output json
1.7 秒返回,退出码 0,files 只有 1 条 README.md,skipped 是 6 个 .py。

代码文件一个都没进数据中心,而退出码是 0。这是这一层最需要注意的行为:跳过是静默的,判定要落在返回体上,不能落在退出码上。
单独传一个只含代码文件的目录,会得到明确报错,退出码 2:
Error: No supported files found
Hint: Supported formats: .pdf .doc .docx .ppt .pptx .xls .xlsx .csv .md .txt .html .png .jpg .jpeg .bmp .gif
支持范围是文档、表格、图片,代码扩展名不在其中。另外两处报错给出的支持列表并不一致:目录里全是代码时提示 16 种,含 .csv;另一种服务端报错提示 31 种,含一批音视频格式但没有 .csv。这里只记录现象。
工程上的绕行是把代码包进 .md。每个 .py 建一个同名 .md,文件名当标题,代码原样进 python 围栏:
for f in demo-shop/*.py; do
n=$(basename "$f" .py)
{
echo "# $n.py"; echo; echo '```python'; cat "$f"; echo '```'; } > "shop-md/$n.md"
done
cp demo-shop/README.md shop-md/
7 个文件、5,519 字节,重传 3.8 秒,成功 7 / 跳过 0。源码零改动,只换容器。
第二层 索引:建库与状态复核
bl knowledge create --name aicodeqa1020 --description "demo-shop 项目源码问答" --doc-id <7 个 id> --wait
--wait 让命令轮询到导入任务终态再返回,7.4 秒拿到 final_status: COMPLETED。库名限制 1 到 20 字符且在工作空间内唯一。
注册成功不等于索引成功,所以再复核一次:
bl knowledge doc list --index-id <库 id>
7 条全部 code: FINISH、message: 索引构建成功,并给出各文档字符数:report 1393、discount 1257、main 969、orders 776、README 406、utils 361、config 357。
第三层 问答服务:beta 版即可调用
bl knowledge service create --name "aicodeqa-问答" --scene chat --index-id <库 id>
返回服务 id,agent_status: draft、agent_version: beta。draft 状态的 beta 版就能接问答调用,不必先发布,调试回路很短。从改扩展名到能问,我一共花了不到一分钟。
提问之前我先自己 grep 出 7 个问题的标准答案存好。没有标准答案的问答演示,等于让它自己给自己打分。
bl knowledge chat --agent-id <服务 id> --agent-version beta --message "apply_discount 这个函数被哪几个文件调用了?"

7 题全对。三处值得记:
第 1 题(跨文件调用点)答出三个文件,并注明"参考信息中未包含具体行号,故仅列出文件名"。它拿不到行号就明说,没有编一个凑格式。
第 4 题(死函数)找出 export_csv 和 vip_edge_report,并自行加了限定:"以上结论仅基于当前提供的代码切片进行静态分析。若项目存在其他未展示的测试脚本或外部模块,实际调用情况可能有所不同。"
第 6、7 两题是刻意下的套,材料里没有答案。它分别答"该项目没有单元测试覆盖率"和"无法得知"作者与上线时间。我用脚本扫了这两次回答的末段,一个百分号都没有,也没有任何具体日期。
第四层 版本发布:默认配置从哪来
bl knowledge service deploy --agent-id <服务 id> --version-desc "首次发布" --yes
bl knowledge service get --agent-id <服务 id>
发布 1.3 秒,版本号变成 1,状态 deployed。不带 --agent-version 再问同一题走正式版,14.5 秒,结论与 beta 一致。
service get 显示 Version 1 的配置是 policy: turbo、model: qwen3.6-plus、temperature: 0.7。这三个我全程没设过:建服务时只给了名字和库 id,其余走服务端默认值,命令行建服务没有对应参数,要调整得去控制台。接入前把这条记进依赖清单比较稳妥。
接入侧要自己处理的一件事:answer 字段
顶层只有 answer 和 request_id 两个键,而 answer 不是一句答案,它是一整条检索加推理的轨迹:先说共检索到 10 条相关切片,然后是切片原文(带文档名、正文、库 id、文件 id),接着是模型自己的思考过程,最后才是答案,且答案出现两遍。
| 题 | 耗时 | answer 字数 |
|---|---|---|
| 第 1 题 | 31.2 秒 | 9,167 |
| 第 4 题 | 48.8 秒 | 13,597 |
| 第 6 题 | 5.0 秒 | 5,469 |
七题最短的也有 5,469 字,最终答案通常只有几十到两百字。要接进业务侧,解析层得自己写:截末尾那段,或按 Answer: 切开取后半。切片原文里带文件 id,日志落盘前记得脱敏。
资源回收:三层要按顺序删
删库的命令说明里明确写了"不会删除数据中心的文件",删文件的命令又警告"引用它的库索引可能失效"。所以顺序是服务、库、文件:
bl knowledge service delete --agent-id <服务 id> --yes
bl knowledge delete --index-id <库 id> --yes
bl knowledge file delete --file-id <文件 id> --yes
三条都是高风险命令,必须显式 --yes;服务删除是软删且幂等。我删完逐项复核:按 id 查服务返回 total: 0,按名字查库列表无命中,14 个文件 id 逐个查全部不存在,再按文件名兜底扫一遍也是空的。16 个资源全部删净。
这条栈的适用边界
它答对那七题,是因为答案就写在那几行代码里,检索正好把片段捞了出来。需要看完整个项目才能下的结论,比如某个改动会影响哪些调用方,它给的是基于片段的推断,不是全量分析。运行时行为、类型推断、性能问题它看不到,它也不执行代码。我这个项目能跑,是我自己 python3 main.py 确认的。
它补上的是"读"这一段:跨文件调用点、没用上的 import、死函数、边界符号、作者留下的 TODO。人工通读也能拿到,但 190 行读到第三遍就会走神,而它 5 到 49 秒一题,配合自己 grep 出的标准答案可以逐条判定。
环境与用量交代:bl 2.1.0,标准 API Key 登录,macOS,全程零控制台依赖;模型问答调用 8 次,7 题加 1 次正式版对照,其余为管理类调用,不消耗模型额度。
素材说明:demo-shop 是我自己写的虚构演示项目,公司名、订单号、金额、折扣规则都是编的,不指向任何真实业务。你拿自己的项目跑,结果会完全不同。
想照着走一遍的话,命令说明在CLI 安装页,API Key 在控制台密钥管理页领取。两处提醒:先转扩展名再传,.py 会被静默跳过;answer 字段要自己截取,别直接拿去用。