VSCode Ollama本地模型+cline实现agentic coding

0. 一点小吐槽#

不得不说,最近的coder模型真的是快速更新换代,而且代码理解+需求能力水平也在不断增强,现在连复杂点的task都能直接用ai跑了。

想当初今年年初那时候,其实自己试过用ai写过一些代码,用api调的某大模型。但怎么说呢,效果其实还算有点一言难尽。假如说接入ai前是60%的开发时间+40%的自测时间,那么用ai开发时间基本上就只会变成:15%写需求让ai生成or修改代码+40%自己去找ai写出来的代码里面的bug+40%的自测时间(笑)。运气好点中间那段时间找bug的时间可能会少点,但感觉整体质量不太可控。

所以基本上,个人只会让ai做些比较简单的体力活,比如去年的deepseek-coder-v2:16b模型,就用continue插件接到vscode做inline code complement,比如:

除了coding以外,也就用LunaTranslator跑跑llm的sakura翻译模型,比如:

扯远了。最近Qwen3 coder模型出来之后,感觉也有试一下的价值,试试就试试,反正也就试些简单的体力活。

1. Setup#

模型用的是Qwen3-Coder-30B-A3B-Instruct-GGUF,用的Q4_K_M量化。装过ollama的情况下,直接敲ollama run hf.co/unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF:Q4_K_M就能跑起来了。在context window小的情况下还勉强能占满24g显存用gpu跑,大一点基本上就会用cpu+gpu的混合模式,用上完整的256k那就只能纯cpu跑了。不过对不算复杂的任务来说,64k就够用了。

(截第一张图的时候还开着个mumu模拟器挂着个游戏)

vscode插件的话,roocline两个都可以,但cline有个好处就是能自己调本地模型的context window,用roo的话就只能跑满256k context window,不能自己调大小。

2. 效果#

简单用自己fork的pyNCMDUMP仓库试水。总共有3个task去测试模型:简述类task、单点功能修改task、多点功能修改task

2.1 简述类task#

@/ncm_converter.py @/ncmdump.py @/README.md 有两个python文件,根据readme文档,哪一个是正确的

task一开始,Cline会把任务+文件都扔给llm,这段prompt相当消耗token,大概会用掉10+~20+k的token,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
```markdown
<task>
'ncm_converter.py' (see below for file content) 'ncmdump.py' (see below for file content) 'README.md' (see below for file content) 有两个python文件,根据readme文档,哪一个是正确的
</task>

<file_content path="ncm_converter.py">
(文件内容)
</file_content>

<file_content path="ncmdump.py">
(文件内容)
</file_content>

<file_content path="README.md">
(文件内容)
</file_content>



# TODO LIST RECOMMENDED
When starting a new task, it is recommended to create a todo list.




1. Include the task_progress parameter in your next tool call

2. Create a comprehensive checklist of all steps needed

3. Use markdown format: - [ ] for incomplete, - [x] for complete



**Benefits of creating a todo list now:**

- Clear roadmap for implementation

- Progress tracking throughout the task

- Nothing gets forgotten or missed

- Users can see, monitor, and edit the plan



**Example structure:**
```

- [ ] Analyze requirements

- [ ] Set up necessary files

- [ ] Implement main functionality

- [ ] Handle edge cases

- [ ] Test the implementation

- [ ] Verify results

```javascript



Keeping the todo list updated helps track progress and ensures nothing is missed.


<environment_details>
# VSCode Visible Files
(No visible files)

# VSCode Open Tabs
(No open tabs)

# Current Time
2025/9/6 下午5:35:52 (Asia/Shanghai, UTC+8:00)

# Current Working Directory (g:/coding/python/pyNCMDUMP) Files
.gitignore
LICENSE.txt
ncm_converter.py
ncmdump.py
README.md
requirements.txt

# Git Remote URLs
origin: https://github.com/qhgz2013/pyNCMDUMP
upstream: https://github.com/allenfrostline/pyNCMDUMP

# Latest Git Commit Hash
c914b17aa923077dad90be7e762c183a870efdfd

# Context Window Usage
0 / 65.536K tokens used (0%)

# Current Mode
ACT MODE
</environment_details>
```

然后llm就会用些内置的指令去读文件内容/文件夹内容。

当然,给出这个结论似乎也没毛病,回想一下确实任务描述还有点问题,应该问的是:哪个文件的代码更新一些,这样说明能准确一点,单问一个“哪个是正确的”还是有点过于笼统。

2.2 单点功能修改task#

在上面的任务上,接着让llm做一个小改动,内容如下:

修改@/ncm_converter.py 这个文件,当转换后的文件存在时仍然进行强制转换

llm也能够用cline内置的replace_in_file工具,把对应位置的代码给注释掉。

修改完后完成任务。

2.3 多点功能修改task#

比较常见的场景就是给代码加点简单的小功能or实现点小的需求改动,比如:

把修改的功能优化一下,加一个—force参数,当这个参数存在的时候才跳过进行强制转换

执行的话,更偏向于一个地方一个地方地去改。

第一次修改的是dump_single_file,加了个参数,把上一步注释掉的代码改成新的。

第二次修改的是给parser加了个--force参数,并传给dump

第三次修改是在调dump_single_fileprocess_file这地方,补上新的参数。

第四次修改是在dump调用dump_single_file的地方,加上新的参数。但在dump函数的参数里面漏了。后面才发现了。

所以第五次修改则是把上面漏掉的给加回去……

最后的代码变更为:

最终的任务状态:

这一串任务执行下来,一共花了57k的context window。复杂点的task得自己评估下这个值要改成多大了。

3. 结论#

其实在测Qwen3-Coder-30B-A3B-Instruct-GGUF之前,先用了qwen2.5-coder-tools 14b模型试了下水,但效果觉得还是有点一言难尽。30b模型对14b而言还是碾压级别。只能说parameter size is all you need。大模型除了有点烧钱以外,其实效果会更好,这个就得看自己对ai coding的依赖程度和预算了。之前用公司的api key的去跑sonnet 4.0,一个下午就能花掉整整30刀(笑)。

声伴分离工具UVR5.6 beta分支Roformer模型实测

Mel-band Roformer架构(MB-Roformer论文链接)的代码分支,UVR的作者去年年底就已经提交到GitHub,但迟迟没合到主分支。

直到……最近在b站刷到某些视频评论区发现效果提升还挺明显,才把UVR的代码checkout到这个分支,也才有了此文……

Baseline#

以前用的VITS AI翻唱的UVR流水线baseline,一共有3个步骤:

  • 声伴分离:用MDX23C-InstVoc HQ,将输入音源分为声轨(包含和声)和乐轨
  • 和声分离:用UVR-BVE-4B_SN-44100-1,再将声轨细分为主声轨和副声轨(和声声轨)
  • 去混响:用UVR-De-Echo-Normal,只处理主声轨

为了比较模型的原始效果,去混淆这步骤就免了,有几斤几两直接拎出来称称就知道了。

选的“松下”唱的“月光潤色ガール(カバー)”,人声部分比较容易看出模型的实力……

一键播放,然后自己调各个音轨的音量,or手动播放:

主声轨:

副声轨:

乐轨:

全部一点播放,乍一看还行,但单论单音轨的质量,其实还算差强人意(特别是副声轨)。

Roformer#

这次试水的2个新Roformer模型,效果还行:

  • 声伴分离:用mel_band_roformer_karaoke_becruily,将输入音源分为主声轨和带和声的乐轨
  • 和声分离:用MB-Roformer-InstVoc-Duality-v2,再将乐轨分为副声轨(和声声轨)和乐轨

调过karaoke的先后顺序,先用karaoke再用InstVoc模型,效果比先用InstVoc(提取声轨+乐轨)再用karaoke分离声轨要好上不少。至少,主声轨的质量只用跑单次模型,质量是最高的。

一键播放,然后自己调各个音轨的音量,or手动播放:

主声轨:

副声轨:

乐轨:

Roformer第一个分离模型用的是第3方的模型(UVR下载中心里也没有的),从hugging face下下来,模型的ckpt文件放到models/MDX_Net_Models,配置放到models/MDX_Net_Models/model_data/mdx_c_configs就好,启动UVR选中该模型后,就会问你是否添加模型配置,勾上Is Roformer选对配置文件就行。

添加好后,就能跟其他官方提供的模型一样使用:

两个模型的音轨单独比对比对,roformer不直接秒杀之前在用的baseline?有谁能拒绝一个纯净且无需再任何处理的主音轨呢。

这个模型唯一的缺点就是,吃GPU,且极吃GPU,4090满功率400w也得跑上1分钟出头……

UVR现在唯一还缺的功能大概就是合唱分离了,真有闲人把模型跑出来的话,我愿意称之为神。

这下压力来到so-vits-svc这边了。题外话:时隔一年的回归 最后的那段话,还是咕咕咕了,会迟到但不会缺席(doge.jpg)

cloudflare缓存与绕过缓存

上一篇 Koikatsu CharaStudio MMD浅入浅出 的衍生文章。在这之前,cloudflare那边的配置我基本就没怎么动过,一直开cache everything的策略来降低回源数据的……

先说现象

上篇文章贴了个两视频:一个100多M的av1 60fps格式的视频,90来秒;还有一个是600多M的h264 120fps格式的视频,3分半多一点。并且两个视频的预加载都是metadata级别的,代码贴下面:

1
2
3
<video controls preload="metadata">
<source src="https://cdn.zhouxuebin.club/data/2024/11/uchoten_bibache_h264_120fps.mp4" type="video/mp4">
</video>

本地测的时候没啥问题,两个视频都能正常加载播放。后面把url改成cdn之后,100多M的视频能够正常加载。但600多M那个视频,预载metadata的时候直接把整个文件几百M下了一遍,然后播放的时候又把那几百M重新下一遍,一趟折腾下来,就1G多的数据量了,明显不对劲,而且也不是必现的,偶尔也只需要正常加载个1M不到的数据就好了。

开始分析背后的成因

chrome的video tag都是通过流式传输按需加载内容的,背后使用HTTP的Range header来指定从哪里下到哪里。

正常来说,web网关在收到Range请求后,理论上返的HTTP状态码应该是206 Partial Content:

但现实是什么个情况呢?返了个200……而且响应头里面关于请求Range部分的数据都被丢弃了

一时排查不清是chrome的问题,还是cloudflare的问题,还是web网关的问题 (当然现在都是后日谈了) 。开始用控制变量法排除问题。

第一步,把cdn的url改为不经cdn的直连url,在dev tools把disable cache勾上,刷了十几遍,没有复现200的情况,基本可以排除chrome这选项了。

第二步,把web网关的log level改成trace,直接把所有请求和响应的header都log出来。直连情况验证没问题,这次直接用cdn的url发get请求。然后,神奇的事情发生了,web网关的请求header里面没有Range字段,然后很自然返了个200回去……似乎web网关也没有做错什么事情。

那么,就剩下cloudflare了……搜了一下其他人用cloudflare中转视频数据时也会遇到这种情况来看,大概能猜到个大概缘由了。它到底干了什么?其实,它也只是在缓存数据罢了。 毕竟开了cache everything嘛。

不需要串流,且文件大小也不大的文件,cloudflare会直接回源拉一次数据,后面就直接从cloudflare缓存里面拉了。

需要串流,且文件大小也不大的文件,cloudflare似乎也只会回源拉一次数据,而回源拉的数据,是不带Range header的。后续的Range请求,cloudflare能够命中缓存,而且缓存也能够正常处理Range请求,所以没有暴露出问题。

需要串流,文件大小超过cache大小的文件,问题就暴露出来了,cloudflare回源拉的那次数据没有Range header,而且Content-Length超过cache上限……表现是这样的:浏览器发了一条range请求,cloudflare的cache机制把range丢掉,给web网关发了条回源的get请求,web网关就这样老实巴交地给了个200的状态码回去了。cloudflare提供的header里,可以清楚看到cf-cache-status状态是miss,content-length就是整个文件的大小……这就是所谓的聪明反被聪明误吧……

最后给个解决方案

核心思路其实很简单,能cache就cache,cache不了的串流文件,那就直接绕过cache嘛。谷歌一下,就有一堆的方法,但比较简单粗暴,不尽完善。比较常见的就是:关掉全局cache,又或者是绕过某类mime-type的缓存。但怎么说呢,这种规则能够处理场景似乎比较死板……思来想去,要不就在url query string上下点功夫得了。

我个人的方案其实也很简单,两条规则足矣:全局cache保持打开状态,绕过某些query string的url。这样配置cache影响范围比较小,用途也算比较灵活。

第一条是古早的全局cache:

第二条是新增的绕过cache的规则:

用途也很简单,在需要绕过cache的url,后面统一加上?_cf_bypass_cache=1就行,原本有query string的也能用

还是用上面的url测试,可以看到cf-cache-status现在固定是dynamic了,对应的Range请求也没丢掉

大功告成(鼓掌鼓掌),可以丝滑加载了。

后面有个想法把data里面的数据迁到云存储上,走动态fetch,至于会不会这么做,以后再说

时隔一年的回归

研究生毕业之后,好像这里就已经被荒废掉了。其实之前想过好几次想要复更点啥的,但是一直拖着拖着就没了下文了。今年年初换完电脑之后升了win11之后就更没有想法了,一点进文件夹就想到还得装一堆环境,好烦……但无论怎么说,耗了好几个月终究还是把环境给整全了。

电脑是去年双11买的,因为拖延症加上以前的8700k+1080ti的电脑还能用,所以就一直拖着没装。但不管怎样,年初花了一个月时间熟悉新系统,还算是挺香的,微软最伟大的贡献就是能在wsl2的linux系统跑GPU了。

毕业之后,没继续走AI这方向就业,跑去当后台开发去了……

怎么说呢,AI这东西我个人觉得投资回报的风险太不可控了,就跟赌博一样……赌赢直接退休,赌输了那研发成本就白白烧掉了。之前在实习的时候,做的就是科研落地方向的,最后的产出指标量化下来就是GMV这类的指标了。如果运气非一点,最后模型上线做完AB测下来,发现GMV没提升多少,或者跟离线的指标差一点,组会做汇报的时候就显得稍微有些尴尬了。

当然这也是少数情况啦,大牛永远都会是大牛。之前同一部门的实习伙伴们,有发了不少paper,有跑去MIT留学,然后现在在折腾初创公司的……比如RMVPE: A Robust Model for Vocal Pitch Estimation in Polyphonic Music这篇文章的一作魏佬,当时看到他发朋友圈,把我震惊到了。

虽然自己工作跟AI无关了,但是科研领域的动态还是会关注的。套用三体的话来说,我是坚定的降临派分子。遇到自己感兴趣的新玩意儿,还是会花点时间看一下的。

经过研究生三年的经历下来,我发现自己真正喜欢的只是他人的研究成果,而不是享受研究这个过程。纯个人感觉,这过程其实跟坐牢差不多吧。当年的生活,无非是每天早上check一遍跑了一晚的实验数据,看完数据没问题,换个参数继续跑,有问题还得去看代码哪里算错了……等到结果差不多全了,就得好好整理实验数据写manuscript了,写完,投,accept with revision还好,rejected的论文还得再找个合适的期刊,换个latex模板,重新投……而且每次revision都得回复reviewer的各种奇奇怪怪的意见,比较无语的就是lack of innovation这种广大空的话了……后面有一篇论文revision的时间跟毕业论文初稿重叠了,是去年年初的事了,那段时间过得可酸爽,早上起床改&写论文一直改到深夜……

咳咳,扯远了。后面嘛,预期会更点目前在玩的东东(准确来说是前几个月了):SO-VITS-SVC,整个AI翻唱的流水线&原理,先留个坑在这里。这里先发个成果,fgo妖兰(cv 高野麻里佳)翻唱:

模型是年初换电脑后当新显卡的benchmark跑的,不得不说,跟之前的1080ti比起来,4090确实是快啊……PS: 跑分软件也就图一乐,真要体验实际效果还得靠pytorch。