hihoran

工作里的坑、生活里的碎片、偶尔想明白的事,都先随手放在这里。

Claude Code 如何判断工具调用该并发还是串行?

Claude Code 如何判断工具调用该并发还是串行? 在 Claude Code 里,模型经常会调用工具,比如读文件、搜索代码、执行 Bash 命令、编辑文件等。 一个很自然的问题是: Claude Code 是怎么知道多个工具应该并发执行,还是一个一个串行执行的? 答案可以概括为一句话: 模型负责决定“这一轮要不要发多个工具调用”,客户端负责判断“这些工具能不能安全并发执行”。 一、整体流程 Claude Code 并不是靠模型返回一个明确的 parallel: true 或 serial: true 字段来判断。 它的逻辑分成两层: 提示词层:告诉模型什么时候应该一次性发多个工具调用 执行层:客户端根据工具的安全属性决定是否真的并发执行 流程大概如下: flowchart TD A[用户提出任务] --> B[系统提示词指导模型] B --> C{任务之间是否独立?} C -->|独立| D[模型在同一轮返回多个 tool_use] C -->|依赖| E[模型先返回一个 tool_use] D --> F[客户端收到多个工具调用] E --> F F --> G{工具是否并发安全?} G -->|是| H[并发执行] G -->|否| I[串行执行] H --> J[返回 tool_result] I --> J J --> K[模型继续下一轮推理] 二、模型侧:通过提示词引导并发 Claude Code 的系统提示词里有类似这样的规则: ...

2026-04-07 · 2 分钟 · horan

Go + SQLite FTS5 + BM25 + 中文分词

Go + SQLite FTS5 + BM25 + 中文分词 SQLite 自带 FTS5 全文检索模块,也内置了 bm25() 排序函数。对于英文或已经用空格分隔的文本,FTS5 可以直接建立索引;但中文没有天然空格,unicode61 tokenizer 不知道“孙悟空大闹天宫”应该切成哪些词。 所以比较稳的做法是: 在 Go 层先做中文分词,把分词后的 token 用空格拼起来,再交给 SQLite FTS5。 这篇文章整理一个最小可落地的方案:普通表保存原文,FTS5 表保存分词后的索引文本,查询时同样先分词,再用 MATCH 召回、bm25() 排序。 核心流程 flowchart LR A["原始文档"] --> B["Go 中文分词"] B --> C["写入 FTS5 索引表"] D["用户查询"] --> E["Go 查询分词"] E --> F["构造 FTS5 Query"] F --> G["MATCH 召回"] G --> H["BM25 排序"] H --> I["Join 原文表"] 这里有两个关键点: 写入索引和用户查询要使用同一套分词策略。 FTS5 表里的 rowid 最好和业务表的 id 对齐,方便查回原文。 建表 普通表保存原始数据: ...

2026-04-01 · 4 分钟 · horan

pgvector 向量索引

向量相似度、召回率与向量索引:从 HNSW 到 IVFFlat 向量检索的核心问题是: 给定一个查询向量,如何从大量向量中快速找出最相似的 topK 个结果。 在小数据量下,可以直接暴力计算所有向量距离。但当数据达到百万、千万甚至更大规模时,就需要向量索引,例如 HNSW、IVFFlat、DiskANN 等。 本文整理向量相似度、召回率、pgvector、Milvus、HNSW、IVFFlat 的基本原理和工程选择。 1. 常见向量相似度计算方法 1.1 余弦相似度 Cosine Similarity 余弦相似度衡量两个向量方向是否接近: 1 cos(a, b) = (a · b) / (||a|| ||b||) 越接近 1 越相似。 适合: 文本 embedding 语义搜索 RAG 检索 向量长度不重要,只关心方向的场景 在大模型 embedding 检索里,余弦相似度非常常见。 1.2 点积 Dot Product / Inner Product 1 sim(a, b) = a · b 如果向量已经归一化,点积和余弦相似度等价。 适合: 已归一化 embedding 推荐系统 最大内积搜索 MIPS 注意:未归一化时,点积会受向量模长影响。 1.3 欧氏距离 L2 Distance 1 dist(a, b) = sqrt(sum((ai - bi)^2)) 距离越小越相似。 ...

2026-02-02 · 6 分钟 · horan