- 博客(41)
- 收藏
- 关注
原创 glowglow:语言无关的语法高亮器是怎么实现的
之前在做网页端阅读器的时候,会涉及到将书里面的代码块高亮的问题,但当时看了一下highlight.js shiki,前者包太大,没办法tree-shaking,后者倒是可以,但在将要使用shiki的时候,发现又需要将所有语言的包都引入进来,也还是太大,不想引入这么大的一个包。然后就有了做一个轻量的代码高亮库的想法。最简单的highlighter可以使用正则表达式实现,也就是将一些关键字、通用的表达式等使用正则替换,但这种做法高亮出来的代码不太容易阅读,很容易看出其只是做了一种很粗糙的处理。
2026-09-26 23:52:43
223
原创 vllm教程-05-采样与解码参数
仓库地址:https://github.com/hhk-png/cycle-agent模型最后一层输出的是一张 logits 表:形状 ,每个位置的值是这个词作为下一个 token 的"未归一化得分"。logits 本身没有概率意义,要经过 softmax 变成概率分布:其中 是 logits, 是温度(temperature),后面会细说。从分布里选 token 有两种基本策略:vLLM(以及所有主流推理引擎)的 干的就是"把 logits 变成最终 token",中间依次套用各种后处理算子(log
2026-09-02 21:46:04
192
原创 vllm教程-02-核心原理
把上面的 16GB 例子做完整:设一个 8B 模型,fp16 权重 ≈16GB;单卡显存带宽Bdecode 每步都要把整套权重从显存搬到计算单元——这是每步绕不开的"固定成本"。每步必须搬运 ≈ 16GB(权重)+ 本批新增的 KV8B 模型每 token 的 KV 很小:2 × 32层 × 8 KV头 × 128 dim × 2B = 128 KB(相比 16GB 权重,可忽略,见 §10)batch = 1:每步搬 16GB,只产出 1 个 token。
2026-09-02 21:43:54
207
原创 vllm教程-00-前言与导读
本章目标:说明这本教程要解决什么问题、适合谁读、按什么顺序读,以及如何亲手运行配套的 mini-vLLM 代码把原理变成可执行的代码。
2026-08-30 21:59:33
217
原创 将markdown转换为能够粘贴到公众号的html
- 大模型对话UI需满足消息发送、流式展示、工具调用、错误处理、多轮对话等12项需求。采用经典四分区布局:状态栏(模型/状态/计数)、消息历史区(用户/AI/工具/错误消息)、输入区(多行编辑+Ctrl+S发送)、帮助栏(快捷键提示)。组件树从screen根节点到各容器分层组织。六状态状态机:idle→thinking→streaming→tool_call→tool_result→done,含完整状态转换表。覆盖响应式布局(百分比+flex)、终端安全色板256色、IME输入法支持、虚拟滚动优化长对话性能
2026-08-02 11:45:05
269
原创 AI 教程系列-TUI 应用开发教程04-第一个 TUI 应用
- 项目初始化安装blessed、tsx、typescript和类型定义,tsx直接运行TS无需编译。blessed核心概念:Screen负责屏幕管理和渲染循环,组件树通过父子层级组织UI,布局支持固定/百分比/偏移三种定位方式,焦点循环通过Tab/Space导航组件。basic-tui.ts完整源码展示文本颜色展示、按钮点击事件、列表导航选择和进度条动画。涵盖TUI调试技巧(日志覆盖层)、组件间通信(EventBus模式)和窗口自适应(resize事件绑定),提供布局练习指导。
2026-07-25 22:10:03
183
原创 AI 教程系列-TUI 应用开发教程03-TUI 框架与技术选型
- 各语言TUI框架生态:JS/TS(neo-blessed、ink)、Go(Bubble Tea)、Rust(Ratatui)、Python(Textual)各有优势。LLM聊天场景需重点评估流式输出支持、异步事件处理、富文本渲染、滚动性能等九项指标。本教程选择blessed:纯TypeScript类型支持、功能全面(屏幕/布局/事件/鼠标/颜色)、11k+最大社区、概念可迁移至其他框架、无框架依赖、内置smartCSR差分渲染。neo-blessed作为现代分支修复了上游问题并增加ESM支持,API完全
2026-07-25 22:08:34
217
原创 AI 教程系列-TUI 应用开发教程02-终端基础
- 各语言TUI框架生态:JS/TS(neo-blessed、ink)、Go(Bubble Tea)、Rust(Ratatui)、Python(Textual)各有优势。LLM聊天场景需重点评估流式输出支持、异步事件处理、富文本渲染、滚动性能等九项指标。本教程选择blessed:纯TypeScript类型支持、功能全面(屏幕/布局/事件/鼠标/颜色)、11k+最大社区、概念可迁移至其他框架、无框架依赖、内置smartCSR差分渲染。neo-blessed作为现代分支修复了上游问题并增加ESM支持,API完全
2026-07-25 22:05:41
196
原创 AI 教程系列-TUI 应用开发教程01-TUI 概述
TUI是运行在终端中的文本用户界面,具备分屏布局、交互控件、动画和鼠标支持等特征。从1960年代电传打字机到2024年MCP协议诞生,TUI经历了六十年演进。相比CLI(需记忆命令)和GUI(资源消耗大),TUI在SSH远程、启动速度、资源效率方面优势明显,特别适合LLM流式输出逐字渲染、工具调用卡片式展示、多轮对话管理等场景。本教程采用四层架构:终端渲染层→应用逻辑层→LLM集成层→工具执行层。
2026-07-25 22:04:36
239
原创 AI 教程系列-TUI 应用开发教程00:AI 时代,或许我们应该变一下我们的学习方式
- AI辅助下数小时即可完成过去数月的工作量,但学习依然重要。作者利用自研cycle-agent脚本(reflection-agent模式)调用Claude生成TUI教程,展示AI生成教程的优势:知识覆盖面广、系统性强,不会因知识盲区遗漏模块。虽然AI生成知识可能不完善,但学习者可主动沿线索深入探索,达到学习目的。本教程正是"人+AI协作"学习理念的实践。(文章链接:https://juejin.cn/post/7665740209465409574)
2026-07-25 22:03:15
196
原创 cycle-agent:一段用于信息搜集与研究的sh脚本
与大模型对话常得大纲,需反复追问,易致上下文污染、信息碎片。受残差链接启发,编写 Bash 脚本循环调用 Claude CLI,每轮重置上下文,直接读写 result.md 迭代优化。首轮按初始描述生成初稿,后续轮次读取文件并细化,默认 5 轮,用户可调迭代次数。以“目标检测有哪些损失函数”为输入,经 3 轮精炼获得系统化知识,收集效果佳。复用 Claude Code 工具,用文件写入规避命令行多轮对话输出截断,代码已开源。作者探讨该方法用于数学题求解能否提升正确率,后续可验证
2026-07-07 16:50:50
216
原创 基于kvcache的RAG系统
提出基于KV Cache的语义检索方案固定Prompt前缀复用缓存降低计算成本让大模型输出匹配数据ID进行检索再根据ID回查数据库拼接答案使用DeepSeek API验证缓存命中与计费变化采用肿瘤科医疗问答数据集测试小规模数据下速度快且较准确大规模(36MB、300w token)延迟上升明显warm up成本较高约20元后续单次查询成本下降到几毛钱但扩展性与性能仍受限相比RAG方案整体效果不理想
2026-07-06 19:07:03
227
原创 技术实践总结:schema-bridgion:json、xml、yaml、toml文件相互转换
摘要:本文介绍了一个支持JSON、XML、YAML和TOML四种格式互转的工具schema-bridgion。该工具以JSON为中间格式,通过调用各格式的解析库(fast-xml-parser、yaml、smol-toml等)实现转换。文章详细说明了设计思路,包括选择JSON作为中间格式的原因,以及各解析库的特点和取舍(如注释处理等)。目前工具已实现基本功能,未来计划通过options参数支持更多数据类型转换。项目开源在GitHub,提供了基础用法示例和详细文档链接。
2026-01-25 22:40:35
577
原创 电子书阅读器:epub电子书文件的解析
本文介绍了本人做的 @lingo-reader/epub-parser 这个库,包括使用的第三方库的选型以及解析方案的设定。介绍了常用的公共的电子书格式的解析,以及在浏览器端与node端上的解析细节
2025-08-24 12:18:54
1456
原创 组件是怎样写的(1):虚拟列表-VirtualList
本片文章讲解一下虚拟列表的实现,代码主要来源于,然后在其基础上做了一些优化。如果在浏览器中渲染有大量数据数据的列表,比如 100 万条,并且设置滚动,在打开这个页面的时候,浏览器所承担的渲染压力将会急速放大,浏览器将会崩溃。虚拟列表应对该种情况的处理方式是将列表渲染时的计算量从渲染进程中转换到了 js 中,从而降低浏览器的渲染压力,使这种数量的列表可以正常渲染。在用户端,用户对序列表做的操作主要是使用鼠标的滚轮滑动列表,或者通过拖拽滚动条的方式,两者都会反映到元素的 scroll 事件上。
2025-04-21 16:18:03
1288
原创 翻译:MCP schema(Model Context Protocol specification)
Model Context Protocol(MCP)是Anthropic于2024年11月25日发布并开源的一项开放标准,旨在规范应用程序与大型语言模型(LLM)之间的上下文信息交换方式,使开发者可以在AI模型与本地或远程数据源之间建立安全、双向的连接,使AI系统能够有效的访问所需的数据,提升响应的相关性和质量。
2025-03-16 13:45:28
1580
原创 网页端电子书阅读器的设计与实现
本文介绍了在网页端实现电子书阅读的两种模式:分页和滚动模式,重点讲解了使用overflow+scroll和overflow+translate实现分页的技术细节,并探讨了在lingo-reader项目中构建网页阅读器的相关API和功能设计。
2025-03-09 17:13:46
2259
原创 翻译:tc39装饰器提案扩展
因为如果对装饰器或注解表达式的评估顺序进行重新排序,会变得不直观,也就是说,装饰器或注解的执行顺序会受到函数声明位置的影响,而不是像普通的函数声明那样在代码的任何地方都可以调用。相反,带有装饰器或注解的函数只有在达到声明时才会定义。装饰一个初始化器会将其转变为一个惰性计算函数(thunk),这样它可以在适当的上下文中执行(例如,在启用使用追踪时)或稍后重新执行(例如,当依赖发生变化时)。带有装饰器或注解的参数的函数与带有装饰器/注解的函数类似:它们不会被提升,并且在其定义被执行之前处于临时死区(TDZ)。
2024-12-21 19:38:28
681
原创 翻译:tc39装饰器提案(Stage 3)
装饰器是在定义期间,在类、类元素或其他 JavaScript 语法形式上调用的函数。可以用具有相同语义的值替换被装饰的值。(例如,装饰器可以用一个方法替换另一个方法,用一个字段替换另一个字段,用一个类替换另一个类,等等)。可以通过accessor函数获取被装饰的值,并选择是否共享这些访问器。可以对被装饰的值进行初始化,在值完全定义后运行额外的初始化代码。如果值是类的成员,装饰器的初始化过程会针对每个实例运行一次。简单来说,装饰器可以用来进行元编程,为值添加功能,而不会改变它的外部行为。
2024-12-21 19:37:40
1345
原创 JSON的解析过程及其在ai流式传输中的应用
JSON是一种轻量级的数据交换格式,其设计来源于js语言语言标准ECMA-262第三版的一部分功能或语法规则。所有的c系语言在内部都能够表示json的数据结构,都能够实现json的parse和stringify方法。在js中,除了parse和stringify之外,还有两个方法是和,这两个方法的出现是为了弥补js本身的缺陷。js中的number类型使用的是IEEE754标准的64位浮点数表示,在表示超过64位浮点数最大表示范围的数字时,js会将这个数字四舍五入到最接近的可数字,ling,json-parse
2024-11-21 19:28:04
1536
原创 esm模块的加载顺序
esm模块的加载顺序,在sin.js的全局中读取这个变量,就会报错_B is not defined。,然后重新加载,加载的sinMod2也会只是用第一次加载的缓存,此时print函数还是print1,而不是print2,所以打印了两个1。下面的代码不会报错,会打印。代码的输出如下,模块会执行两次。在esm中,模块是单例的,首次导入后,模块所有的导出都被缓存,且只会执行一次。时,会先执行其导入的模块文件,然后再执行当前文件的代码,所以先输出。
2024-10-24 17:00:11
495
原创 ecmascript和nodejs中的Buffer
它们存储的都是原始二进制数据,也提供了一些操作二进制数据的api。2:为了扩展操作缓冲池中数据的能力,可以创建一个视图层。是一个类型,无法被实例化,是上面所描述视图层的联合类型。的类型转换上就不会报错,该错误在处理图像读写时会出现。两个视图的联合类型,也只是一个类型,无法被实例化。3:如果遇到下面这个错误,可以使用。时,可能会遇到下面的错误,可以使用。
2024-09-19 18:56:58
417
原创 记录:Scavenge:v8引擎的垃圾回收算法
在老生代内存中,采用的是标记清除算法,从根节出发,找到能够到达的对象,然后将不可达的对象进行清除。清除完成之后,会存在大量的内存碎片,这时候采取的策略为标记压缩策略,将活跃的对象移动到内存的另一端,紧密连接,这样就能将内存碎片进行消除。分为新生代和老生代,新生代用于存储生命周期较短的对象,回收频率频繁。通过增量垃圾回收和并发垃圾回收的方式将垃圾回收分为多个小步骤,或者采用并发的方式,避免长时间的暂停。部分使用可达性分析,也可以理解为标记清除算法的标记部分,从根对象出发,把能够访问到的对象移动到。
2024-09-08 17:30:16
570
原创 记录:v8中数组的sort方法采用的排序策略
sort使用的是优化后的快排算法,在内部,数据量小于10的时候,使用插入排序对这一部分数据进行排序,其余情况使用快速排序。数据量大于1000的时候,需要每隔200-215个元素挑出一个元素,从挑选出来的数里面选择中位数,作为快速排序的pivot。数据量小于1000,大于10,则直接选择中间元素作为pivot。
2024-09-08 17:28:46
292
原创 ssh: connect to host github.com port 22: Connection timed out fatal
ssh: connect to host github.com port 22: Connection timed outfatal: Could not read from remote repository.Please make sure you have the correct access rightsand the repository exists.
2024-01-31 13:51:19
670
原创 shadow dom简介
shadow dom简介,light dom,html,slot,web component,:host,:slotted,selector
2023-09-05 15:50:51
852
原创 MFC树形组件显示文件树形目录结构
MFC实现文件树状目录结构的展示,tree control,list box,OnTvnSelchangedTree1,HTREEITEM,MFC树形控件开一个 MFC 项目来实现文件目录的展示。
2023-09-03 21:15:31
1241
原创 monorepo实践
monorepo可以概括为前端模块化、工程化的进一步演进,使得我们能够在不将自己的包发布到npm上的情况下,就可以使用pnpm add和的方式,向当前项目引入本地其他项目里的包,使得能够在同一个工作目录下存放多个项目,方便管理。换句话说,我们可以通过两个途径来将第三方库引入到项目中,一个是本地,一个是npm。实现monorepo可以通过pnpm和yarn两种包管理方式,本文使用pnpm来进行实践。monorepo实践,monorepo原理,monorepo概述
2023-04-06 18:38:20
886
1
原创 python中的并发
python中的并发,CPU密集型任务是说程序中存在大量的计算操作,CPU在程序运行期间处于忙碌状态,因为计算量太大导致程序运行的时间过长,此时提升CPU的性能可以缩短程序的运行时间。对于CPU密集型任务,使用并行机制来缩短程序的运行时间,程序的运算量可以看作是固定的,程序同时使用的CPU越多,总的运算量减少的就会越快,进而程序的运行时间就会缩短。python中使用thread和async来支持并发,因为GIL的限制,python在使用这两个功能时也还是单线程执行的,
2023-03-13 18:22:38
3021
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅