[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-kreeben--resin":3,"tool-kreeben--resin":61},[4,18,26,36,44,53],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",155373,2,"2026-04-14T11:34:08",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":32,"last_commit_at":42,"category_tags":43,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",108322,"2026-04-10T11:39:34",[14,15,13],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":32,"last_commit_at":50,"category_tags":51,"status":17},6121,"gemini-cli","google-gemini\u002Fgemini-cli","gemini-cli 是一款由谷歌推出的开源 AI 命令行工具，它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言，它提供了一条从输入提示词到获取模型响应的最短路径，无需切换窗口即可享受智能辅助。\n\n这款工具主要解决了开发过程中频繁上下文切换的痛点，让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用，还是执行复杂的 Git 操作，gemini-cli 都能通过自然语言指令高效处理。\n\n它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口，具备出色的逻辑推理能力；内置 Google 搜索、文件操作及 Shell 命令执行等实用工具；更独特的是，它支持 MCP（模型上下文协议），允许用户灵活扩展自定义集成，连接如图像生成等外部能力。此外，个人谷歌账号即可享受免费的额度支持，且项目基于 Apache 2.0 协议完全开源，是提升终端工作效率的理想助手。",100752,"2026-04-10T01:20:03",[52,13,15,14],"插件",{"id":54,"name":55,"github_repo":56,"description_zh":57,"stars":58,"difficulty_score":32,"last_commit_at":59,"category_tags":60,"status":17},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,"2026-04-06T19:52:38",[52,14],{"id":62,"github_repo":63,"name":64,"description_en":65,"description_zh":66,"ai_summary_zh":66,"readme_en":67,"readme_zh":68,"quickstart_zh":69,"use_case_zh":70,"hero_image_url":71,"owner_login":72,"owner_name":73,"owner_avatar_url":74,"owner_bio":75,"owner_company":75,"owner_location":76,"owner_email":77,"owner_twitter":75,"owner_website":75,"owner_url":78,"languages":79,"stars":88,"forks":89,"last_commit_at":90,"license":91,"difficulty_score":92,"env_os":93,"env_gpu":94,"env_ram":94,"env_deps":95,"category_tags":99,"github_topics":101,"view_count":32,"oss_zip_url":75,"oss_zip_packed_at":75,"status":17,"created_at":112,"updated_at":113,"faqs":114,"releases":150},7528,"kreeben\u002Fresin","resin","Language model search engine built on a vector database and an anything key\u002Fvalue store.","Resin 是一款专为大语言模型打造的向量搜索引擎，同时兼具高性能键值存储功能。它旨在解决传统系统在高效处理字符串、执行向量运算以及灵活存储多样化数据时的架构复杂与性能瓶颈问题，让开发者能够轻松从文本构建语言模型，或从字节数组生成通用数据模型。\n\n这款工具特别适合后端开发者、AI 研究人员以及需要构建自定义搜索基础设施的技术团队使用。如果你正在寻找一个轻量级、低依赖且易于扩展的基础组件来加速原型开发或优化现有架构，Resin 是理想之选。\n\n其核心技术亮点在于独特的“列式键值存储”设计：支持快速的页面读写操作，并能智能处理键的重复插入——通过链表机制将新值追加到已有键后，而非简单覆盖或拒绝。此外，Resin 内置了实用的文本分析工具和命令行实用程序，方便用户构建词库和比对字符串。整体架构简洁清晰，对数值型键提供了确定性的排序与查找优化，确保在大规模数据场景下依然保持高速响应。","# Resin\r\n\r\n## Introduction\r\n\r\nThis is a reboot of the [old Resin search engine\u002Fmachine learning project](https:\u002F\u002Fgithub.com\u002Fkreeben\u002Fresin\u002Ftree\u002Fd20b73d1baaef82f2eaeeb4de739876e23d94a26) with a more sane architecture but not yet as feature complete.\r\n\r\nResin is a vector space search engine, a vector database and an anything key\u002Fvalue store. It powers efficient string processing, vector operations, and custom storage primitives designed for speed and simplicity. It can produce large language models out of strings and large anything models out of byte arrays.\r\n\r\n## Highlights\r\n- Fast key\u002Fvalue storage with page\u002Fcolumn readers and writers\r\n- Practical text analysis utilities for strings, bags of words\u002Fchars, and vectors\r\n- Commandline tools for building and validating lexicons and comparing strings\r\n- Clean, dependency light design that is easy to extend\r\n\r\n## Key\u002FValue Column Semantics\r\n\r\n### ColumnWriter\r\n- **TryPut(TKey key, ReadOnlySpan\u003Cbyte> value)**\r\n  - Inserts the key\u002Fvalue only if the key does not exist in the column-wide snapshot (previous pages included).\r\n  - Returns `false` when the key already exists; otherwise writes to the current page.\r\n  - Triggers page serialization when the page becomes full.\r\n\r\n- **PutOrAppend(TKey key, ReadOnlySpan\u003Cbyte> value)**\r\n  - If the key exists anywhere in the column, no new key is stored. Instead, values are linked using a fixed-size node (`LinkedAddressNode`) written to the value stream.\r\n  - Tail-appending order: the original value remains first, followed by each appended value in insertion order. Address entry for the key points to the list head when linking is active.\r\n  - If the key does not exist in the column snapshot, operates at the page level (insert\u002Fappend within the current page) and may serialize when full.\r\n\r\n### ColumnReader\r\n- **Get(TKey key)**\r\n  - Returns the value for `key`. If the key’s address entry points to a linked-list head, returns the concatenated bytes of all linked values.\r\n  - Returns `ReadOnlySpan\u003Cbyte>.Empty` when the key does not exist.\r\n\r\n- **GetMany(TKey key, out int count)**\r\n  - Returns a concatenated `ReadOnlySpan\u003Cbyte>` of all values linked for `key` and outputs the number of items via `count`.\r\n  - When the key points to a single raw value, returns that value and `count = 1`. If the key does not exist, returns empty and `count = 0`.\r\n\r\n### TKey Restrictions for ColumnWriter\u002FColumnReader\r\nWhen working with `TKey`, please adhere to the following restrictions to ensure proper functionality:\r\n\r\n- `TKey` must be a value type (`struct`) and implement both `IEquatable\u003CTKey>` and `IComparable\u003CTKey>`.\r\n- Ordering and equality must be stable across sessions. The column-wide key snapshot uses `BinarySearch`\u002Fsorting, so `CompareTo` must define a strict total order consistent with `Equals`.\r\n- Page-level storage operates on `long` keys. For primitive numeric keys:\r\n  - `double` and `float` are stored via their IEEE bit representations.\r\n  - `int` and `long` are stored directly.\r\n  - Other `TKey` types are hashed via `GetHashCode()` to a `long` for page-level operations.\r\n- **Recommendation:** Use numeric primitives (`double`, `float`, `int`, `long`) for deterministic ordering and lookup. If using a custom struct, ensure:\r\n  - `Equals` and `CompareTo` are consistent and deterministic.\r\n  - `GetHashCode()` is stable and evenly distributed; collisions affect page-level operations since non-primitive keys are hashed to `long`.\r\n- Keys must be comparable across the entire column; duplicate detection relies on the column snapshot and `BinarySearch` over sorted keys.\r\n\r\n### Column model and set operations\r\n- Each column stores any given `TKey` at most once in its column-wide snapshot (duplicate keys are prevented by both `TryPut` and `PutOrAppend`). This makes columns effectively sets of keys, enabling set operations such as union, intersection, and joins across columns. Linked values (via `PutOrAppend`) attach additional data to the existing key without introducing duplicates.\r\n\r\n### Storage artefacts: *.key, *.adr, *.val\r\n- **.key (Key stream)**\r\n  - Stores the sorted sequence of `TKey` representations per page\u002Fcolumn. Keys are written in fixed-size slots (`sizeof(long)` per entry for page-level storage) and serialized in page batches. The column-wide snapshot is built by reading and sorting this stream.\r\n- **.adr (Address stream)**\r\n  - Stores `Address` structs aligned with `.key` entries. Each `Address` contains `Offset` and `Length`:\r\n    - For raw values: points directly into `.val` (Offset = start of value, Length = byte length).\r\n    - For linked values: points to a `LinkedAddressNode` head in `.val` (Length equals node size). The node chain yields multiple values for a single key.\r\n- **.val (Value stream)**\r\n  - Stores the actual value bytes and any `LinkedAddressNode` headers used for linking. Values are appended at the end of the stream; `LinkedAddressNode`s are also written into `.val` to form singly linked lists via absolute offsets.\r\n\r\n### Immutability of value files\r\n- The `.val` stream is treated as append-only:\r\n  - Existing bytes are never modified in place.\r\n  - New values are written at the end, preserving previously written offsets.\r\n  - Linking does not rewrite existing values; instead, `LinkedAddressNode` headers are appended and previous node’s `NextOffset` is patched by writing a new node and updating pointers via `.adr` alignment.\r\n- Benefits:\r\n  - Stable offsets enable safe caching of addresses and efficient read paths.\r\n  - Appending scales linearly, minimizing fragmentation and avoiding in-place mutations.\r\n  - Historical values remain intact; multi-value chains are expressed via node headers rather than overwriting data.\r\n\r\n## Usage\r\n- Use `Resin.KeyValue` for fast on disk structures and efficient read\u002Fwrite key\u002Fvalue sessions.\r\n- Use `Resin.TextAnalysis` for `StringAnalyzer`, `VectorOperations`, and similarity tooling.\r\n- Use `Resin.WikipediaCommandLine` for commandline tools to build\u002Fvalidate lexicons. See detailed CLI usage and setup in [`Resin.WikipediaCommandLine\u002FREADME.md`](src\u002FResin.WikipediaCommandLine\u002FREADME.md).\r\n\r\n## Contributing\r\nContributions are welcome! Please open an issue or pull request with clear motivation, tests when applicable, and concise changes.\r\n\r\n## License\r\nThis project is licensed under the MIT License.\r\n\r\n## Get help or report issues\r\n\r\n[Report Issues](https:\u002F\u002Fgithub.com\u002Fkreeben\u002Fresin\u002Fissues)\r\n","# Resin\n\n## 简介\n\n这是对[旧版 Resin 搜索引擎\u002F机器学习项目](https:\u002F\u002Fgithub.com\u002Fkreeben\u002Fresin\u002Ftree\u002Fd20b73d1baaef82f2eaeeb4de739876e23d94a26)的重启动作，采用了更为合理的架构，但功能尚未完全完善。\n\nResin 是一款向量空间搜索引擎、向量数据库以及通用键值存储系统。它支持高效的字符串处理、向量运算，并提供专为速度与简洁性设计的自定义存储原语。Resin 可以从字符串中构建大型语言模型，也可以从字节数组中构建大型“任意”模型。\n\n## 亮点\n- 基于页和列的读写器实现的快速键值存储\n- 针对字符串、词袋\u002F字符集以及向量的实用文本分析工具\n- 用于构建和验证词典以及比较字符串的命令行工具\n- 设计简洁、依赖轻量且易于扩展\n\n## 键值列语义\n\n### ColumnWriter\n- **TryPut(TKey key, ReadOnlySpan\u003Cbyte> value)**\n  - 仅当键在列范围内的快照中不存在时（包括之前页面中的键）才插入键值对。\n  - 如果键已存在，则返回 `false`；否则将值写入当前页。\n  - 当页面满时，会触发页面序列化。\n\n- **PutOrAppend(TKey key, ReadOnlySpan\u003Cbyte> value)**\n  - 如果键在列中的任何位置已经存在，则不会存储新键。相反，值会通过固定大小的节点（`LinkedAddressNode`）链接到值流中。\n  - 尾部追加顺序：原始值保持在最前面，随后按插入顺序依次追加其他值。当链接生效时，该键的地址条目会指向链表头。\n  - 如果键在列快照中不存在，则在页面级别操作（在当前页面内插入或追加），并在页面满时可能触发序列化。\n\n### ColumnReader\n- **Get(TKey key)**\n  - 返回指定键的值。如果该键的地址条目指向一个链表头，则返回所有链接值的拼接字节。\n  - 如果键不存在，则返回 `ReadOnlySpan\u003Cbyte>.Empty`。\n\n- **GetMany(TKey key, out int count)**\n  - 返回与指定键关联的所有值的拼接 `ReadOnlySpan\u003Cbyte>`，并通过 `count` 输出项数。\n  - 如果该键指向单个原始值，则返回该值并设置 `count = 1`。如果键不存在，则返回空并设置 `count = 0`。\n\n### TKey 对 ColumnWriter\u002FColumnReader 的限制\n在使用 `TKey` 时，请遵守以下限制以确保正常运行：\n\n- `TKey` 必须是值类型（`struct`），并且同时实现 `IEquatable\u003CTKey>` 和 `IComparable\u003CTKey>`。\n- 排序和相等性必须在不同会话之间保持稳定。列范围内的键快照使用二分查找\u002F排序，因此 `CompareTo` 必须定义一个与 `Equals` 一致的严格全序关系。\n- 页面级存储使用 `long` 类型的键。对于原始数值类型的键：\n  - `double` 和 `float` 通过其 IEEE 位表示形式存储。\n  - `int` 和 `long` 直接存储。\n  - 其他 `TKey` 类型则通过 `GetHashCode()` 哈希为 `long`，以便在页面级别操作。\n- **建议**：使用数值原语类型（`double`、`float`、`int`、`long`）以实现确定性的排序和查找。如果使用自定义结构体，请确保：\n  - `Equals` 和 `CompareTo` 一致且具有确定性。\n  - `GetHashCode()` 稳定且分布均匀；哈希冲突会影响页面级别的操作，因为非原语类型的键会被哈希为 `long`。\n- 键在整个列范围内必须可比较；重复键的检测依赖于列快照和对已排序键的二分查找。\n\n### 列模型与集合操作\n- 每列在其列范围内的快照中最多存储一次给定的 `TKey`（`TryPut` 和 `PutOrAppend` 都会防止重复键）。这使得列实际上成为键的集合，从而可以进行并集、交集和跨列连接等集合操作。通过 `PutOrAppend` 链接的值会在不引入重复键的情况下为现有键附加额外数据。\n\n### 存储文件格式：*.key、*.adr、*.val\n- **.key（键流）**\n  - 存储每页\u002F每列的 `TKey` 表示形式的排序序列。键以固定大小的槽位写入（页面级存储每个条目占用 `sizeof(long)`），并按页面批次进行序列化。列范围内的快照通过读取并排序此流来构建。\n- **.adr（地址流）**\n  - 存储与 `.key` 条目对齐的 `Address` 结构体。每个 `Address` 包含 `Offset` 和 `Length`：\n    - 对于原始值：直接指向 `.val` 流（Offset 为值的起始位置，Length 为字节长度）。\n    - 对于链接值：指向 `.val` 流中的 `LinkedAddressNode` 头（Length 等于节点大小）。通过节点链可以获取单个键的多个值。\n- **.val（值流）**\n  - 存储实际的值字节以及用于链接的 `LinkedAddressNode` 头。值追加写入流的末尾；`LinkedAddressNode` 也会写入 `.val` 流，通过绝对偏移形成单向链表。\n\n### 值文件的不可变性\n- `.val` 流被视为只追加模式：\n  - 已有字节绝不会被就地修改。\n  - 新值始终写入末尾，保留先前写入的偏移量。\n  - 链接操作不会重写现有值；而是追加 `LinkedAddressNode` 头，并通过更新 `.adr` 中的指针来修补前一个节点的 `NextOffset`。\n- 优点：\n  - 稳定的偏移量使得地址可以安全缓存，读取路径也更加高效。\n  - 追加操作呈线性扩展，可最大限度减少碎片并避免就地修改。\n  - 历史值得以完整保留；多值链通过节点头表达，而非覆盖数据。\n\n## 使用方法\n- 使用 `Resin.KeyValue` 实现快速的磁盘结构以及高效的键值读写会话。\n- 使用 `Resin.TextAnalysis` 进行字符串分析、向量运算及相似度计算。\n- 使用 `Resin.WikipediaCommandLine` 提供的命令行工具来构建或验证词典。详细的 CLI 使用方法和设置请参阅 [`Resin.WikipediaCommandLine\u002FREADME.md`](src\u002FResin.WikipediaCommandLine\u002FREADME.md)。\n\n## 贡献\n欢迎贡献！请提交带有明确动机的问题或拉取请求，并在适用时附上测试用例和简洁的更改说明。\n\n## 许可证\n本项目采用 MIT 许可证。\n\n## 获取帮助或报告问题\n\n[报告问题](https:\u002F\u002Fgithub.com\u002Fkreeben\u002Fresin\u002Fissues)","# Resin 快速上手指南\n\nResin 是一个高性能的向量空间搜索引擎、向量数据库及通用键值存储系统。它专为速度和简洁性设计，支持高效的字符串处理、向量运算及自定义存储原语，适用于构建大语言模型底层数据或处理大规模字节数组。\n\n## 环境准备\n\n*   **操作系统**：支持 Windows、Linux 和 macOS（基于 .NET 运行时）。\n*   **前置依赖**：\n    *   **.NET SDK**：版本 6.0 或更高（推荐最新 LTS 版本）。\n    *   **构建工具**：若需从源码编译，请确保安装 Git 和对应的 IDE（如 Visual Studio 2022+ 或 VS Code）。\n*   **国内加速建议**：\n    *   安装 .NET SDK 时，推荐使用 [.NET 中国镜像站](https:\u002F\u002Fdotnet.microsoft.com\u002Fzh-cn\u002Fdownload\u002Fdotnet) 下载安装包。\n    *   若通过命令行安装，可配置国内 NuGet 源以提升包恢复速度：\n      ```bash\n      dotnet nuget add source https:\u002F\u002Fapi.nuget.org\u002Fv3\u002Findex.json -n nuget.org --configfile .\u002FNuGet.Config\n      # 注：实际使用中建议替换为国内镜像地址，如 https:\u002F\u002Fnuget.cnblogs.com\u002Fv3\u002Findex.json\n      ```\n\n## 安装步骤\n\nResin 主要作为库引用或通过源码编译使用。以下是通过 .NET CLI 集成到项目的步骤：\n\n1.  **创建新项目**（如已存在项目可跳过）：\n    ```bash\n    dotnet new console -n ResinDemo\n    cd ResinDemo\n    ```\n\n2.  **添加 Resin 依赖**：\n    由于该项目处于重构阶段，若 NuGet 包尚未发布最新版，建议直接引用源码或本地编译后的 DLL。若官方包可用，执行：\n    ```bash\n    dotnet add package Resin\n    ```\n    \n    *若需从源码构建（推荐获取最新功能）：*\n    ```bash\n    git clone https:\u002F\u002Fgithub.com\u002Fkreeben\u002Fresin.git\n    cd resin\n    dotnet build -c Release\n    # 然后在你的项目中引用生成的 dll 或添加项目引用\n    dotnet add reference ..\u002Fresin\u002Fsrc\u002FResin.KeyValue\u002FResin.KeyValue.csproj\n    dotnet add reference ..\u002Fresin\u002Fsrc\u002FResin.TextAnalysis\u002FResin.TextAnalysis.csproj\n    ```\n\n3.  **验证安装**：\n    确保 `Program.cs` 中可以正常引入命名空间：\n    ```csharp\n    using Resin.KeyValue;\n    using Resin.TextAnalysis;\n    ```\n\n## 基本使用\n\nResin 的核心功能分为高速键值存储 (`Resin.KeyValue`) 和文本\u002F向量分析 (`Resin.TextAnalysis`)。\n\n### 1. 初始化键值存储 (ColumnWriter\u002FColumnReader)\n\nResin 使用列式存储模型，数据保存在 `.key` (键), `.adr` (地址), `.val` (值) 文件中。\n\n```csharp\nusing System;\nusing System.IO;\nusing Resin.KeyValue;\n\n\u002F\u002F 定义键类型，必须是 struct 且实现 IEquatable 和 IComparable\n\u002F\u002F 推荐使用 int, long, double 等原生数值类型以保证确定性排序\npublic struct MyKey : IEquatable\u003CMyKey>, IComparable\u003CMyKey>\n{\n    public long Id;\n\n    public bool Equals(MyKey other) => this.Id == other.Id;\n    public int CompareTo(MyKey other) => this.Id.CompareTo(other.Id);\n    public override int GetHashCode() => Id.GetHashCode();\n}\n\nclass Program\n{\n    static void Main()\n    {\n        var directory = \".\u002Fresin_data\";\n        if (!Directory.Exists(directory)) Directory.CreateDirectory(directory);\n\n        \u002F\u002F 1. 写入数据 (ColumnWriter)\n        \u002F\u002F TryPut: 仅当键不存在时写入\n        \u002F\u002F PutOrAppend: 若键存在，则将新值链接到旧值之后（形成多值列表）\n        using (var writer = new ColumnWriter\u003CMyKey>(directory, \"my_column\"))\n        {\n            var key1 = new MyKey { Id = 100 };\n            var value1 = System.Text.Encoding.UTF8.GetBytes(\"Hello Resin\");\n            \n            writer.TryPut(key1, value1);\n\n            \u002F\u002F 追加第二个值到同一个键\n            var value2 = System.Text.Encoding.UTF8.GetBytes(\" Appended Data\");\n            writer.PutOrAppend(key1, value2);\n            \n            writer.Dispose(); \u002F\u002F 触发页面序列化\n        }\n\n        \u002F\u002F 2. 读取数据 (ColumnReader)\n        using (var reader = new ColumnReader\u003CMyKey>(directory, \"my_column\"))\n        {\n            var key1 = new MyKey { Id = 100 };\n            \n            \u002F\u002F Get: 返回所有链接值的拼接字节\n            var result = reader.Get(key1);\n            if (!result.IsEmpty)\n            {\n                string content = System.Text.Encoding.UTF8.GetString(result);\n                Console.WriteLine($\"Read Value: {content}\"); \n                \u002F\u002F 输出: Hello Resin Appended Data\n            }\n\n            \u002F\u002F GetMany: 获取拼接值及原始片段数量\n            var manyValues = reader.GetMany(key1, out int count);\n            Console.WriteLine($\"Total segments: {count}\");\n        }\n    }\n}\n```\n\n### 2. 文本分析与向量操作\n\n利用 `Resin.TextAnalysis` 进行字符串处理和向量计算。\n\n```csharp\nusing Resin.TextAnalysis;\n\n\u002F\u002F 初始化分析器\nvar analyzer = new StringAnalyzer();\n\n\u002F\u002F 示例：将字符串转换为词袋（Bag of Words）或特征向量\nstring text = \"Resin is a fast vector search engine\";\nvar tokens = analyzer.Tokenize(text); \u002F\u002F 分词\n\n\u002F\u002F 向量运算示例 (需根据具体 API 版本调整)\n\u002F\u002F 假设已有两个 float 数组代表向量\nfloat[] vecA = new float[] { 1.0f, 0.5f, 0.2f };\nfloat[] vecB = new float[] { 0.9f, 0.6f, 0.1f };\n\n\u002F\u002F 计算余弦相似度或其他向量距离\n\u002F\u002F float similarity = VectorOperations.CosineSimilarity(vecA, vecB); \n\u002F\u002F 注意：具体静态方法名请参考最新源码中的 VectorOperations 类定义\n```\n\n### 3. 命令行工具 (可选)\n\n若需构建或验证词典，可编译并使用 `Resin.WikipediaCommandLine` 工具：\n\n```bash\n# 进入命令行工具目录\ncd src\u002FResin.WikipediaCommandLine\n\n# 运行构建命令 (具体参数参考该目录下的 README)\ndotnet run -- build-lexicon --input .\u002Fdata.txt --output .\u002Flexicon.bin\n```\n\n> **注意**：`TKey` 的设计至关重要。请确保自定义结构体的 `CompareTo` 和 `Equals` 逻辑一致且稳定，否则会导致列快照排序错误或查找失败。优先使用 `int` 或 `long` 作为键可获得最佳性能。","某电商团队正在构建一个实时商品评论语义检索系统，需要从海量历史数据中快速匹配用户查询意图并聚合多版本评论详情。\n\n### 没有 resin 时\n- 传统关系型数据库在处理高维向量相似度搜索时延迟极高，无法在毫秒级返回相关评论。\n- 当同一商品存在多条追加评论时，需编写复杂的关联查询逻辑来拼接数据，代码维护成本高且易出错。\n- 引入重型向量数据库导致依赖臃肿，部署资源消耗大，难以在边缘节点或轻量容器中运行。\n- 自定义键值存储缺乏严格的列级去重机制，容易因并发写入产生重复数据，破坏索引一致性。\n\n### 使用 resin 后\n- 利用内置的向量空间搜索引擎，直接基于评论语义向量进行毫秒级模糊匹配，显著提升检索响应速度。\n- 通过 `PutOrAppend` 语义自动将同一商品 ID 的多条追加评论链接为有序列表，读取时一键获取完整上下文，无需额外 JOIN 操作。\n- 凭借轻量无依赖的架构，将检索服务打包为极小的二进制文件，轻松部署至低资源环境并保持高性能。\n- 依托列级快照与二分查找机制，天然保证键的唯一性与排序稳定性，彻底杜绝数据冗余并简化并发控制逻辑。\n\nresin 通过将向量检索、智能键值存储与极简架构深度融合，让开发者能以最低成本构建高性能的语义数据应用。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fkreeben_resin_28deb5f7.png","kreeben","Marcus Lager","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fkreeben_55de5a56.jpg",null,"Helsingborg","marcuslager@gmail.com","https:\u002F\u002Fgithub.com\u002Fkreeben",[80,84],{"name":81,"color":82,"percentage":83},"C#","#178600",99.5,{"name":85,"color":86,"percentage":87},"Batchfile","#C1F12E",0.5,575,42,"2026-04-01T17:47:02","MIT",4,"","未说明",{"notes":96,"python":97,"dependencies":98},"该项目是一个基于 .NET 的向量空间搜索引擎和键值存储库，并非 Python 工具。README 中未明确列出具体的操作系统、内存或 GPU 硬件需求。其核心依赖为 .NET 运行时环境。主要功能模块包括 Resin.KeyValue（磁盘键值存储）、Resin.TextAnalysis（文本分析与向量操作）以及 Resin.WikipediaCommandLine（命令行工具）。键类型 (TKey) 必须是实现 IEquatable 和 IComparable 的结构体，推荐使用数值原始类型以确保确定性排序。","不适用 (该项目基于 .NET，非 Python)",[],[14,100,35],"其他",[102,103,104,105,106,107,108,109,64,110,111],"information-retrieval","search-engine","vector-space-model","machine-learning","nlu-engine","nlu","search","search-algorithms","vector-space","language-model","2026-03-27T02:49:30.150509","2026-04-15T06:56:53.747599",[115,120,125,130,135,140,145],{"id":116,"question_zh":117,"answer_zh":118,"source_url":119},33756,"在 macOS 上运行 HTTP 服务器时遇到 'System.PlatformNotSupportedException' 错误怎么办？","该错误是由于同步原语在特定平台上不受支持引起的。维护者已通过提交修复了此问题。请拉取 dev 分支的最新代码即可解决。相关修复提交：https:\u002F\u002Fgithub.com\u002Fkreeben\u002Fresin\u002Fcommit\u002Ff596130a72d86a3d301766273bea4380200633cb","https:\u002F\u002Fgithub.com\u002Fkreeben\u002Fresin\u002Fissues\u002F57",{"id":121,"question_zh":122,"answer_zh":123,"source_url":124},33757,"为什么包含许多短词（如 'def con 26 badge ama'）的搜索查询返回结果不佳？","对于 Google、Bing、DuckDuckGo 以及当前的 Resin 搜索引擎来说，由过多短词组成的查询很难找到相关答案，因为短词的句法身份难以编码。网络搜索引擎不能仅依赖句法相似性，必须结合语义相关性。如果引擎的语义能力较弱，通常需要利用用户数据进行二次查询以找到真正的相关性。Resin 目前不收集用户数据，因此正在开发语义分析功能来解决此类问题。","https:\u002F\u002Fgithub.com\u002Fkreeben\u002Fresin\u002Fissues\u002F54",{"id":126,"question_zh":127,"answer_zh":128,"source_url":129},33758,"如何实现线程安全的递增文件 ID 生成器（GetNextChronologicalFileId）？","推荐使用 .NET 的 Interlocked 类来实现无锁且线程安全的计数器。具体代码如下：\nusing System.Threading;\nprivate long currentId;\npublic static long GetNextChronologicalFileId()\n{\n    return Interlocked.Increment(ref currentId);\n}\n程序启动时，可能需要将 currentId 设置为最后提交的 ID 值以继续计数。注意：旧版本中的随机数延迟和非原子操作已被新的索引策略取代，不再存在竞争条件。","https:\u002F\u002Fgithub.com\u002Fkreeben\u002Fresin\u002Fissues\u002F50",{"id":131,"question_zh":132,"answer_zh":133,"source_url":134},33759,"是否可以将 log4net 依赖替换为 Microsoft.Extensions.Logging.Abstractions？","是的，维护者已接受该建议并完成了替换。现在库不再硬依赖特定的日志记录器，而是使用微软标准的日志接口，允许应用程序自行配置日志记录。相关修复提交：https:\u002F\u002Fgithub.com\u002Fkreeben\u002Fresin\u002Fcommit\u002Fb36c01ed2afd950d9f8f2d6a0860d6ba4a730906 和 https:\u002F\u002Fgithub.com\u002Fkreeben\u002Fresin\u002Fcommit\u002F5f85425a0f61bbfbe2b2676d71d72f37677a0bef","https:\u002F\u002Fgithub.com\u002Fkreeben\u002Fresin\u002Fissues\u002F49",{"id":136,"question_zh":137,"answer_zh":138,"source_url":139},33760,"Resin 是否支持 Linux 或跨平台运行？","是的，Resin 基于 .NET Core 构建，而 .NET Core 本身是开箱即用的跨平台框架。因此，Resin 理论上可以在 Linux、macOS 和 Windows 上运行。如果有特定平台的兼容性问题，通常可以通过更新代码或使用 dev 分支解决。","https:\u002F\u002Fgithub.com\u002Fkreeben\u002Fresin\u002Fissues\u002F55",{"id":141,"question_zh":142,"answer_zh":143,"source_url":144},33761,"是否有计划将“概念（concept）”作为与“术语（Term）”同等的一等公民实现？","该功能旨在通过上下文提取含义，构建描述段落或文档的聚合概念，从而在向量空间中比较概念而非术语以提高查询速度。目前该问题尚未完全解决，由于引入了新型索引结构，需要制定新的策略。维护者表示将在稍后处理此功能。","https:\u002F\u002Fgithub.com\u002Fkreeben\u002Fresin\u002Fissues\u002F16",{"id":146,"question_zh":147,"answer_zh":148,"source_url":149},33762,"是否需要为 System.IO 创建抽象层以支持分布式承诺？","维护者评估后认为目前不需要创建 System.IO 的抽象层。虽然初衷是为了承诺数据在多台机器上的持久化状态，但当前架构下该需求并非必需。","https:\u002F\u002Fgithub.com\u002Fkreeben\u002Fresin\u002Fissues\u002F23",[]]