[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-datastax--jvector":3,"tool-datastax--jvector":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 真正成长为懂上",160015,2,"2026-04-18T11:30:52",[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 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",109154,"2026-04-18T11:18:24",[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":76,"owner_location":76,"owner_email":76,"owner_twitter":76,"owner_website":77,"owner_url":78,"languages":79,"stars":96,"forks":97,"last_commit_at":98,"license":99,"difficulty_score":100,"env_os":101,"env_gpu":102,"env_ram":103,"env_deps":104,"category_tags":110,"github_topics":111,"view_count":32,"oss_zip_url":76,"oss_zip_packed_at":76,"status":17,"created_at":119,"updated_at":120,"faqs":121,"releases":151},9172,"datastax\u002Fjvector","jvector","JVector: the most advanced embedded vector search engine","JVector 是一款先进的嵌入式向量搜索引擎，专为解决高维数据下的近似最近邻（ANN）搜索难题而生。在传统方法中，随着数据维度升高，精确搜索的效率会急剧下降至线性扫描水平，而 JVector 通过创新的图索引技术，能够在对数时间内提供高精度的近似结果，显著提升大规模数据集的检索效率。\n\n这款工具特别适合需要构建高性能检索系统的开发者、算法工程师以及研究人员，尤其是那些希望在单机或嵌入式环境中处理海量向量数据的团队。与仅适用于静态数据的传统分区索引不同，JVector 支持动态增量更新，能够灵活应对实时变化的数据场景。\n\n其核心技术亮点在于巧妙融合了 HNSW 的层级结构与 DiskANN 的 Vamana 算法，构建了独特的多层图索引架构。JVector 采用“两阶段搜索”策略：第一阶段利用内存中的压缩向量快速筛选候选集，第二阶段再读取磁盘上的高精度数据进行重排序。这种设计不仅大幅降低了内存占用和延迟，还允许直接构建超出内存容量的超大索引，避免了多索引合并带来的性能损耗。此外，它具备优秀的多线程并发能力，构建速度可随核心数增加线性提升，是打造高效、可扩展向量检索应用的理想选择。","## Introduction to approximate nearest neighbor search\n\nExact nearest neighbor search (k-nearest-neighbor or KNN) is prohibitively expensive at higher dimensions, because approaches to segment the search space that work in 2D or 3D like quadtree or k-d tree devolve to linear scans at higher dimensions.  This is one aspect of what is called “[the curse of dimensionality](https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCurse_of_dimensionality).”\n\nWith larger datasets, it is almost always more useful to get an approximate answer in logarithmic time, than the exact answer in linear time.  This is abbreviated as ANN (approximate nearest neighbor) search.\n\nThere are two broad categories of ANN index:\n* Partition-based indexes, like [LSH or IVF](https:\u002F\u002Fwww.datastax.com\u002Fguides\u002Fwhat-is-a-vector-index) or [SCANN](https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002Fgoogle-research\u002Ftree\u002Fmaster\u002Fscann)\n* Graph indexes, like [HNSW](https:\u002F\u002Farxiv.org\u002Fabs\u002F1603.09320) or [DiskANN](https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fresearch\u002Fproject\u002Fproject-akupara-approximate-nearest-neighbor-search-for-large-scale-semantic-search\u002F)\n\nGraph-based indexes tend to be simpler to implement and faster, but more importantly they can be constructed and updated incrementally.  This makes them a much better fit for a general-purpose index than partitioning approaches that only work on static datasets that are completely specified up front.  That is why all the major commercial vector indexes use graph approaches.\n\nJVector is a graph index that merges the DiskANN and HNSW family trees.\nJVector borrows the hierarchical structure from HNSW, and uses Vamana (the algorithm behind DiskANN) within each layer.\n\n\n## JVector Architecture\n\nJVector is a graph-based index that builds on the HNSW and DiskANN designs with composable extensions.\n\nJVector implements a multi-layer graph with nonblocking concurrency control, allowing construction to scale linearly with the number of cores:\n![JVector scales linearly as thread count increases](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fdatastax_jvector_readme_a3655ef2fd07.png)\n\nThe upper layers of the hierarchy are represented by an in-memory adjacency list per node. This allows for quick navigation with no IOs.\nThe bottom layer of the graph is represented by an on-disk adjacency list per node. JVector uses additional data stored inline to support two-pass searches, with the first pass powered by lossily compressed representations of the vectors kept in memory, and the second by a more accurate representation read from disk.  The first pass can be performed with\n* Product quantization (PQ), optionally with [anisotropic weighting](https:\u002F\u002Farxiv.org\u002Fabs\u002F1908.10396)\n* [Binary quantization](https:\u002F\u002Fhuggingface.co\u002Fblog\u002Fembedding-quantization) (BQ)\n* Fused PQ, where PQ codebooks are written inline with the graph adjacency list\n\nThe second pass can be performed with\n* Full resolution float32 vectors\n* NVQ, which uses a non-uniform technique to quantize vectors with high-accuracy\n\n[This two-pass design reduces memory usage and reduces latency while preserving accuracy](https:\u002F\u002Fthenewstack.io\u002Fwhy-vector-size-matters\u002F).  \n\nAdditionally, JVector is unique in offering the ability to construct the index itself using two-pass searches, allowing larger-than-memory indexes to be built:\n![Much larger indexes](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fdatastax_jvector_readme_7a1260e68548.png)\n\nThis is important because it allows you to take advantage of logarithmic search within a single index, instead of spilling over to linear-time merging of results from multiple indexes.\n\n\n## Getting started with JVector\n\nIntroductory tutorials for JVector are available in [docs\u002Ftutorials](.\u002Fdocs\u002Ftutorials\u002F). Start with the [basic tutorial](.\u002Fdocs\u002Ftutorials\u002F1-intro-tutorial.md) or review [VectorIntro.java](.\u002Fjvector-examples\u002Fsrc\u002Fmain\u002Fjava\u002Fio\u002Fgithub\u002Fjbellis\u002Fjvector\u002Fexample\u002Ftutorial\u002FVectorIntro.java) for a simple example using JVector.\n\nThe older step-by-step guide for JV can be found [here](.\u002Fdocs\u002Flegacy\u002Fjvector-step-by-step.md). New users should start with the tutorials mentioned earler, but the step-by-step guide contains useful commentary for advanced users.\n\n\n## The research behind the algorithms\n\n* Foundational work: [HNSW](https:\u002F\u002Fieeexplore.ieee.org\u002Fabstract\u002Fdocument\u002F8594636) and [DiskANN](https:\u002F\u002Fsuhasjs.github.io\u002Ffiles\u002Fdiskann_neurips19.pdf) papers, and [a higher level explainer](https:\u002F\u002Fwww.datastax.com\u002Fguides\u002Fhierarchical-navigable-small-worlds)\n* [Anisotropic PQ paper](https:\u002F\u002Farxiv.org\u002Fabs\u002F1908.10396)\n* [Quicker ADC paper](https:\u002F\u002Farxiv.org\u002Fabs\u002F1812.09162)\n* [NVQ paper](https:\u002F\u002Farxiv.org\u002Fabs\u002F2509.18471)\n\n## Developing and Testing\nThis project is organized as a [multimodule Maven build](https:\u002F\u002Fmaven.apache.org\u002Fguides\u002Fmini\u002Fguide-multiple-modules.html). The intent is to produce a multirelease jar suitable for use as\na dependency from any Java 11 code. When run on a Java 20+ JVM with the Vector module enabled, optimized vector\nproviders will be used. In general, the project is structured to be built with JDK 20+, but when `JAVA_HOME` is set to\nJava 11 -> Java 19, certain build features will still be available.\n\nBase code is in [jvector-base](.\u002Fjvector-base) and will be built for Java 11 releases, restricting language features and APIs\nappropriately. Code in [jvector-twenty](.\u002Fjvector-twenty) will be compiled for Java 20 language features\u002FAPIs and included in the final\nmultirelease jar targeting supported JVMs. [jvector-multirelease](.\u002Fjvector-multirelease) packages [jvector-base](.\u002Fjvector-base) and [jvector-twenty](.\u002Fjvector-twenty) as a\nmultirelease jar for release. [jvector-examples](.\u002Fjvector-examples) is an additional sibling module that uses the reactor-representation of\njvector-base\u002Fjvector-twenty to run example code. [jvector-tests](.\u002Fjvector-tests) contains tests for the project, capable of running against\nboth Java 11 and Java 20+ JVMs.\n\nTo run tests, use `mvn test`. To run tests against Java 20+, use `mvn test`. To run tests against Java 11, use `mvn -Pjdk11 test`.\nTo run a single test class, use the Maven Surefire test filtering capability, e.g.,\n`mvn -Dsurefire.failIfNoSpecifiedTests=false -Dtest=TestNeighborArray test`.\nYou may also use method-level filtering and patterns, e.g.,\n`mvn -Dsurefire.failIfNoSpecifiedTests=false -Dtest=TestNeighborArray#testRetain* test`.\n(The `failIfNoSpecifiedTests` option works around a quirk of surefire: it is happy to run `test` with submodules with empty test sets,\nbut as soon as you supply a filter, it wants at least one match in every submodule.)\n\nYou can run `SiftSmall` and `Bench` directly to get an idea of what all is going on here. `Bench` will automatically download required datasets to the `dataset_cache` directory.\nThe files used by `SiftSmall` can be found in the [siftsmall directory](.\u002Fsiftsmall) in the project root.\n\nTo run either class, you can use the Maven exec-plugin via the following incantations:\n\n> `mvn compile exec:exec@bench`\n\nor for Sift:\n\n> `mvn compile exec:exec@sift`\n\n`Bench` takes an optional `benchArgs` argument that can be set to a list of whitespace-separated regexes. If any of the\nprovided regexes match within a dataset name, that dataset will be included in the benchmark. For example, to run only the glove\nand nytimes datasets, you could use:\n\n> `mvn compile exec:exec@bench -DbenchArgs=\"glove nytimes\"`\n\nTo run Sift\u002FBench without the JVM vector module available, you can use the following invocations:\n\n> `mvn -Pjdk11 compile exec:exec@bench`\n\n> `mvn -Pjdk11 compile exec:exec@sift`\n\nThe `... -Pjdk11` invocations will also work with `JAVA_HOME` pointing at a Java 11 installation.\n\nFor more information on running benchmarks, go through [docs\u002Fbenchmarking.md](.\u002Fdocs\u002Fbenchmarking.md).\n\nTo release, configure `~\u002F.m2\u002Fsettings.xml` to point to OSSRH and run `mvn -Prelease clean deploy`.\n\n---\n","## 近似最近邻搜索简介\n\n精确的最近邻搜索（k近邻或KNN）在高维空间中成本极高，因为在2D或3D空间中有效的空间划分方法，如四叉树或k-d树，在高维情况下会退化为线性扫描。这正是所谓的“维度灾难”的一个方面。\n\n对于大规模数据集而言，在对数时间内得到一个近似答案，往往比在线性时间内得到精确答案更有用。这种搜索方式简称为ANN（近似最近邻）搜索。\n\nANN索引主要分为两大类：\n* 基于分区的索引，例如[LSH或IVF](https:\u002F\u002Fwww.datastax.com\u002Fguides\u002Fwhat-is-a-vector-index)以及[SCANN](https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002Fgoogle-research\u002Ftree\u002Fmaster\u002Fscann)\n* 基于图的索引，例如[HNSW](https:\u002F\u002Farxiv.org\u002Fabs\u002F1603.09320)和[DiskANN](https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fresearch\u002Fproject\u002Fproject-akupara-approximate-nearest-neighbor-search-for-large-scale-semantic-search\u002F)\n\n基于图的索引通常实现更简单、速度更快，更重要的是，它们可以增量构建和更新。这使得它们比仅适用于预先完全指定的静态数据集的分区方法更适合通用索引。因此，所有主流的商业向量索引都采用基于图的方法。\n\nJVector是一种结合了DiskANN和HNSW两种技术的图索引。它从HNSW中借鉴了层次结构，并在每一层内部使用Vamana算法（即DiskANN所采用的算法）。\n\n## JVector架构\n\nJVector是一种基于图的索引，它在HNSW和DiskANN的设计基础上进行了可组合的扩展。\n\nJVector实现了一个多层图结构，并采用了无阻塞并发控制机制，从而使得构建过程能够随着核心数量线性扩展：\n![随着线程数增加，JVector呈线性扩展](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fdatastax_jvector_readme_a3655ef2fd07.png)\n\n层次结构的上层由每个节点的内存中邻接表表示，这样可以在无需I\u002FO操作的情况下快速导航。而图的底层则由每个节点的磁盘邻接表表示。JVector利用内联存储的额外数据支持两阶段搜索：第一阶段使用保存在内存中的向量有损压缩表示进行检索，第二阶段则使用从磁盘读取的更精确表示。第一阶段可以采用以下方式：\n* 乘积量化（PQ），可选配[各向异性加权](https:\u002F\u002Farxiv.org\u002Fabs\u002F1908.10396)\n* [二值量化](https:\u002F\u002Fhuggingface.co\u002Fblog\u002Fembedding-quantization)（BQ）\n* 融合PQ，即将PQ码本直接写入图的邻接表中\n\n第二阶段则可以使用：\n* 全精度float32向量\n* NVQ，它采用非均匀量化技术来对向量进行高精度量化\n\n这种两阶段设计能够在保持精度的同时降低内存占用并缩短延迟时间。（参考：[Why Vector Size Matters](https:\u002F\u002Fthenewstack.io\u002Fwhy-vector-size-matters\u002F)）。此外，JVector的独特之处在于它还支持使用两阶段搜索来构建索引本身，从而允许构建超出内存容量的大规模索引：\n![更大规模的索引](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fdatastax_jvector_readme_7a1260e68548.png)\n\n这一点非常重要，因为它使您能够在单个索引中享受对数级搜索的优势，而不必再将结果合并到多个索引中，从而避免线性时间的合并操作。\n\n\n## JVector入门\n\nJVector的入门教程可在[docs\u002Ftutorials](.\u002Fdocs\u002Ftutorials\u002F)目录下找到。您可以从[基础教程](.\u002Fdocs\u002Ftutorials\u002F1-intro-tutorial.md)开始，或者查看[VectorIntro.java](.\u002Fjvector-examples\u002Fsrc\u002Fmain\u002Fjava\u002Fio\u002Fgithub\u002Fjbellis\u002Fjvector\u002Fexample\u002Ftutorial\u002FVectorIntro.java)，以获取一个简单的JVector使用示例。\n\n旧版的JV分步指南可以在这里找到：[docs\u002Flegacy\u002Fjvector-step-by-step.md]。新用户应优先阅读上述教程，但分步指南对于高级用户仍具有参考价值。\n\n\n## 算法背后的研究\n\n* 基础性工作：[HNSW](https:\u002F\u002Fieeexplore.ieee.org\u002Fabstract\u002Fdocument\u002F8594636)和[DiskANN](https:\u002F\u002Fsuhasjs.github.io\u002Ffiles\u002Fdiskann_neurips19.pdf)论文，以及一篇更高层次的解释文章[Hierarchical Navigable Small Worlds](https:\u002F\u002Fwww.datastax.com\u002Fguides\u002Fhierarchical-navigable-small-worlds)\n* [各向异性PQ论文](https:\u002F\u002Farxiv.org\u002Fabs\u002F1908.10396)\n* [更快的ADC论文](https:\u002F\u002Farxiv.org\u002Fabs\u002F1812.09162)\n* [NVQ论文](https:\u002F\u002Farxiv.org\u002Fabs\u002F2509.18471)\n\n## 开发与测试\n本项目采用 [多模块 Maven 构建](https:\u002F\u002Fmaven.apache.org\u002Fguides\u002Fmini\u002Fguide-multiple-modules.html) 的方式组织。其目标是生成一个适用于作为任何 Java 11 代码依赖的多发行版 JAR 文件。当在启用了向量模块的 Java 20 及更高版本 JVM 上运行时，将使用优化的向量提供程序。总体而言，该项目的设计支持使用 JDK 20 及更高版本进行构建，但当 `JAVA_HOME` 设置为 Java 11 到 Java 19 版本时，某些构建功能仍然可用。\n\n基础代码位于 [jvector-base](.\u002Fjvector-base)，将针对 Java 11 发行版进行构建，并相应地限制语言特性及 API 的使用。[jvector-twenty](.\u002Fjvector-twenty) 中的代码则会编译为 Java 20 的语言特性及 API，并包含在最终面向受支持 JVM 的多发行版 JAR 中。[jvector-multirelease](.\u002Fjvector-multirelease) 将 [jvector-base](.\u002Fjvector-base) 和 [jvector-twenty](.\u002Fjvector-twenty) 打包成一个多发行版 JAR 用于发布。[jvector-examples](.\u002Fjvector-examples) 是一个额外的同级模块，它利用 jvector-base\u002Fjvector-twenty 的反应堆表示来运行示例代码。[jvector-tests](.\u002Fjvector-tests) 包含项目的测试用例，既可以在 Java 11 上运行，也可以在 Java 20 及更高版本的 JVM 上运行。\n\n要运行测试，请使用 `mvn test`。若要在 Java 20+ 上运行测试，请同样使用 `mvn test`。若要在 Java 11 上运行测试，则需使用 `mvn -Pjdk11 test`。若要运行单个测试类，可以使用 Maven Surefire 的测试过滤功能，例如：\n`mvn -Dsurefire.failIfNoSpecifiedTests=false -Dtest=TestNeighborArray test`。\n您还可以使用方法级别的过滤和模式匹配，例如：\n`mvn -Dsurefire.failIfNoSpecifiedTests=false -Dtest=TestNeighborArray#testRetain* test`。\n（`failIfNoSpecifiedTests` 选项用于解决 Surefire 的一个小问题：当子模块的测试集为空时，Surefire 仍会执行 `test` 目标；但一旦您提供了过滤条件，它就会要求每个子模块中至少有一个匹配项。）\n\n您可以直接运行 `SiftSmall` 和 `Bench`，以了解当前的工作内容。`Bench` 会自动将所需的数据集下载到 `dataset_cache` 目录下。`SiftSmall` 使用的文件可在项目根目录下的 [siftsmall 目录](.\u002Fsiftsmall) 中找到。\n\n要运行这两个类，可以通过 Maven exec 插件使用以下命令：\n\n> `mvn compile exec:exec@bench`\n\n或者对于 Sift：\n\n> `mvn compile exec:exec@sift`\n\n`Bench` 接受一个可选的 `benchArgs` 参数，该参数可以设置为由空格分隔的正则表达式列表。如果提供的任何一个正则表达式与数据集名称匹配，则该数据集会被纳入基准测试。例如，若只想运行 glove 和 nytimes 数据集，可以使用以下命令：\n\n> `mvn compile exec:exec@bench -DbenchArgs=\"glove nytimes\"`\n\n若要在没有 JVM 向量模块的情况下运行 Sift 或 Bench，可以使用以下命令：\n\n> `mvn -Pjdk11 compile exec:exec@bench`\n\n> `mvn -Pjdk11 compile exec:exec@sift`\n\n带有 `... -Pjdk11` 的命令同样适用于 `JAVA_HOME` 指向 Java 11 安装的情况。\n\n有关运行基准测试的更多信息，请参阅 [docs\u002Fbenchmarking.md](.\u002Fdocs\u002Fbenchmarking.md)。\n\n要发布，请配置 `~\u002F.m2\u002Fsettings.xml` 以指向 OSSRH，并运行 `mvn -Prelease clean deploy`。\n\n---","# JVector 快速上手指南\n\nJVector 是一个高性能的图基于近似最近邻（ANN）搜索索引库，融合了 HNSW 的层级结构与 DiskANN (Vamana) 算法。它支持非阻塞并发构建、两阶段搜索（内存压缩 + 磁盘高精度）以及超大索引的构建，适用于需要低延迟和高吞吐量的向量检索场景。\n\n## 环境准备\n\n### 系统要求\n*   **JDK 版本**：\n    *   **基础运行**：Java 11 或更高版本。\n    *   **性能优化**：推荐使用 **Java 20+**。在 Java 20+ 环境下并启用 Vector 模块时，JVector 会自动使用优化的向量提供者以获得最佳性能。\n*   **构建工具**：Apache Maven 3.6+。\n*   **操作系统**：Linux, macOS, Windows (支持多核线性扩展)。\n\n### 前置依赖\n本项目采用多模块 Maven 构建。无需额外安装第三方向量数据库，JVector 作为库直接嵌入您的 Java 应用中。\n\n## 安装步骤\n\n将 JVector 添加为您的 Maven 项目依赖。请在 `pom.xml` 的 `\u003Cdependencies>` 部分添加以下内容（请替换为最新的版本号）：\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>io.github.jbellis\u003C\u002FgroupId>\n    \u003CartifactId>jvector-multirelease\u003C\u002FartifactId>\n    \u003Cversion>0.5.0\u003C\u002Fversion> \u003C!-- 请检查 Maven Central 获取最新版本 -->\n\u003C\u002Fdependency>\n```\n\n> **提示**：该构件是一个多发布 Jar (Multi-Release Jar)，会自动根据您运行的 JDK 版本加载对应的优化代码（Java 11 基础版或 Java 20+ 优化版）。\n\n## 基本使用\n\n以下是最简单的入门示例，演示如何创建索引、添加向量并执行搜索。\n\n### 1. 代码示例\n\n您可以参考项目中的 `VectorIntro.java` 逻辑，以下是一个简化的核心用法演示：\n\n```java\nimport io.github.jbellis.jvector.graph.GraphIndex;\nimport io.github.jbellis.jvector.graph.GraphIndexBuilder;\nimport io.github.jbellis.jvector.vector.VectorSimilarityFunction;\nimport io.github.jbellis.jvector.vector.VectorizationProvider;\nimport org.apache.lucene.util.RamUsageEstimator;\n\nimport java.util.Random;\n\npublic class QuickStart {\n    public static void main(String[] args) {\n        \u002F\u002F 1. 初始化向量化提供者 (自动检测是否启用 Java 20+ Vector 模块)\n        VectorizationProvider provider = VectorizationProvider.getInstance();\n\n        \u002F\u002F 2. 配置参数\n        int dimension = 128;\n        int maxConnections = 16;\n        int beamWidth = 64;\n        \n        \u002F\u002F 3. 创建索引构建器\n        \u002F\u002F 使用余弦相似度 (COSINE)，也可选择 DOT_PRODUCT 或 EUCLIDEAN\n        GraphIndexBuilder builder = new GraphIndexBuilder(\n            maxConnections, \n            beamWidth, \n            VectorSimilarityFunction.COSINE\n        );\n\n        \u002F\u002F 4. 模拟数据并添加到索引\n        Random random = new Random();\n        for (int i = 0; i \u003C 1000; i++) {\n            float[] vector = new float[dimension];\n            for (int j = 0; j \u003C dimension; j++) {\n                vector[j] = random.nextFloat();\n            }\n            \u002F\u002F addVector 返回内部 ID，通常从 0 开始递增\n            builder.addVector(i, vector);\n        }\n\n        \u002F\u002F 5. 构建完成，获取只读索引实例\n        GraphIndex index = builder.build();\n\n        \u002F\u002F 6. 执行搜索 (K=10)\n        float[] queryVector = new float[dimension];\n        for (int j = 0; j \u003C dimension; j++) {\n            queryVector[j] = random.nextFloat();\n        }\n\n        \u002F\u002F search 返回结果节点 ID 列表和对应的距离\n        var results = index.search(queryVector, 10);\n\n        System.out.println(\"Top 10 neighbors found:\");\n        for (int i = 0; i \u003C results.size(); i++) {\n            System.out.printf(\"Node ID: %d, Distance: %f%n\", \n                results.getNodeId(i), results.getDistance(i));\n        }\n        \n        \u002F\u002F 7. 释放资源 (如果不再需要)\n        index.close();\n    }\n}\n```\n\n### 2. 运行官方示例与基准测试\n\n如果您想直接运行项目自带的教程或基准测试，可以使用以下 Maven 命令：\n\n**运行基础教程示例 (SiftSmall):**\n```bash\nmvn compile exec:exec@sift\n```\n\n**运行基准测试 (Bench):**\n此命令会自动下载数据集到 `dataset_cache` 目录。\n```bash\nmvn compile exec:exec@bench\n```\n\n**指定数据集运行基准测试:**\n仅运行 `glove` 和 `nytimes` 数据集的测试：\n```bash\nmvn compile exec:exec@bench -DbenchArgs=\"glove nytimes\"\n```\n\n**在 Java 11 环境下运行 (不使用 Vector 模块优化):**\n```bash\nmvn -Pjdk11 compile exec:exec@bench\n```\n\n### 3. 进阶学习\n*   **详细教程**：查看 `docs\u002Ftutorials\u002F1-intro-tutorial.md`。\n*   **完整代码示例**：参考 `jvector-examples\u002Fsrc\u002Fmain\u002Fjava\u002Fio\u002Fgithub\u002Fjbellis\u002Fjvector\u002Fexample\u002Ftutorial\u002FVectorIntro.java`。\n*   **架构细节**：JVector 支持两阶段搜索（内存中使用 PQ\u002FBQ 压缩向量进行初筛，磁盘读取 Float32\u002FNVQ 高精度向量进行重排序），适合处理超出内存容量的大规模索引。","某大型电商平台的推荐系统需要实时从亿级商品库中，根据用户行为向量检索出最相似的候选商品。\n\n### 没有 jvector 时\n- **内存瓶颈严重**：全量高精度向量必须常驻内存，导致服务器硬件成本极高，且无法加载超过内存容量的数据集。\n- **更新延迟高**：传统分区索引（如 IVF）难以支持增量更新，新上架商品需等待夜间离线重建索引，无法实时进入推荐池。\n- **查询性能随数据量线性下降**：面对海量数据，精确 KNN 搜索退化为线性扫描，高并发下响应时间从毫秒级飙升至秒级。\n- **架构复杂冗余**：为突破单机限制，被迫将数据拆分到多个小索引中，并在应用层进行耗时的结果合并与去重。\n\n### 使用 jvector 后\n- **突破内存限制**：利用“两阶段搜索”架构，仅在内存保留压缩向量进行初筛，底层大图存储于磁盘，轻松支撑远超内存规模的十亿级索引。\n- **实时增量构建**：基于图索引特性，新商品向量可即时插入并参与检索，无需停机重建，确保推荐内容的新鲜度。\n- **保持对数级查询速度**：即使在大规模数据集上，jvector 依然维持高效的近似最近邻搜索，显著降低尾部延迟，保障用户体验流畅。\n- **单机简化架构**：凭借强大的单索引扩展能力，不再需要维护分散的索引集群，消除了复杂的结果合并逻辑，降低了运维难度。\n\njvector 通过创新的磁盘 - 内存混合架构，让开发者在单机环境下即可实现海量向量的低成本、低延迟与实时检索。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fdatastax_jvector_a3655ef2.png","datastax","DataStax","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fdatastax_2055bcde.png","",null,"www.datastax.com","https:\u002F\u002Fgithub.com\u002Fdatastax",[80,84,88,92],{"name":81,"color":82,"percentage":83},"Java","#b07219",96.8,{"name":85,"color":86,"percentage":87},"Python","#3572A5",1.7,{"name":89,"color":90,"percentage":91},"C","#555555",1.3,{"name":93,"color":94,"percentage":95},"Shell","#89e051",0.2,1705,150,"2026-04-17T06:09:27","Apache-2.0",4,"未说明","不需要 GPU，基于 CPU 运行（利用 Java Vector API 优化）","未说明（支持构建超出内存大小的索引，利用磁盘存储和两阶段搜索机制）",{"notes":105,"python":106,"dependencies":107},"这是一个纯 Java 库，非 Python 工具。基础代码兼容 Java 11，若在 Java 20+ 环境下运行并启用 Vector 模块，将自动使用优化的向量计算提供者。项目采用多版本 JAR 包结构，支持在旧版和新版 JVM 上运行。支持通过磁盘存储构建超大规模索引，无需将所有数据加载到内存中。","不适用",[108,109],"Java JDK 11+","Apache Maven",[14,16],[112,113,114,115,116,117,118],"ann","java","knn","machine-learning","search-engine","similarity-search","vector-search","2026-03-27T02:49:30.150509","2026-04-19T03:05:04.919370",[122,127,132,137,142,147],{"id":123,"question_zh":124,"answer_zh":125,"source_url":126},41183,"如何压缩 OpenAI 的嵌入向量以减少维度，同时保持较高的召回率？","根据测试数据，对于 OpenAI 的嵌入向量，可以将维度压缩至原始长度的 1\u002F2（例如从 1536 维降至 768 维），在 overquery=2 的设置下仍能保持极高的召回率（约 0.97）。如果尝试压缩至 1\u002F4（384 维），在 overquery=2 时表现尚可（召回率约 0.96），但在 overquery=1 时召回率下降明显。不建议压缩至 1\u002F8（192 维），因为即使增加 overquery，召回率也会大幅下降（约 0.87 或更低）。建议在实际应用中先进行小规模测试以确定最佳压缩比。","https:\u002F\u002Fgithub.com\u002Fdatastax\u002Fjvector\u002Fissues\u002F62",{"id":128,"question_zh":129,"answer_zh":130,"source_url":131},41184,"JVector 是否计划实现 FINGER 算法来加速搜索？","经过评估和测试，FINGER 算法在 JVector 中并未取得预期效果。虽然在某些数据集（如 FASHION 和 SIFT）上当图度数 r=64 时能看到显著的速度提升，但在 r=32（Cassandra 当前使用的度数）时表现不佳，延迟较高且召回率下降严重。此外，该算法需要大量的预计算数据，可能抵消其带来的性能增益。维护者已明确表示\"FINGER ended up not panning out\"（FINGER 最终没有成功），因此目前没有集成该算法的计划。","https:\u002F\u002Fgithub.com\u002Fdatastax\u002Fjvector\u002Fissues\u002F123",{"id":133,"question_zh":134,"answer_zh":135,"source_url":136},41185,"JVector 是否会支持 FreshDiskANN 以实现更高效的索引合并？","不会。JVector 的设计哲学是不包含 LSM（Log-Structured Merge-tree）结构。其核心优势在于只需要维护单个索引，这比合并多个索引的结果要快得多。其他项目可以根据自身需求消费 JVector，但 JVector 本身不会实现类似 FreshDiskANN 的流式合并功能，以避免随着向量索引增长而进行的内存密集型重建操作。","https:\u002F\u002Fgithub.com\u002Fdatastax\u002Fjvector\u002Fissues\u002F289",{"id":138,"question_zh":139,"answer_zh":140,"source_url":141},41186,"如何在项目中引用针对 JDK 11 编译的 JVector 版本？","可以通过 Maven 依赖引用带有分类器（classifier）的 JVector JAR 包。在 `pom.xml` 中添加以下依赖配置：\n\u003Cdependency>\n  \u003CgroupId>com.github.jbellis\u003C\u002FgroupId>\n  \u003CartifactId>jvector\u003C\u002FartifactId>\n  \u003Cversion>1.0-SNAPSHOT\u003C\u002Fversion>\n  \u003Cclassifier>jdk11\u003C\u002Fclassifier>\n\u003C\u002Fdependency>\n注意：如果使用 Ant 构建系统，可能需要检查构建脚本是否正确支持 classifier 属性，早期版本可能存在兼容性问题。","https:\u002F\u002Fgithub.com\u002Fdatastax\u002Fjvector\u002Fissues\u002F38",{"id":143,"question_zh":144,"answer_zh":145,"source_url":146},41187,"遇到 'Out of bound access on segment MemorySegment' 错误怎么办？","该错误通常发生在执行 graphSearcher.search() 时，表明尝试访问的内存偏移量超出了分配的 MemorySegment 范围。这往往是由于索引文件损坏、读取位置计算错误或并发修改导致的。解决方法包括：1. 确保在搜索过程中索引文件未被其他进程修改或截断；2. 检查构建索引时的参数是否与搜索时一致；3. 如果是持久化索引，尝试重新构建索引以排除文件损坏的可能性；4. 升级到最新版本的 JVector，因为此类边界检查问题可能在后续版本中得到了修复。","https:\u002F\u002Fgithub.com\u002Fdatastax\u002Fjvector\u002Fissues\u002F509",{"id":148,"question_zh":149,"answer_zh":150,"source_url":131},41188,"为什么在使用 FINGER 优化时，r=32 的延迟性能较差？","在 r=32（低度数图）的情况下，FINGER 算法的基础秩（basis rank）太低，无法很好地捕捉向量间的相似性。虽然可以通过增加 overquery 来弥补，但这会抵消大部分性能收益。此外，曾发现一个导致该问题的 Bug：用于索引查找余弦表的掩码生成不正确，导致 consistently 低估了向量间的角度，从而使系统考虑了过多的邻居向量并计算了精确距离，增加了延迟。修复该掩码生成逻辑后，r=32 的实现已无明显问题，但其性能提升依然有限，不如高度数图（如 r=64）显著。",[152,157],{"id":153,"version":154,"summary_zh":155,"released_at":156},325111,"4.0.0-rc.8","# JVector 发行说明\n\n## 版本：4.0.0-rc.7 - 4.0.0-rc.8\n\n---\n\n## 新特性与增强\n\n### 融合产品量化（Fused PQ）\n\n**描述**  \n融合产品量化（Fused PQ）是一种性能优化技术，它将压缩后的产品量化（PQ）码直接嵌入到图索引结构中，与每个节点的邻居列表并存。这样，在图遍历时无需再进行单独的查找来获取压缩向量，从而显著减少了内存访问开销，提升了查询性能。该特性将PQ编码的邻居向量内联存储在图边中，使得在搜索操作过程中能够更快地进行近似相似度评分。通过将压缩的邻居向量直接嵌入到图索引本身，Fused PQ无需维护独立的内存数据结构来存储PQ编码的向量，从而降低了堆内存使用，同时保持了快速的近似相似性搜索性能。\n\n**目的 \u002F 影响**  \n- 降低大规模向量数据集的内存占用  \n- 提高图遍历过程中的缓存局部性  \n- 支持更大规模或高维向量工作负载的更高写入扩展性  \n\n**启用方法**  \n要在写入磁盘图索引时启用Fused PQ：\n\n1. **创建 FusedPQ 特性**，将图的最大度数和一个产品量化压缩器传递给构造函数：\n   ```java\n   var fusedPQFeature = new FusedPQ(graph.maxDegree(), pq);\n   ```\n\n2. **将其添加到 OnDiskGraphIndexWriter 构建器中**：\n   ```java\n   var writer = new OnDiskGraphIndexWriter.Builder(graph, outputPath)\n       .with(fusedPQFeature)\n       .build();\n   ```\n\n3. **在写入阶段提供包含图视图和PQ向量的状态供应函数**：\n   ```java\n   Map\u003CFeatureId, IntFunction\u003CFeature.State>> writeSuppliers = new EnumMap\u003C>(FeatureId.class);\n   writeSuppliers.put(FeatureId.FUSED_PQ, ordinal -> new FusedPQ.State(view, pqVectors, ordinal));\n   writer.write(writeSuppliers);\n   ```\n\n**注意事项**  \n- Fused PQ 需要使用 256 个聚类的产品量化压缩器。该特性会在写入过程中自动将压缩的邻居向量内联嵌入到图结构中。  \n- 为了启用 FUSED_PQ 特性，我们为图索引引入了新的第 6 版文件格式。\n\n---\n\n### 并行图索引构建\n\n**描述**  \nOnDiskParallelGraphIndexWriter 通过解决限制串行 OnDiskGraphIndexWriter 的磁盘 I\u002FO 瓶颈，显著加速了图索引的构建过程。该实现使用异步文件 I\u002FO 和多个工作线程并行写入图记录，其并行度会根据系统可用资源自动确定（也可通过构建器选项进行配置）。通过在保证正确顺序的前提下并行化记录构建和磁盘写入操作，这种方法大幅缩短了将大型图索引持久化到磁盘所需的时间。\n\n**目的 \u002F 影响*","2026-04-03T21:14:30",{"id":158,"version":159,"summary_zh":160,"released_at":161},325112,"4.0.0-rc.6","# JVector 4.0.0 第1至第6个候选版本：合并发布说明\n\n## 概述\n\n本文档涵盖了从2025年7月2日至2025年11月18日期间发布的JVector 4.0.0-rc.1至4.0.0-rc.6版本中引入的主要特性、改进和变更。\n\n## 主要特性\n\n### 图索引架构改进\n\n#### 新的图索引接口（rc.4）\n- **MutableGraphIndex 和 ImmutableGraphIndex 接口** - 引入了新的接口层次结构，更好地分离可变与不可变的图操作，提升了 API 的清晰度和类型安全性。\n- **堆内存图重建** - 增加了从磁盘上的图索引重建内存中堆内存图的功能，从而支持灵活的图操作与分析工作流。\n\n#### 使用新接口构建图（rc.4）\n\n##### 使用 MutableGraphIndex 和 ImmutableGraphIndex\n\n```java\n\u002F\u002F 构建一个可变图\nGraphIndexBuilder builder = new GraphIndexBuilder(\n    vectorValues,\n    similarityFunction,\n    M,\n    beamWidth,\n    neighborOverflow,\n    alpha,\n    addHierarchy\n);\n\n\u002F\u002F 获取可变接口\nMutableGraphIndex mutableGraph = builder.getGraph();\n\n\u002F\u002F 完成构建并获取不可变接口\nImmutableGraphIndex immutableGraph = builder.complete();\n\n\u002F\u002F 检查图是否为层次化结构（rc.6）\nif (immutableGraph.isHierarchical()) {\n    System.out.println(\"图具有 HNSW 风格的层次结构\");\n}\n\n\u002F\u002F 获取维度（rc.5）\nint dimension = immutableGraph.getDimension();\n```\n\n#### 从磁盘重建堆内存图（rc.4）\n\n```java\n\u002F\u002F 加载磁盘上的图\nOnDiskGraphIndex diskGraph = OnDiskGraphIndex.load(\n    readerSupplier,\n    0  \u002F\u002F 起始偏移量\n);\n\n\u002F\u002F 重建为堆内存图以便进行操作\nOnHeapGraphIndex heapGraph = OnHeapGraphIndex.fromDiskGraph(\n    diskGraph,\n    vectorValues\n);\n```\n\n#### 层次化图支持（rc.6）\n- **`ImmutableGraphIndex.isHierarchical()`** - 添加了用于识别层次化图结构的方法，以支持更复杂的图拓扑结构。\n\n### 向量量化增强\n\n#### NVQ（非均匀向量量化）支持（rc.5）\n- **全局均值支持** - 增加了 `NVQuantization::create` 方法，该方法接受全局均值参数，从而实现更加灵活的量化策略。\n- **重构误差计算**（rc.6） - 实现了向量压缩器的重构误差计算功能，可用于评估量化方法的质量。\n\n##### 使用全局均值创建 NVQ（rc.5）\n\n```java\n\u002F\u002F 使用预先计算的全局均值创建 NVQ\nVectorFloat\u003C?> globalMean = computeGlobalMean(vectors);\nNVQuantization nvq = NVQuantization.create(\n    vectors,\n    subspaceCount,\n    NVQuantization.BitsPerDimension.EIGHT,\n    globalMean  \u002F\u002F rc.5 中新增的参数\n);\n```\n\n##### 计算重构误差（rc.6）\n\n```java\n\u002F\u002F 通过计算重构误差来评估量化质量\nVectorCompressor\u003C?> compressor = ProductQuantization.compute(vectors, M, clusterCount, centerData);\ndouble[","2026-04-03T21:15:21"]