<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>编程 &#8211; 天地一沙鸥</title>
	<atom:link href="https://haoluobo.com/category/%E7%BC%96%E7%A8%8B/feed/" rel="self" type="application/rss+xml" />
	<link>https://haoluobo.com</link>
	<description>to be continue....</description>
	<lastBuildDate>Thu, 02 Apr 2026 07:26:10 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>小说创作 SKILLS 的设计</title>
		<link>https://haoluobo.com/2026/04/novel-skills-design/</link>
					<comments>https://haoluobo.com/2026/04/novel-skills-design/#respond</comments>
		
		<dc:creator><![CDATA[vicalloy]]></dc:creator>
		<pubDate>Thu, 02 Apr 2026 12:10:00 +0000</pubDate>
				<category><![CDATA[vicalloy的庄家]]></category>
		<category><![CDATA[编程]]></category>
		<guid isPermaLink="false">https://haoluobo.com/?p=12951</guid>

					<description><![CDATA[前情提要：《用AI写小说的尝试》 使用的 SKILLS 以及生成的小说：novel-skills 现阶段 AI [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>前情提要：<a href="https://haoluobo.com/2026/03/an-attempt-to-write-a-novel-using-ai/" target="_blank" rel="noreferrer noopener">《用AI写小说的尝试》</a></p>



<p>使用的 SKILLS 以及生成的小说：<a href="https://github.com/vicalloy/novel-skills" target="_blank" rel="noreferrer noopener">novel-skills</a></p>



<p>现阶段 AI 在各个领域都得到了广泛 的应用。AI 很能好地保证产品的下限，但若不深度参与，仅靠 AI 自动驾驶还是难以产出优秀的作品。现阶段 AI 更多的能担任辅助角色，全功能的 AI 只能寄望于其进一步进化。</p>



<p>用 AI 写小说是我探索其能力边界的一次尝试。从产出来看结果不算理想，不过整个过程还算是有趣。</p>



<h2 class="wp-block-heading">SKILL 编写流程</h2>



<p>Skill 的编写也是一个循序渐进的过程，下面是这个 Skill 调教的一个大致过程。</p>



<ol class="wp-block-list">
<li>先按照自己的理解给定基础框架，然后让 AI 帮助完善细节。该阶段可借助 Copilot、Codex 等工具辅助进行 Skill 的编写。</li>



<li>让 AI 使用 Skill 开始按章进行写作。观察 Skill 的工具调用情况，了解 AI 是否有按照预定的流程进行工作，有哪些流程可以优化。对于未按预期执行的步骤，调整 Skill 加强约束。</li>



<li>查看产出的小说摘要文件，完善 Skill 摘要生成的约束。</li>



<li>随着小说长度的增加，摘要文件持续增加。密切关注摘要内容的变化，及时修改 Skill 调整摘要以适应小说的创作。</li>
</ol>



<h2 class="wp-block-heading">小说创作 SKILL 的设计</h2>



<ul class="wp-block-list">
<li>大多 AI 模型只有 128K 的上下文，换算成中文字符大约为15万。要加上系统prompt、控制字符、对话历史等，实际留给小说的上下文远低于这个数。为了让 AI 对完整剧情有所了解，必须将小说内容先总结成摘要再喂给 AI。</li>



<li>过于简洁的摘要会让 AI 缺少必要的信息，导致剧情不连贯甚至矛盾。过于详细的摘要不但会导致上下文超限，更会分散 AI 宝贵的注意力，适得其反。可以说摘要设计是这个 SKILL 设计的核心难点。</li>



<li>设计初期考虑使用图数据库、向量数据来辅助 AI 理解小说情节。实际操作下来发现对于小说创作而言，经过合理设计的 Markdown 已可以很好的满足需求。引入数据库反而是在自找麻烦。</li>



<li>小说的摘要按照树形结构进行组织。
<ul class="wp-block-list">
<li>小说总纲，里面包含小说总体的剧情简介以及完整章回简介。总纲里的章回简介只包含标题和一句话简介。每章的具体摘要放在独立文件中。每章的具体简介里包含关键剧情，情节伏笔等。</li>



<li>角色小传放在单独文件夹里。角色索引文件里将角色分为主角、配角、组织等，并给各角色一个简要介绍。每个角色的详细介绍放在独立文件中。角色详细介绍包括人物性格、和其他人物关系以及关键剧情介绍等。</li>



<li>世界观设定也有独立的索引文件。索引文件中包含简要的世界观介绍。核心场景、关键设定有自己独立的设定文件。</li>
</ul>
</li>



<li>摘要的维护和使用。
<ul class="wp-block-list">
<li>SKILL 里明确要求每章完成后必须对相关的摘要文件进行更新。</li>



<li>最初设计是让 AI 根据情节需求自己决定需要读取哪些摘要。实际使用过程中发现 AI 经常漏读关键内容。对轮工具调用不但费 Token，速度还慢。考虑当前的章回数还不是很多，因此写了个 tools 一次性加载所有摘要。注：最初想设计成 SKILL 的 Script，但其执行前会做很多环境检查，使用体验不佳。</li>
</ul>
</li>



<li>当前 SKILL 需要改进的地方。
<ul class="wp-block-list">
<li>现在的摘要有些太“啰嗦”，随着作品长度的增加很容易超过上下文限制。需要进一步优化摘要约束，只保留重要内容。</li>



<li>在作品长度增加后一次性加载所有再要摘要将不再可行，需要回归按需加载。需对摘要加载工具进行调整，一次性加载必要的摘要文件。然后在 SKILL 里给出详细的按需加载指导。</li>



<li>设计初期没有考虑分卷问题。每卷也应当有各自独立的摘要，利用该摘要来指定本卷的创作方向。</li>



<li>需要设计 checklist 列表，避免出现伏笔丢失，人物去向没有交代的问题。</li>
</ul>
</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://haoluobo.com/2026/04/novel-skills-design/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>用AI写小说的尝试</title>
		<link>https://haoluobo.com/2026/03/an-attempt-to-write-a-novel-using-ai/</link>
					<comments>https://haoluobo.com/2026/03/an-attempt-to-write-a-novel-using-ai/#comments</comments>
		
		<dc:creator><![CDATA[vicalloy]]></dc:creator>
		<pubDate>Tue, 24 Mar 2026 02:31:53 +0000</pubDate>
				<category><![CDATA[vicalloy的庄家]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[DeepAgent]]></category>
		<category><![CDATA[LangChain]]></category>
		<category><![CDATA[小说]]></category>
		<guid isPermaLink="false">https://haoluobo.com/?p=12937</guid>

					<description><![CDATA[前情提要《我的 AI Agent 实验项目 Sequoia》 小说完成情况 小说创作系统搭建 遇到的问题以及解 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>前情提要<a href="https://haoluobo.com/2026/03/ai-agent-sequoia/" target="_blank" rel="noreferrer noopener">《</a><a href="https://haoluobo.com/wp-admin/post.php?post=12857&amp;action=edit">我的 AI Agent 实验项目 Sequoia</a>》</p>



<h2 class="wp-block-heading">小说完成情况</h2>



<ol class="wp-block-list">
<li>已完成 10 万字左右，总共24章。</li>



<li>小说名字： <a href="https://fanqienovel.com/page/7618116230070684697" target="_blank" rel="noreferrer noopener">《他们都劝我冷静，然后我疯了》</a> 发布在番茄小说。通过 <code>签约认证</code> ，未通过 <code>作品推荐</code> 审核。</li>



<li>由于让 AI 写小说的主要目的是验证 AI 能力，近期应当不会继续更新。</li>
</ol>



<h2 class="wp-block-heading">小说创作系统搭建</h2>



<ol class="wp-block-list">
<li>使用 <a href="https://www.langchain.com/deep-agents" target="_blank" rel="noreferrer noopener">LangChain Deep Agents</a> 作为 Agent 开发框架。</li>



<li>小说创作知识通过 SKILL 提供。</li>



<li>通过 <a href="https://docs.langchain.com/oss/python/langchain/tools" target="_blank" rel="noreferrer noopener">tools</a> 为平台提供图数据库读写等额外的能力（未实际使用）。</li>
</ol>



<h2 class="wp-block-heading">遇到的问题以及解决方案</h2>



<p>根据我的最初预想，小说的摘要及人物小传等知识使用层次化的 Markdown 来存储，方便人工审阅。人物关系等信息通过图数据库存储，并通过向量数据库提供前期剧情的搜索。实际使用过程中发现，图数据库和向量数据库的使用必须给定详细的规范，如果只提供基础的读写接口，AI 无法很好的利用数据库能力来辅助写作，引入的问题远高于解决的问题。此外良好的 Markdown 结构设计已足以支持小说写作。</p>



<p>当使用一个工具时，该工具的所有知识需要加入到对话的上下文中。如果 Agent 用到的工具很多，且这些工具都有详细的使用知识，则会占用很多宝贵的上下窗口。为了解决该问题可以将这个工具作为独立的 SubAgent，将工具使用的详细说明放到 SubAgent 中。</p>



<p>Deep Agents 默认提供了文件读写工具，通常情况使用该工具实现文件读写即可。但在明确要求加载 <code>outline</code> 目录内设有知识的情况下依旧会根据自己的判断只加载部分文件。似乎在上下文过长时 AI 的遵从性会下降（注： AI 所使用的 Transformer 本就是 <code>注意力机制</code> ，AI 和人一样，内容多了就容易丢失重点）。</p>



<p>为了保证摘要的完整加载，同时文件分别加载所带来的 AI 多次决策问题，需要提供一个一次性加载所有摘要知识的接口。尝试在 SKILL 里增加加载摘要的脚本。可能是出于安全等问题的考量， Deep Agents 在执行脚本前会对脚本做非常多的检查，即使在 SKILL 里明确要求直接执行也无法避免。最终将该脚本封装成 LangChain 的工具。</p>



<p>阿里百练平台为每个模型提供了 100 万免费 token。使用过程中发现只进行了几轮对话一百万 token 就会耗尽。后切换到 DeepSeek。DeepSeek 应当是主流 API 里最便宜的了，如果缓存命中，每百万的输入0.2元。对于小说写作任务，有着大量的缓存命中。随着章节的增加，写一章小说的 Token 消耗会持续增加。写到20章时，写一遍，再审阅一遍，一章花费1～2元。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://haoluobo.com/2026/03/an-attempt-to-write-a-novel-using-ai/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>我的 AI Agent 实验项目 Sequoia</title>
		<link>https://haoluobo.com/2026/03/ai-agent-sequoia/</link>
					<comments>https://haoluobo.com/2026/03/ai-agent-sequoia/#respond</comments>
		
		<dc:creator><![CDATA[vicalloy]]></dc:creator>
		<pubDate>Tue, 17 Mar 2026 12:09:47 +0000</pubDate>
				<category><![CDATA[vicalloy的庄家]]></category>
		<category><![CDATA[编程]]></category>
		<guid isPermaLink="false">https://haoluobo.com/?p=12857</guid>

					<description><![CDATA[今年 OpenClaw 的忽然爆火，让我有些难以理解。在我看来 OpenClaw 似乎没有太多实质性的创新。除 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>今年 <a href="https://openclaw.ai/">OpenClaw</a> 的忽然爆火，让我有些难以理解。在我看来 OpenClaw 似乎没有太多实质性的创新。除了不支持 IM 控制外，给任何一个 AI Client 加上 SKILLS 和 MCP 似乎都可以做到类似的事情。在对 OpenClaw 有了些了解后，虽然依旧认为 OpenClaw 不存在太多颠覆性的东西，但要做好并不容易。</p>



<p>OpenClaw 本质是一个带记忆模块的Agent管理工具，并通过 IM 的集成极大增强了用户体验（虽然现阶段依旧是个玩具）。或许 OpenClaw 这样可以通过 “记忆” 持续学习并可以通过 SubAgent 分工合作完成任务的 AI 工具会成为今后一段时间 AI 的发展方向。</p>



<p>为了探索 AI 能力的边界，开了一个试验性项目 <a href="https://github.com/vicalloy/Sequoia">Sequoia</a> 。Sequoia（红杉）世界上最大的树，寓意一颗小小的种子终有一天可以长成参天大树。</p>



<h2 class="wp-block-heading">AI Agent 框架选型</h2>



<p>为了方便验证想法，因此希望框架可以帮忙完成MCP/SKILL调用、交互界面、SubAgent创建等大部分常规工作。这样我可以聚焦记忆模块和关键工具模块的设计。同时尝试通过prompt让 AI 自己决定如何来使用这些工具。在研究过主流AI开发框架后最终选定了 <a href="https://docs.langchain.com/oss/python/deepagents/overview">LangChain Deep Agents</a>。下面是考虑的一些框架。</p>



<h3 class="wp-block-heading">Pydantic AI</h3>



<p>可以说 Pydantic 是 Python 界数据校验框架的事实标准。在很早之前就简单了解过 Pydantic AI，Pydantic AI 的 API 也算是比较易用。但实际使用过程中发现 Pydantic AI 的 SubAgent 管理功能非常弱，涉及 SubAgent 的操作会很不方便。且 Pydantic AI 没有配套的 UI，想要一个易用的交互 UI 得花不少功夫。</p>



<h3 class="wp-block-heading">CrewAI</h3>



<p>CrewAI 是个多代理编排框架。强项是 SubAgent 的协同管理，可以轻松实现多 Agent 协同。CrewAI 的发展势头不错，且非常易用。不过 CrewAI 的记忆模块和框架深度绑定。由于我想探索如何精确的管理 AI 的记忆，因此放弃。</p>



<h3 class="wp-block-heading">LangChain Deep Agents</h3>



<p>LangChain 是使用最为广泛的 AI 框架，拥有完整的生态。Deep Agents 是 LangChain 团队推出的 Agent 框架，可以完美的融入 LangChain 生态。记忆模块作为独立组件，可以方面用户自行扩展。可以使用 <a href="https://agentchat.vercel.app/">Agent Chat</a> 和自己的 Agent 交互，免去了 UI 的相关工作。</p>



<h2 class="wp-block-heading">项目现状</h2>



<p>目前搭建了基础的项目框架。利用 Deep Agents 框架本身能力提供了 SKILLS支持、SubAgent 管理、本地文件读写等功能。</p>



<p>按照我的预想，记忆应当通过“文本+图数据库+向量数据库”共通管理。为此我自己添加了向量数据库和图数据库的集成。</p>



<p>考虑如果一开始就将应用定位成一个带记忆，可以自主学习的完整“人”实现起来会非常困难。最初会尝试利用这个框架来写小说。</p>



<h2 class="wp-block-heading">小说生功能设计及问题</h2>



<p>小说的写作知识完全通过 SKILL 教给 AI。框架只提供文件读写、数据库读写工具，具体怎么用这些工具完全由 AI 自己决定。</p>



<p>AI 对于长文写作的一大难点是 LLM 的上下文长度限制。为了突破 LLM 的限制，必须将小说大纲、设定、章节摘要等信息分别保存，让 AI 在需要时再自行加载。</p>



<p>尝试用 AI 生成了一篇小说的前两章（使用 qwen3-plus）。似乎 AI 对指令的依从性不是很高。虽明确要求使用图数据库保存人物关系等信息，但在我主动要求前没被触发。明确强调了要读取 <code>outline</code> 目录下所有文件，AI依旧会根据自己的想法只读部分内容。</p>



<p>Token 的消耗速度非常惊人。没跑几次就把 qwen3-plus 赠送的 100 万 token 用完了。随着文章长度的增加，上下文长度会持续增长， token 的消耗量也会快速增加。根据最新情况，写完一章后再手动让 AI 审阅一遍 100万 token 就花光了。</p>



<p>后续应当会一边调整 SKILL 一边不定期更新。</p>



<p>小说链接：<a href="https://fanqienovel.com/page/7618116230070684697" target="_blank" rel="noreferrer noopener">《他们都劝我冷静，然后我疯了》</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://haoluobo.com/2026/03/ai-agent-sequoia/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>py-cggtts 项目简介</title>
		<link>https://haoluobo.com/2026/01/py-cggtts/</link>
					<comments>https://haoluobo.com/2026/01/py-cggtts/#respond</comments>
		
		<dc:creator><![CDATA[vicalloy]]></dc:creator>
		<pubDate>Mon, 05 Jan 2026 13:05:00 +0000</pubDate>
				<category><![CDATA[vicalloy的庄家]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[CGGTTS]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[RUST]]></category>
		<guid isPermaLink="false">https://haoluobo.com/?p=12802</guid>

					<description><![CDATA[项目地址：https://github.com/vicalloy/py-cggtts/ py-cggtts 是 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>项目地址：<a href="https://github.com/vicalloy/py-cggtts/">https://github.com/vicalloy/py-cggtts/</a></p>



<p><a href="https://github.com/vicalloy/py-cggtts/">py-cggtts</a> 是一个为高精度时间传递领域打造的 Python 工具包，它基于 Rust 编写的高性能 CGGTTS 库（<a href="https://github.com/nav-solutions/cggtts">GitHub 仓库</a>），提供了对 BIPM CGGTTS 2E 格式文件 的完整解析能力。<a href="https://www.bipm.org/documents/20126/52718503/G1-2015.pdf">CGGTTS</a>（Common-View GNSS Time Transfer Standard）是由国际计量局（BIPM）制定的标准格式，广泛应用于全球守时实验室之间通过 GNSS 卫星进行远程原子钟比对。</p>



<h2 class="wp-block-heading">项目背景</h2>



<p>CGGTTS 本身是纯文本结构，解析起来并不困难。不过 Python 性能一般，且已经有了 Rust 的完整实现，于是尝试将 Rust 的 CGGTTS 库导出 Python 接口。目前将 Rust 导入 Python 生态的技术已经成熟，不少 Python 库都通过 Rust 来提升性能。</p>



<p>项目的主要代码都由 AI 完成。对于接口封装这类本身不复杂但又繁琐的工作，在 AI 的加持下变的轻松加愉快了。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://haoluobo.com/2026/01/py-cggtts/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>使用 Coder 搭建云开发环境相关问题记录</title>
		<link>https://haoluobo.com/2025/04/%e4%bd%bf%e7%94%a8-coder-%e6%90%ad%e5%bb%ba%e4%ba%91%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9b%b8%e5%85%b3%e9%97%ae%e9%a2%98%e8%ae%b0%e5%bd%95/</link>
					<comments>https://haoluobo.com/2025/04/%e4%bd%bf%e7%94%a8-coder-%e6%90%ad%e5%bb%ba%e4%ba%91%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9b%b8%e5%85%b3%e9%97%ae%e9%a2%98%e8%ae%b0%e5%bd%95/#respond</comments>
		
		<dc:creator><![CDATA[vicalloy]]></dc:creator>
		<pubDate>Tue, 15 Apr 2025 13:05:00 +0000</pubDate>
				<category><![CDATA[编程]]></category>
		<category><![CDATA[code-server]]></category>
		<category><![CDATA[Coder]]></category>
		<guid isPermaLink="false">https://haoluobo.com/?p=12671</guid>

					<description><![CDATA[code-server 是开源的在浏览器中运行 VS Code。如果你想搭建一套自己的远程开发环境 code- [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><a href="https://github.com/coder/code-server">code-server</a> 是开源的在浏览器中运行 VS Code。如果你想搭建一套自己的远程开发环境 <code>code-server</code> 是一个不错的选择。如果只是给自己用  <code>code-server</code> 没什么问题，如果想提供团队使用就得配合 <a href="https://github.com/coder/coder">Coder</a> 来做用户和环境等管理。</p>



<p>下面是 Coder 使用过程中遇到问题的一些简单记录。</p>



<h2 class="wp-block-heading">Docker 镜像拉取问题</h2>



<p>在国内拉取 Docker 镜像几乎无法成功，如果使用 Docker 部署首先要修改 Docker 源。</p>



<p>Linux 下 Docker 的配置文件位于 <code>/etc/docker/daemon.json</code> 。修改 Docker 源的方法网上有很多资料，这里不再赘述。</p>



<h2 class="wp-block-heading">为 Coder 设置代理</h2>



<p>Coder 创建 Template 时需要从网络上下载资料，这一步很容易失败。通过环境变量的方式为 Coder 设置代理 <code>HTTP_PROXY 和 HTTPS_PROXY</code> 。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
services:
  coder:
    # This MUST be stable for our documentation and
    # other automations.
    image: ghcr.io/coder/coder:${CODER_VERSION:-latest}
    ports:
      - &quot;7080:7080&quot;
    environment:
      CODER_PG_CONNECTION_URL: &quot;postgresql://${POSTGRES_USER:-username}:${POSTGRES_PASSWORD:-password}@database/${POSTGRES_DB:-coder}?sslmode=disable&quot;
      CODER_HTTP_ADDRESS: &quot;0.0.0.0:7080&quot;
      # You&#039;ll need to set CODER_ACCESS_URL to an IP or domain
      # that workspaces can reach. This cannot be localhost
      # or 127.0.0.1 for non-Docker templates!
      # CODER_ACCESS_URL: &quot;${CODER_ACCESS_URL}&quot;
      CODER_ACCESS_URL: &quot;https://coder.your-domain.com&quot;
      HTTP_PROXY: &quot;http://your.proxy.com:1087&quot;
      HTTPS_PROXY: &quot;http://your.proxy.com:1087&quot;
    group_add:
      - &quot;124&quot; # docker group on host `getent group docker | cut -d: -f3`
    user: &quot;1000:1000&quot;
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./coder_home:/home/coder
    depends_on:
      database:
        condition: service_healthy
  database:
    image: &quot;docker.1ms.run/postgres:16&quot;
    environment:
      POSTGRES_USER: ${POSTGRES_USER:-username} # The PostgreSQL user (useful to connect to the database)
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-password} # The PostgreSQL password (useful to connect to the database)
      POSTGRES_DB: ${POSTGRES_DB:-coder} # The PostgreSQL default database (automatically created at first launch)
    volumes:
      - ./coder_data:/var/lib/postgresql/data # Use &quot;docker volume rm coder_coder_data&quot; to reset Coder
    healthcheck:
      test:
        &#x5B;
          &quot;CMD-SHELL&quot;,
          &quot;pg_isready -U ${POSTGRES_USER:-username} -d ${POSTGRES_DB:-coder}&quot;,
        ]
      interval: 5s
      timeout: 5s
      retries: 5
</pre></div>


<h2 class="wp-block-heading">编辑 Template</h2>



<h3 class="wp-block-heading">在 Template 中设置代理</h3>



<p>通过 Template 创建 Workspace 依旧会用到网络，这一步依旧很难成功。在 <code>resource "coder_agent" "main"</code> 中添加  <code>HTTP_PROXY</code> 和 <code>HTTPS_PROXY</code>。</p>



<h3 class="wp-block-heading">Docker in Docker</h3>



<p>如果要在 Workspace 中调用 Docker，需要将 <code>docker.sock</code> 映射给 workspace，且需要将传入的路径转换为 HOST 的文件路径。还需要将 HOST 的 docker 用户组添加给 coder 用户。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
# ...
resource &quot;coder_agent&quot; &quot;main&quot; {
  # ...
  env = {
    # ...
    HTTP_PROXY          = &quot;http://your-proxy.com:1087&quot;
    HTTPS_PROXY         = &quot;http://your-proxy.com:1087&quot;
  }
  # ...
}

resource &quot;docker_container&quot; &quot;workspace&quot; {
  # ...
  group_add  = &#x5B;&quot;124&quot;]  # host 的 docker 用户组id
  # unsafe, should https://coder.com/docs/v2/latest/templates/docker-in-workspaces#use-sysbox-in-docker-based-templates
  volumes {
    host_path = &quot;/var/run/docker.sock&quot;
    container_path = &quot;/var/run/docker.sock&quot;
  }
  # ...
}
</pre></div>


<h3 class="wp-block-heading">禁用 autostop</h3>



<p>为节约服务器资源，长期不用的 workspace 会被自动销毁，下次使用时再进行重建。如果服务用的人不多，资源足够，建议把 autostop 关闭掉。</p>



<p>选中 template 并进入 template 的 settings 并在 schedule 中将 default autostop 修改为 0。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://haoluobo.com/2025/04/%e4%bd%bf%e7%94%a8-coder-%e6%90%ad%e5%bb%ba%e4%ba%91%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9b%b8%e5%85%b3%e9%97%ae%e9%a2%98%e8%ae%b0%e5%bd%95/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Apple Guardian（打字练习游戏）加Cursor/Trae使用体验</title>
		<link>https://haoluobo.com/2025/03/apple-guardian/</link>
					<comments>https://haoluobo.com/2025/03/apple-guardian/#respond</comments>
		
		<dc:creator><![CDATA[vicalloy]]></dc:creator>
		<pubDate>Wed, 12 Mar 2025 12:38:00 +0000</pubDate>
				<category><![CDATA[vicalloy的庄家]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[cursor]]></category>
		<category><![CDATA[trae]]></category>
		<guid isPermaLink="false">https://haoluobo.com/?p=12662</guid>

					<description><![CDATA[项目地址：https://vicalloy.github.io/letter-fall/ 游戏地址：https [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>项目地址：<a href="https://vicalloy.github.io/letter-fall/">https://vicalloy.github.io/letter-fall/</a></p>



<p>游戏地址：<a href="https://github.com/vicalloy/apple-guardian">https://github.com/vicalloy/apple-guardian</a></p>



<p>小时候练打字的时候玩的最多的是小霸王上的一个空中掉落字母掉打字游戏。<br>最近看到很多宣传 Cursor 的帖子，另外字节也出了个类似的编辑器 Trae ，于是试着用 AI 编辑器将这个游戏复刻。</p>



<p>项目的大部分代码使用 Cursor 和 Trae 的 Agent 功能自动完成。就初步的体验而言，用自己不熟悉的开发框架写一些小东西 Cursor 这类的 AI 工具确实很好用，少了很多查资料的工作。部分功能反复打回依旧无法正确修改，这时候是需要手动介入。另外两个编辑器的推理速度都不算太理想，特别是 Trae 经常要等挺久。</p>



<p>就个人而言，写玩具 Cursor 和 Trae 很棒。大些的项目还是用 GitHub Copilot 之类的插件更可控一些。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://haoluobo.com/2025/03/apple-guardian/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>bye 2024</title>
		<link>https://haoluobo.com/2025/01/bye-2024/</link>
					<comments>https://haoluobo.com/2025/01/bye-2024/#respond</comments>
		
		<dc:creator><![CDATA[vicalloy]]></dc:creator>
		<pubDate>Thu, 02 Jan 2025 13:43:49 +0000</pubDate>
				<category><![CDATA[岁月的痕迹]]></category>
		<category><![CDATA[编程]]></category>
		<guid isPermaLink="false">https://haoluobo.com/?p=12645</guid>

					<description><![CDATA[忙碌的 2024，其中几个月的连续加班弄的身心俱疲，好在最终结果还不错，希望在 2025 能有所收获。 今年全 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>忙碌的 2024，其中几个月的连续加班弄的身心俱疲，好在最终结果还不错，希望在 2025 能有所收获。</p>



<p>今年全马第一次跑进四小时，不过身体上的体验不太好，太累了。以后再跑全马应当真就为了体验氛围了。</p>



<p>今年尝试用 Tauri 写了两个小东西。由于有前端经验，使用 Tauri 实现界面还是比较舒服。Tauri 后端用的 Rust，也算说有实际的写一点 Rust。作为一个现代语言 Rust 有着比较现代化的工具链，使用体验还不错。Tauri 整体开发体验还不错，不过前端作为一个套壳浏览器，一些限制还是挺让人难受。两个项目由于各种原因，到现在都还是半成品。</p>



<p>相比自己用 Tauri 整的两个玩具项目。年末的时候，由于工作中要用到一个开源的 Rust 项目，算是真正有正经的写点 Rust 代码了。由于只是在已有的项目上做一些修修补补，没有用到太多 Rust 的特性。还是希望以后有机会用 Rust 从头构建一个有趣的项目。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://haoluobo.com/2025/01/bye-2024/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Vim下Python（Poetry）环境的设置</title>
		<link>https://haoluobo.com/2023/10/vim-python-poetry/</link>
					<comments>https://haoluobo.com/2023/10/vim-python-poetry/#respond</comments>
		
		<dc:creator><![CDATA[vicalloy]]></dc:creator>
		<pubDate>Tue, 17 Oct 2023 13:05:00 +0000</pubDate>
				<category><![CDATA[编程]]></category>
		<category><![CDATA[direnv]]></category>
		<category><![CDATA[poetry]]></category>
		<category><![CDATA[vim]]></category>
		<guid isPermaLink="false">https://haoluobo.com/?p=12482</guid>

					<description><![CDATA[近期迁移到了 Neovim 。在 Pyright 的加持下，vim的代码补全和错误校验功能已经很接近 IDE  [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>近期迁移到了 Neovim 。在 Pyright 的加持下，vim的代码补全和错误校验功能已经很接近 IDE 了。在未正确配置 Python 环境的情况下打开 Python 项目，项目里一堆的告警让人很不舒服。</p>



<p>在 vim 中编辑 Python，重要的是 PYTHONPATH 的设置。正确设置 PYTHONPATH 后，Pyright 可以正确的查找到相关的依赖库。我目前的解决方案是使用 <a rel="noreferrer noopener" href="https://direnv.net/" data-type="link" data-id="https://direnv.net/" target="_blank">direnv</a> 。</p>



<h2 class="wp-block-heading">编辑 direnv 通用配置，添加 poetry 初始化函数。</h2>



<pre class="wp-block-code"><code>vim $HOME/.direnvrc</code></pre>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
layout_poetry() {
  if &#x5B;&#x5B; ! -f pyproject.toml ]]; then
    log_error &#039;No pyproject.toml found.  Use `poetry new` or `poetry init` to create one first.&#039;
    exit 2
  fi

  local VENV=$(dirname $(poetry run which python))
  export VIRTUAL_ENV=$(echo &quot;$VENV&quot; | rev | cut -d&#039;/&#039; -f2- | rev)
  export POETRY_ACTIVE=1
  PATH_add &quot;$VENV&quot;
}
</pre></div>


<h2 class="wp-block-heading">在 python 项目中添加 direnv 设置</h2>



<pre class="wp-block-code"><code>vim .envrc</code></pre>



<pre class="wp-block-code"><code># 进入 Poetry 环境
layout_poetry
# 设置 PYTHONPATH
export PYTHONPATH="`pwd`/vendor/Model1:`pwd`/vendor/Model2"</code></pre>



<p>在设置好 direnv 后，在 CLI 下进入目录时将设置好环境变量。CLI 下进入对应的项目目录，然后启动 vim/neovim ，Pyright即可正确的找到相关依赖。</p>



<h2 class="wp-block-heading">参考：</h2>



<ul class="wp-block-list">
<li><a href="https://rgoswami.me/posts/poetry-direnv/" data-type="link" data-id="https://rgoswami.me/posts/poetry-direnv/" target="_blank" rel="noreferrer noopener">Poetry and Direnv</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://haoluobo.com/2023/10/vim-python-poetry/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>从Vim切换到Neovim</title>
		<link>https://haoluobo.com/2023/10/vim-to-neovim/</link>
					<comments>https://haoluobo.com/2023/10/vim-to-neovim/#respond</comments>
		
		<dc:creator><![CDATA[vicalloy]]></dc:creator>
		<pubDate>Mon, 16 Oct 2023 12:16:00 +0000</pubDate>
				<category><![CDATA[编程]]></category>
		<category><![CDATA[软件推荐]]></category>
		<category><![CDATA[neovide]]></category>
		<category><![CDATA[neovim]]></category>
		<category><![CDATA[vim]]></category>
		<guid isPermaLink="false">https://haoluobo.com/?p=12477</guid>

					<description><![CDATA[vim作者的离世，让vim的后续发展存在很大的不确定性。加上现在用的vim配置一直有些小问题，其中一些插件的活 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>vim作者的离世，让vim的后续发展存在很大的不确定性。加上现在用的vim配置一直有些小问题，其中一些插件的活跃度不够，bug一直无法修复。</p>



<p>近期花了些时间把neovim配置好，从vim切换到neovim。</p>



<p>配置文件： <a href="https://github.com/vicalloy/dotfiles/blob/master/.config/nvim/init.lua">https://github.com/vicalloy/dotfiles/blob/master/.config/nvim/init.lua</a></p>



<ol class="wp-block-list">
<li>没有使用别人配置好的环境，完全自行配置。
<ul class="wp-block-list">
<li>之前也热衷于使用流行的集成配置。实际下来发现不管多受欢迎的配置都会有些不符合自己喜欢的地方。而且一旦遇到问题，很难定位问题。而且现在的插件管理机制已经很完善了，自行配置的门槛低了很多。</li>



<li>不少优秀的vim插件都转由lua实现，只能在Neovim中使用。</li>
</ul>
</li>



<li>GUI界面用的 <a href="https://github.com/neovide/neovide">Neovide</a> 。用 Rust 实现的 Neovim 前端。</li>
</ol>
]]></content:encoded>
					
					<wfw:commentRss>https://haoluobo.com/2023/10/vim-to-neovim/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>使用Docker在Orange Pi上LLM（使用GPU加速）</title>
		<link>https://haoluobo.com/2023/09/orangepi5-rk3588-mlc-llm-docker/</link>
					<comments>https://haoluobo.com/2023/09/orangepi5-rk3588-mlc-llm-docker/#comments</comments>
		
		<dc:creator><![CDATA[vicalloy]]></dc:creator>
		<pubDate>Wed, 13 Sep 2023 13:46:00 +0000</pubDate>
				<category><![CDATA[编程]]></category>
		<category><![CDATA[Mali G610]]></category>
		<category><![CDATA[MLC LLM]]></category>
		<category><![CDATA[Orange pi5]]></category>
		<category><![CDATA[RK3588S]]></category>
		<guid isPermaLink="false">https://haoluobo.com/?p=12465</guid>

					<description><![CDATA[最初买 Orange Pi 5 的目的之一就是想跑一些 AI 应用。Orange Pi 5 虽带了 NPU，但 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>最初买 <code>Orange Pi 5</code> 的目的之一就是想跑一些 AI 应用。<code>Orange Pi 5</code> 虽带了 NPU，但这颗 NPU 实在太小众，除了官方的 Demo 就没法轻松把 NPU 用起来。近期看到有人用 <code>RK3588</code> 跑LLM，于是把吃灰已久的 <code>Orange Pi 5</code> 拿出来折腾。</p>



<p><code>Orange Pi 5</code> 使用的是 <code>RK3588</code> 芯片，该芯片配备的 GPU 是 <code>Mali-G610</code>。在 <code>Orange Pi 5</code> 上跑 LLM 用的就是这颗 GPU 。</p>



<h2 class="wp-block-heading">基本用法</h2>



<p>LLM 模型通过 <a href="https://github.com/mlc-ai/mlc-llm" target="_blank" rel="noreferrer noopener">MLC LLM</a> 项目加载运行。在 <code>Orange Pi 5</code> 上通过 OpenCL 实现 GPU 加速，因此要求系统支持 OpenCL 。<code>Orange Pi 5</code> 的官方 Linux 镜像已添加了 OpenCL 支持，因此不用再额外安装驱动。</p>



<p>如果 <code>Orange Pi 5</code> 上已经安装了 Docker 可以使用下面的命令把服务跑起来。7b-f16 的模型会用到 6.xG 的内存，如果你的系统只有4G内存可以试试 3b-f16 的模型。</p>



<pre class="wp-block-code"><code># 更多镜像见 https://hub.docker.com/r/vicalloy/mlc-llm-rk3588/tags
docker run --rm -it --privileged \
    vicalloy/mlc-llm-rk3588:FlagAlpha-Llama2-Chinese-7b-Chat-q4f16_1</code></pre>



<h2 class="wp-block-heading">编译自己的Docker镜像</h2>



<p><a href="https://github.com/milas/rock5-toolchain/" target="_blank" rel="noreferrer noopener">rock5-toolchain</a> 项目中提供了 <code>MLC LLM</code> 的 <a href="https://github.com/milas/rock5-toolchain/blob/main/extra/mlc-llm/Dockerfile" target="_blank" rel="noreferrer noopener">Dockerfile</a> ，可以通过修改 Dockerfile 里的 <code>ARG MODEL</code> 来打包不同的模型。</p>



<p>为了更方便的打包不同的模型，更为了白嫖 <code>Github Actions</code> 服务器，我参考 <a href="https://github.com/milas/rock5-toolchain/" target="_blank" rel="noreferrer noopener">rock5-toolchain</a> 项目写了自己的 Dockerfile。相比原始的 Dockerfile，我把TVM编译/G610驱动安装等步骤打包在镜像 <code>vicalloy/mlc-llm-rk3588:base</code> 预置 model 的镜像从该镜像继承。要预置不同的模型，只要将对应的模型复制到镜像就好。</p>



<p>对应项目地址：<a href="https://github.com/vicalloy/docker-images/tree/main/mlc-llm-rk3588" target="_blank" rel="noreferrer noopener">https://github.com/vicalloy/docker-images/tree/main/mlc-llm-rk3588</a></p>



<h2 class="wp-block-heading">参考链接：</h2>



<ul class="wp-block-list">
<li><a href="https://milas.dev/blog/mali-g610-rk3588-mlc-llm-docker/" target="_blank" rel="noreferrer noopener">GPU-Accelerated LLM on ARM64…in Docker</a></li>



<li><a href="https://blog.mlc.ai/2023/08/09/GPU-Accelerated-LLM-on-Orange-Pi" target="_blank" rel="noreferrer noopener">GPU-Accelerated LLM on a $100 Orange Pi</a></li>



<li><a href="https://zhuanlan.zhihu.com/p/650110025" target="_blank" rel="noreferrer noopener">利用GPU加速，在Orange Pi上跑LLMs</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://haoluobo.com/2023/09/orangepi5-rk3588-mlc-llm-docker/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
	</channel>
</rss>
