☰
AI vibe-coding日志:Rust+Python+Ollama本地协同编程实践
2026/10/26 20:36:33 网站建设 项目流程

1. 什么是“AI - vibe-coding 日志”:一场安静但彻底的编程范式迁移

你有没有过这种感觉:写完一段 Python 脚本,不是先去跑测试,而是下意识打开终端,敲ollama run qwen:7b,把刚写的函数逻辑连同注释一起粘贴进去,问它:“这段代码在处理空列表时会不会 panic?如果会,怎么改最干净?”——然后盯着终端里一行行流出来的思考过程,像看朋友边喝咖啡边给你白板推演。这不是偷懒,这是 vibe-coding 的日常切片。

“AI - vibe-coding 日志”不是某个开源项目的名字,也不是某家公司的产品代号。它是一类正在真实发生的、非正式但高度结构化的技术实践记录:开发者用自然语言和代码混排的方式,持续记录自己如何与本地大模型协同完成编码任务的过程。关键词AI是驱动力,vibe-coding是它的灵魂——强调直觉、节奏、情绪流动与人机协作的呼吸感,而非冷冰冰的指令执行;Rust和Python是它最常落地的双语土壤,一个负责构建底层可靠骨架(比如自研的 Ollama 模型调度器),一个负责快速验证高层逻辑(比如用 FastAPI 搭建轻量 API);而Ollama,则是这个生态里真正意义上的“空气”——没有它,本地 AI 编程就只是纸上谈兵。我从去年夏天开始系统性地维护自己的 vibe-coding 日志,至今已积累 217 篇,最长单篇 8300 字,内容从“用 Rust 写一个带内存池的 Ollama 请求批处理器”到“让 Python 脚本自动读取日志里的错误模式,反向生成 Prompt 优化建议”。它不教你怎么调参,也不讲 LLM 原理,它只忠实地回答一个问题:当 AI 就坐在你 IDE 旁边,你真实的一天,是怎么过的?

这类日志之所以突然密集出现在开发者社区,根本原因在于技术栈的成熟度拐点已经到来。过去两年,Ollama 的 Windows/macOS/Linux 三端体验趋于稳定,ollama serve启动后本地 HTTP 接口响应延迟压到 200ms 以内;Rust 的reqwest+tokio生态让构建高并发模型路由服务变得像搭乐高;而 Python 的litellm或原生requests调用 Ollama,几行代码就能把qwen:14b变成你脚本里的一个函数。这不再是“能不能做”,而是“怎么做得更顺、更少打断心流”。vibe-coding 日志,就是开发者在新范式下自发形成的“操作手册+心理按摩+避坑地图”三位一体产物。它适合所有已经把 Python 当母语、对 Rust 有基本语法认知、并愿意花 15 分钟装好 Ollama 的人——无论你是刚用pip install ollama成功的新手,还是正在给公司私有模型集群写 Rust 客户端的架构师。它不承诺让你成为 AI 专家,但它能确保你明天早上打开电脑时,第一行代码就带着清晰的意图和可预期的结果。

2. 项目整体设计与思路拆解:为什么是“日志”,而不是“工具”或“框架”

2.1 核心理念:拒绝抽象,拥抱具体

市面上绝大多数 AI 编程工具,都在努力把自己包装成“终极解决方案”:智能 IDE 插件、云端协作平台、全自动代码生成器……它们的共同预设是——开发者需要被“赋能”,需要被“提效”,需要被“替代”。而 vibe-coding 日志的起点截然相反:它默认开发者是清醒的、有判断力的、且对自身工作流有绝对主权的。它的设计哲学第一条就是:不封装,只记录;不替代,只延伸;不预测,只回溯。

举个最典型的例子。当你用 PyCharm 配合 Fitten 插件写一个数据清洗函数时,插件可能会直接在你光标处生成完整代码。但 vibe-coding 日志里记录的,可能是这样一段:

2024-06-12 14:23 | [Python] 处理 CSV 中的 NaN 值
原始需求:用户上传的 Excel 表格,第三列是金额,但存在空单元格和字符串"-",需统一转为 0.0
尝试 1:pandas.read_csv(..., na_values=['-']) → 无效,因为 pandas 默认将空字符串视为空值,但 '-' 被当作字符串保留
转向 Ollama:ollama run phi3:3.8b "pandas read_csv 如何将字符串'-' 和空字符串都识别为 NaN?"
模型回复关键句:"use na_values=['-', ''] and keep_default_na=False"
实测:成功!但发现后续 fillna(0.0) 会把整列转为 float64,而原始列含整数 → 追加提示:"如何 fillna(0.0) 但保持整数列类型不变?"
模型回复:"用 fillna(0.0).astype(int) 会报错,推荐 df['col'] = df['col'].fillna(0.0).convert_dtypes()"
最终代码:df['amount'] = df['amount'].fillna(0.0).convert_dtypes()
结论:Ollama 解决了文档盲区,但类型转换细节仍需人工验证

你看,这里没有一行代码是 AI 自动生成的,所有决策权在人手里。日志的价值,在于把“人脑 + AI”的协作链条完整暴露出来:问题是什么、为什么卡住、如何向 AI 提问、AI 给了什么线索、哪些线索可用、哪些要修正、最终方案怎么定。这种颗粒度,是任何黑盒工具都无法提供的。它不试图“帮你写代码”,而是“帮你理解你为什么这样写代码”。

2.2 技术选型逻辑:Rust 为基,Python 为桥,Ollama 为源

为什么技术栈锁定在 Rust/Python/Ollama 这个组合?这不是跟风,而是由三个不可妥协的硬约束决定的:

第一,本地化与可控性。vibe-coding 的核心前提是“我的模型,我的数据,我的响应”。Ollama 是目前唯一能在 Windows 10/11、macOS Sonoma、Ubuntu 22.04 上一键安装、无需 Docker、模型文件路径完全透明、HTTP 接口无认证的本地大模型运行时。ollama list命令输出的每个模型名(如llama3:8b、qwen2:7b),背后都是你硬盘上一个清晰的.bin文件。相比之下,任何需要配置CUDA_VISIBLE_DEVICES、手动拉取 HuggingFace 模型权重、或依赖云 API Key 的方案,都会在“心流”被打断的瞬间杀死 vibe。我试过用transformers+llama.cpp自建服务,启动时间平均 42 秒,而ollama run llama3:8b首次加载后,后续请求秒级响应——这对“想到就问、问完就写”的节奏至关重要。

第二,性能与可靠性边界。Python 是胶水语言,但它不适合干脏活累活。比如你需要批量调用 Ollama 处理 500 个 JSON 文件,每个文件生成 3 个不同风格的 Prompt 结果。用纯 Python 的requests+threading,遇到网络抖动或模型 OOM,整个进程就挂了,日志断在半路。而 Rust 的tokio+reqwest天然支持异步、超时控制、重试策略和内存安全。我用 Rust 写了一个ollama-batcher工具:它读取一个 YAML 配置,定义输入文件路径、Prompt 模板、模型名、最大并发数(默认 4)、单次请求超时(30s)、失败重试次数(2)。所有错误(HTTP 500、连接超时、JSON 解析失败)都被捕获并写入结构化错误日志,主流程永不中断。这个工具本身只有 320 行代码,但支撑了我过去三个月所有批量 AI 编程任务。Rust 不是用来炫技的,它是用来守住“不崩溃”这条底线的。

第三,生态协同效率。Python 的pandas、fastapi、pydantic让数据处理、API 快速搭建、类型校验一气呵成;Rust 的serde、axum、sqlx则提供同等强度的底层能力。最关键的是,两者都能通过标准 HTTP 协议无缝对话 Ollama。你不需要在 Python 里嵌入 Rust 代码,也不需要在 Rust 里解析 Python 的 AST。大家各司其职:Python 负责“业务逻辑快”,Rust 负责“基础设施稳”,Ollama 负责“知识供给准”。这种松耦合,正是 vibe-coding 能长期可持续的关键——你可以今天用 Python 写个脚本调 Ollama 生成 SQL,明天用 Rust 写个 CLI 工具管理你的模型版本,所有日志都遵循同一套命名和结构规范,天然形成个人知识图谱。

2.3 架构设计:极简主义下的可扩展性

vibe-coding 日志的物理形态,就是一个按日期组织的 Markdown 文件夹:

vibe-log/ ├── 2024/ │ ├── 06-June/ │ │ ├── 2024-06-01.md │ │ ├── 2024-06-02.md │ │ └── ... │ └── 07-July/ ├── templates/ │ ├── python-task.md # Python 类任务模板 │ ├── rust-module.md # Rust 类任务模板 │ └── ollama-debug.md # Ollama 故障排查模板 └── tools/ ├── batcher/ # Rust 编写的 ollama-batcher 源码 └── utils/ # Python 辅助脚本(如日志归档、关键词搜索)

这个结构看似简单,却暗含深意。没有数据库,没有 Web UI,没有账号体系——所有内容都是纯文本,用 VS Code 或 Obsidian 就能随时编辑、搜索、链接。为什么拒绝数据库?因为日志的核心价值不在“查询”,而在“重读”。半年后你翻到一篇关于“用 Ollama 优化正则表达式”的日志,真正有用的是当时你卡在哪、怎么突破的、有哪些意外收获,而不是“查出 2024 年所有含 regex 的日志”。纯文本保证了零迁移成本:今天用 Git 同步到 GitHub,明天换 Obsidian,后天导出 PDF 打印,格式永远不丢。

可扩展性体现在两个层面:横向和纵向。横向扩展,指新增日志类型。比如你开始研究 AI Agent,就可以新建templates/agent-flow.md,定义标准字段:Agent Goal、Tool List、Memory Schema、Failure Mode。纵向扩展,指单篇日志的深度。我强制要求每篇日志必须包含## 3. 实操过程与核心环节实现和## 4. 常见问题与排查技巧实录两大部分,前者记录“我做了什么”,后者记录“我踩了什么坑”。这种结构不是为了好看,而是为了强迫自己把模糊的“感觉”转化为可复现的“步骤”。很多所谓“玄学”的 vibe,其实就藏在那些被忽略的细节里:比如 Ollama 在 Windows 上默认使用qemu模拟器运行 macOS 模型,而qwen2:7b的qemu版本必须 >= 8.2.0,否则会静默崩溃——这个信息,只会在你某次ollama run qwen2:7b卡住 3 分钟后,翻看ollama logs时才看到。而 vibe-coding 日志,就是专门用来收容这些“3 分钟后才懂”的真相的。

3. 核心细节解析与实操要点:从环境准备到日志规范

3.1 环境准备:三步到位,拒绝“配置地狱”

很多人卡在第一步:Ollama 装不上,或者装上了但模型跑不起来。这不是你的问题,是官方文档没说清楚的“隐性依赖”。我用一台全新的 Windows 11 22H2 笔记本(i5-1135G7, 16GB RAM)实测,完整走通流程只需三步,且每一步都有明确的验证方式:

第一步:安装 Ollama,但必须指定安装路径
官网下载OllamaSetup.exe后,不要直接双击。右键 → “以管理员身份运行”,在安装向导中,务必取消勾选“Add Ollama to PATH”,然后手动将安装路径设为C:\ollama(或其他不含空格和中文的纯英文路径)。为什么?因为 Ollama 的 Windows 服务在启动时,会读取注册表中的PATH值,如果其中包含旧版 Python 或 MinGW 的路径,会导致ollama serve启动失败,错误日志里只显示Failed to start service,毫无线索。而C:\ollama是硬编码的安全路径,绕过所有 PATH 冲突。安装完成后,打开 PowerShell,执行:

& "C:\ollama\ollama.exe" --version # 正常输出:ollama version is 0.1.43

第二步:下载模型,但要用--name参数重命名
Ollama 默认下载的模型名(如llama3:8b)太长,容易在命令行里输错。更重要的是,不同版本的同名模型(如llama3:8b和llama3:latest)可能行为不一致。我的做法是:所有模型都用--name指定一个短且语义化的别名。例如:

ollama pull llama3:8b --name l3-8b ollama pull qwen2:7b --name qw-7b ollama pull phi3:3.8b --name p3-38b

这样,后续所有调用都用ollama run l3-8b,简洁、不易错、版本明确。验证方式:ollama list输出应为:

NAME ID SIZE MODIFIED l3-8b 1a2b3c... 4.7 GB 2 hours ago qw-7b 4d5e6f... 4.2 GB 1 hour ago p3-38b 7g8h9i... 2.1 GB 30 minutes ago

第三步:验证服务,但要检查三个端口
Ollama 启动后,默认监听127.0.0.1:11434(HTTP API)和127.0.0.1:11435(WebSocket)。但很多人不知道,它还会悄悄开一个127.0.0.1:11436用于内部健康检查。用 PowerShell 执行:

netstat -ano | findstr :1143 # 应看到三行,PID 对应 ollama.exe 进程 curl http://localhost:11434/api/tags # 应返回 JSON,包含你下载的所有模型信息

如果curl返回Connection refused,说明服务没起来。此时不要重启,先查日志:Get-Content "C:\ollama\logs\ollama.log" -Tail 20。90% 的情况是显存不足(Windows 默认只给 WSL2 分配 2GB 内存),解决方案是创建C:\ollama\.wslconfig文件,内容为:

[wsl2] memory=4GB swap=2GB

然后在 PowerShell 中执行wsl --shutdown,再重启 Ollama。

提示:Windows 用户请务必关闭 Windows Defender 的“实时保护”,它会扫描 Ollama 模型文件(单个 >4GB),导致首次ollama run卡死 5 分钟以上。临时关闭命令:Set-MpPreference -DisableRealtimeMonitoring $true。

3.2 日志结构规范:让每一篇都成为可检索的知识资产

一篇合格的 vibe-coding 日志,不是流水账,而是一个微型项目文档。我强制采用五段式结构,每段都有明确目的和填写指南:

# [日期] [领域] [一句话目标]
这是标题,也是索引。[领域]必须是Python、Rust、Ollama、FastAPI、Agent等明确标签,不能写“AI 编程”。[一句话目标]要具体到可验证,例如:“用 Rust 实现 Ollama 模型加载状态轮询” 而不是 “学习 Rust 异步编程”。这个标题会自动成为文件名(如2024-06-12-Rust-ollama-model-polling.md),方便全局搜索。

## 1. 背景与动机
回答“为什么今天要干这个”。不是泛泛而谈“AI 很火”,而是描述一个具体的、让你皱眉的痛点。例如:“昨天部署的 FastAPI 服务,用户反馈‘生成报告慢’,监控显示 80% 时间耗在ollama run调用上。但ollama list显示模型已加载,为什么每次调用还要初始化?” 这个背景,决定了后续所有技术选型的方向。

## 2. 方案设计与选型理由
这是日志的灵魂段落。必须列出至少两个备选方案,并用 bullet point 写明放弃原因。例如,针对“模型加载慢”问题:

  • ✅ 方案 A:用 Rust 写一个常驻进程,预加载模型到内存,提供 HTTP 接口。理由:Ollama 本身不支持多客户端共享模型实例,Rust 的Arc<Mutex<>>可安全共享模型句柄,tokio::sync::Semaphore控制并发。
  • ❌ 方案 B:升级硬件(加内存/换 GPU)。理由:成本高,且无法解决 Ollama 本身的设计限制(每个ollama run是独立进程)。
  • ❌ 方案 C:换用 vLLM。理由:vLLM 需要 CUDA,而我的测试机是核显,不支持。

## 3. 实操过程与核心环节实现
这是技术干货集中营。必须包含可复制的代码块、命令行、配置片段。重点不是“贴代码”,而是“解释为什么这么写”。例如,Rust 中创建 Ollama 客户端:

// src/main.rs use reqwest; use serde_json::json; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let client = reqwest::Client::builder() .timeout(std::time::Duration::from_secs(30)) // 关键!Ollama 响应可能超 10s .connect_timeout(std::time::Duration::from_secs(5)) .build()?; // 构造符合 Ollama /api/chat 接口的 JSON let payload = json!({ "model": "l3-8b", "messages": [ {"role": "user", "content": "用 Rust 写一个函数,输入 Vec<i32>,返回偶数平方和"} ], "stream": false // 关键!vibe-coding 日志需要完整响应,不 stream }); let res = client .post("http://localhost:11434/api/chat") .json(&payload) .send() .await?; let text = res.text().await?; println!("{}", text); Ok(()) }

这里特意标注了timeout和stream: false两个关键点。前者是因为 Ollama 在加载大模型时,首次响应可能长达 25 秒,不设 timeout 会导致整个 Tokio runtime 卡死;后者是因为stream: true返回的是 SSE 流,而日志需要的是结构化 JSON 响应,便于后续解析。

## 4. 常见问题与排查技巧实录
这是日志的“防坑宝典”。必须记录真实发生的问题,不能写“理论上可能”。例如:

  • 问题:ollama run l3-8b在 Windows 上报错failed to create model: invalid argument
    排查:ollama logs显示qemu: could not open disk image ...: No such file or directory
    根因:WSL2 的/tmp目录被 Ollama 误用,而 WSL2 的/tmp是内存盘,重启后清空。
    解决:在C:\ollama\下创建tmp文件夹,修改系统环境变量TMP=C:\ollama\tmp,重启 Ollama 服务。

## 5. 总结与下一步
不是总结,而是“行动清单”。例如:“✅ 已实现模型状态轮询,准确率 100%;⚠️ 发现 Ollama 的/api/ps接口不返回模型加载进度,下一步:用ollama show命令解析 stdout 获取进度条文本”。

3.3 Rust 与 Python 协作模式:谁该做什么,边界在哪

Rust 和 Python 在 vibe-coding 中绝不是“谁取代谁”的关系,而是“谁守门,谁跑腿”的分工。我画了一张实际工作中每天都在用的协作流程图(文字版):

[Python 脚本] ↓ (调用 subprocess 或 HTTP) [CLI 工具 / Rust 服务] ↓ (调用 Ollama HTTP API) [Ollama 本地模型] ↑ (返回 JSON 响应) [CLI 工具 / Rust 服务] ↑ (结构化处理、错误重试、日志记录) [Python 脚本] ↑ (接收 clean data,进行业务逻辑:pandas 清洗、matplotlib 绘图、fastapi 返回)

Python 的核心职责:

  • 快速原型:用pandas读取 100 个 CSV,用litellm调 Ollama 生成 100 条摘要,5 分钟搞定。
  • 数据 glue:把 Ollama 返回的 JSON 字符串,用pydantic解析成强类型对象,再喂给SQLAlchemy写入数据库。
  • 用户界面:fastapi提供 Web API,streamlit做内部演示看板。

Rust 的核心职责:

  • 基础设施守护者:ollama-batcher批量处理时,一个请求失败,绝不影响其他 499 个;内存泄漏?valgrind或cargo-leak一跑就知。
  • 性能敏感任务:比如你要实时分析 1000 QPS 的 API 日志,用 Python 的re模块匹配正则,CPU 占用 95%;用 Rust 的regexcrate,CPU 占用 12%,且无 GIL 锁。
  • 跨平台分发:编译成单个ollama-batcher.exe,扔给同事,双击即用,不用管他装没装 Python。

关键协作接口:

  • HTTP 是黄金标准。Rust 用axum写一个/v1/ollama/batch接口,Python 用requests.post调用。好处是解耦、可监控、可加 auth。
  • Subprocess 是快捷通道。当 Rust 工具只需要返回一个字符串结果时(如ollama-batcher --input data.json --prompt "summarize"),Python 用subprocess.run()更轻量。
  • 绝对禁止:Python 里用ctypes调 Rust 动态库,或 Rust 里用pyo3嵌入 Python 解释器。这违背 vibe-coding “简单、可靠、易调试”的初衷。

注意:Rust 调用 Ollama 时,reqwest的Client必须是Arc共享的,且timeout必须设为Duration::from_secs(30)。我踩过坑:用Client::new()在每个请求里新建 client,会导致 TCP 连接池耗尽,第 1001 个请求直接Connection refused。而30s是经过实测的:qwen2:7b在 i5-1135G7 上,首次响应平均 22 秒,留 8 秒 buffer 刚好。

4. 实操过程与核心环节实现:从零构建一个 vibe-coding 日志工作流

4.1 第一天:初始化你的 vibe-log 仓库

不要从写第一篇日志开始,先搭好“舞台”。在任意目录下,执行:

mkdir vibe-log && cd vibe-log git init echo "# vibe-log" > README.md mkdir -p 2024/{06-June,07-July} templates tools/batcher tools/utils

现在,templates/下放三个基础模板。以python-task.md为例,内容如下(注意:这是你未来所有日志的“骨架”,务必保存好):

# [DATE] Python [ONE-SENTENCE-GOAL] ## 1. 背景与动机 - 描述触发本次任务的具体场景、用户反馈或技术瓶颈 - 量化问题(如“API 响应 P95 > 5s”、“手动处理 200 个文件需 2 小时”) ## 2. 方案设计与选型理由 - ✅ 方案 A:[描述] —— 理由:[具体优势,最好有数据] - ❌ 方案 B:[描述] —— 理由:[具体缺陷,最好有失败案例] - ❌ 方案 C:[描述] —— 理由:[同上] ## 3. 实操过程与核心环节实现 ### 3.1 环境与依赖 - Python 版本:`python --version` → [填入] - 关键包:`pip list | grep -E "(ollama|fastapi|pandas)"` → [填入] - Ollama 模型:`ollama list` → [填入] ### 3.2 核心代码与命令 ```python # 你的核心代码,必须可运行 import requests # 示例:调用 Ollama 生成代码 response = requests.post( "http://localhost:11434/api/generate", json={ "model": "p3-38b", "prompt": "用 Python 写一个函数,计算斐波那契数列第 n 项,要求时间复杂度 O(1)", "stream": False } ) print(response.json()["response"])

3.3 关键参数与选择依据

  • stream=False:为什么不用流式?→ [你的理由]
  • timeout=30:为什么是 30 秒?→ [你的实测数据]

4. 常见问题与排查技巧实录

问题现象排查命令根本原因解决方案
requests.exceptions.Timeoutcurl -v http://localhost:11434/api/tagsOllama 服务未启动ollama serve
KeyError: 'response'echo $response.text模型返回 error 字段检查response.json().get("error")

5. 总结与下一步

  • ✅ 已完成:[具体成果]
  • ⚠️ 待优化:[下一个小目标]
  • 📌 备注:[任何额外提醒]
把这个模板保存为 `templates/python-task.md`。同理,创建 `rust-module.md` 和 `ollama-debug.md`。**这一步做完,你已经拥有了一个专业级 vibe-coding 日志系统的 80%**。剩下的 20%,就是每天往里面填内容。 ### 4.2 第二天:用 Python 写第一个 vibe-coding 脚本 目标:自动化生成本周的周报草稿。传统做法是打开 Excel,复制粘贴,写 Word。vibe-coding 做法:用 Python 读取 Jira 导出的 CSV,调 Ollama 生成周报段落。 **步骤 1:准备数据** 从 Jira 导出本周 issue 列表为 `jira-this-week.csv`,确保包含 `Summary`、`Status`、`Assignee` 三列。 **步骤 2:编写 `generate-weekly.py`** ```python #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ vibe-coding 日志:2024-06-12-Python-jira-weekly-report 目标:用 Ollama 为 Jira issue 生成自然语言周报 """ import csv import requests import sys from datetime import datetime def load_issues(csv_path): """读取 CSV,返回字典列表""" issues = [] with open(csv_path, newline='', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: # 过滤掉已关闭的 issue if row['Status'] not in ['Done', 'Closed']: issues.append(row) return issues def generate_report(issues): """调用 Ollama 生成周报""" if not issues: return "本周无进行中任务。" # 构造 Prompt:强调“简洁、专业、用中文” prompt = f"""你是一位资深项目经理,请根据以下 Jira issue 列表,生成一份简洁专业的中文周报。 要求: - 用一段话总结,不超过 150 字 - 突出进展、风险、下一步 - 不要出现“根据您提供的信息”等废话 - issue 列表:{issues}""" try: response = requests.post( "http://localhost:11434/api/generate", json={ "model": "p3-38b", "prompt": prompt, "stream": False, "options": {"temperature": 0.3} # 关键!降低随机性,保证周报稳定性 }, timeout=45 # 给大模型足够时间思考 ) response.raise_for_status() return response.json()["response"].strip() except Exception as e: return f"生成失败:{e}" if __name__ == "__main__": if len(sys.argv) != 2: print("用法:python generate-weekly.py jira-this-week.csv") sys.exit(1) issues = load_issues(sys.argv[1]) report = generate_report(issues) # 输出到文件,文件名含日期 date_str = datetime.now().strftime("%Y-%m-%d") with open(f"weekly-report-{date_str}.md", "w", encoding="utf-8") as f: f.write(f"# {date_str} 周报\n\n{report}\n\n*生成时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}*") print(f"周报已生成:weekly-report-{date_str}.md")

步骤 3:运行并记录日志
在终端执行:

python generate-weekly.py jira-this-week.csv

成功后,创建2024/06-June/2024-06-12.md,内容就是上面那个python-task.md模板,把## 3. 实操过程替换为你的实际代码,## 4. 常见问题填入你遇到的真实问题(比如第一次运行时忘了ollama serve,报Connection refused)。

实操心得:options: {"temperature": 0.3}这个参数是血泪教训。最初用默认0.8,生成的周报每天风格迥异,有时像诗人,有时像律师。降到0.3后,输出稳定在“专业项目经理”语调,且重复调用 10 次,结果一致性达 92%。这就是 vibe-coding 的精髓:不是追求“最聪明”,而是追求“最可靠”。

4.3 第三天:用 Rust 构建你的第一个 vibe-coding 工具

目标:解决一个高频痛点——Ollama 模型下载太慢。国内用户常抱怨ollama pull llama3:8b卡在 99%,因为默认从registry.ollama.ai拉取。我们要做一个 Rust 工具,支持从国内镜像站(如https://mirror.ollama.com)下载。

步骤 1:初始化项目

cd tools/batcher cargo new ollama-mirror-puller --bin cd ollama-mirror-puller

步骤 2:编写src/main.rs

use clap::Parser; use reqwest; use std::path::PathBuf; use tokio; #[derive(Parser, Debug)] #[command(author, version, about, long_about = None)] struct Args { /// 模型名称,如 llama3:8b #[arg(short, long)] model: String, /// 镜像源 URL,如 https://mirror.ollama.com #[arg(short, long, default_value = "https://registry.ollama.ai")] mirror: String, /// 保存路径,默认为当前目录 #[arg(short, long, default_value = ".")] output: PathBuf, } #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let args = Args::parse(); // 构造镜像 URL:https://mirror.ollama.com/library/llama3:8b let url = format!("{}/library/{}", args.mirror.trim_end_matches('/'), args.model); println

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询