[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"tool-knuddelsgmbh--jtokkit":3,"similar-knuddelsgmbh--jtokkit":143},{"id":4,"github_repo":5,"name":6,"description_en":7,"description_zh":8,"ai_summary_zh":9,"readme_en":10,"readme_zh":11,"quickstart_zh":12,"use_case_zh":13,"hero_image_url":14,"owner_login":15,"owner_name":16,"owner_avatar_url":17,"owner_bio":18,"owner_company":19,"owner_location":19,"owner_email":19,"owner_twitter":19,"owner_website":20,"owner_url":21,"languages":22,"stars":35,"forks":36,"last_commit_at":37,"license":38,"difficulty_score":39,"env_os":40,"env_gpu":41,"env_ram":40,"env_deps":42,"category_tags":46,"github_topics":49,"view_count":52,"oss_zip_url":19,"oss_zip_packed_at":19,"status":53,"created_at":54,"updated_at":55,"faqs":56,"releases":92},3972,"knuddelsgmbh\u002Fjtokkit","jtokkit","JTokkit is a Java tokenizer library designed for use with OpenAI models.","jtokkit 是一款专为 Java 开发者打造的开源分词库，旨在无缝对接 OpenAI 系列模型。在开发基于大语言模型的应用时，准确计算文本所需的 Token 数量是控制成本和优化请求的关键，而 Java 生态此前一直缺乏类似 Python 中 tiktoken 那样高效的原生解决方案。jtokkit 的出现正好填补了这一空白，让 JVM 平台的开发者也能轻松实现对文本的编码与解码。\n\n该工具支持包括 cl100k_base（适用于 GPT-4、GPT-3.5）在内的多种主流编码格式，并允许直接通过模型名称获取对应的分词器，极大简化了开发流程。其技术亮点在于卓越的性能表现，基准测试显示其运行速度比同类方案快 2 到 3 倍，同时保持零外部依赖，兼容 Java 8 及以上版本。此外，jtokkit 提供了线程安全的 API 和灵活的扩展机制，方便用户自定义编码算法。\n\n无论是需要集成 AI 能力的后端工程师，还是致力于自然语言处理研究的技术人员，只要使用 Java 技术栈并与 OpenAI 模型打交道，jtokkit 都是一个高效、可靠且易于上手的选择。它帮助开发者在本地快速验证文本长","jtokkit 是一款专为 Java 开发者打造的开源分词库，旨在无缝对接 OpenAI 系列模型。在开发基于大语言模型的应用时，准确计算文本所需的 Token 数量是控制成本和优化请求的关键，而 Java 生态此前一直缺乏类似 Python 中 tiktoken 那样高效的原生解决方案。jtokkit 的出现正好填补了这一空白，让 JVM 平台的开发者也能轻松实现对文本的编码与解码。\n\n该工具支持包括 cl100k_base（适用于 GPT-4、GPT-3.5）在内的多种主流编码格式，并允许直接通过模型名称获取对应的分词器，极大简化了开发流程。其技术亮点在于卓越的性能表现，基准测试显示其运行速度比同类方案快 2 到 3 倍，同时保持零外部依赖，兼容 Java 8 及以上版本。此外，jtokkit 提供了线程安全的 API 和灵活的扩展机制，方便用户自定义编码算法。\n\n无论是需要集成 AI 能力的后端工程师，还是致力于自然语言处理研究的技术人员，只要使用 Java 技术栈并与 OpenAI 模型打交道，jtokkit 都是一个高效、可靠且易于上手的选择。它帮助开发者在本地快速验证文本长度，避免因 Token 超限导致的请求失败，从而提升开发效率与系统稳定性。","# 🚀 JTokkit - Java Tokenizer Kit\n\n[![License: MIT](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fknuddelsgmbh\u002Fjtokkit)](https:\u002F\u002Fopensource.org\u002Flicense\u002Fmit\u002F)\n![GitHub Workflow Status](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002Fknuddelsgmbh\u002Fjtokkit\u002Fbuild-publish.yml)\n![Maven Central](https:\u002F\u002Fimg.shields.io\u002Fmaven-central\u002Fv\u002Fcom.knuddels\u002Fjtokkit)\n[![javadoc](https:\u002F\u002Fjavadoc.io\u002Fbadge2\u002Fcom.knuddels\u002Fjtokkit\u002Fjavadoc.svg)](https:\u002F\u002Fjavadoc.io\u002Fdoc\u002Fcom.knuddels\u002Fjtokkit)\n\nWelcome to JTokkit, a Java tokenizer library designed for use with OpenAI models.\n```java\nEncodingRegistry registry = Encodings.newDefaultEncodingRegistry();\nEncoding enc = registry.getEncoding(EncodingType.CL100K_BASE);\nassertEquals(\"hello world\", enc.decode(enc.encode(\"hello world\")));\n\n\u002F\u002F Or get the tokenizer corresponding to a specific OpenAI model\nenc = registry.getEncodingForModel(ModelType.TEXT_EMBEDDING_ADA_002);\n```\n\n## 💡 Quickstart\n\nFor a quick getting started, see our [documentation](https:\u002F\u002Fjtokkit.knuddels.de\u002F).\n\n## 📖 Introduction\nJTokkit aims to be a fast and efficient tokenizer designed for use in natural\nlanguage processing tasks using the OpenAI models. It provides an easy-to-use\ninterface for tokenizing input text, for example for counting required tokens\nin preparation of requests to the GPT-3.5 model. This library resulted out of\nthe need to have similar capacities in the JVM ecosystem as the library\n[tiktoken](https:\u002F\u002Fgithub.com\u002Fopenai\u002Ftiktoken) provides for Python.\n\n## 🤖 Features\n\n✅ Implements encoding and decoding via `r50k_base`, `p50k_base`, `p50k_edit`,\n`cl100k_base` and `o200k_base`\n\n✅ Easy-to-use API\n\n✅ Easy extensibility for custom encoding algorithms\n\n✅ **Zero** Dependencies\n\n✅ Supports Java 8 and above\n\n✅ Fast and efficient performance\n\n## 📊 Performance\n\nJTokkit is between 2-3 times faster than a comparable tokenizer.\n\n![benchmark](benchmark\u002Freports\u002Fbenchmark.svg)\n\nFor details on the benchmark, see the [benchmark](benchmark) directory.\n\n## 🛠️ Installation\nYou can install JTokkit by adding the following dependency to your Maven project:\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>com.knuddels\u003C\u002FgroupId>\n    \u003CartifactId>jtokkit\u003C\u002FartifactId>\n    \u003Cversion>1.1.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\nOr alternatively using Gradle:\n\n```groovy\ndependencies {\n    implementation 'com.knuddels:jtokkit:1.1.0'\n}\n```\n\n## 🔰 Getting Started\nTo use JTokkit, simply create a new `EncodingRegistry` and use `getEncoding` to\nretrieve the encoding you want to use. You can then use the `encode` and\n`decode` methods to encode and decode text.\n\n```java\nEncodingRegistry registry = Encodings.newDefaultEncodingRegistry();\nEncoding enc = registry.getEncoding(EncodingType.CL100K_BASE);\nIntArrayList encoded = enc.encode(\"This is a sample sentence.\");\n\u002F\u002F encoded = [2028, 374, 264, 6205, 11914, 13]\n        \nString decoded = enc.decode(encoded);\n\u002F\u002F decoded = \"This is a sample sentence.\"\n\n\u002F\u002F Or get the tokenizer based on the model type\nEncoding secondEnc = registry.getEncodingForModel(ModelType.TEXT_EMBEDDING_ADA_002);\n\u002F\u002F enc == secondEnc\n```\n\nThe `EncodingRegistry` and `Encoding` classes are thread-safe and can be freely\nshared among components.\n\n## ➰ Extending JTokkit\n\nYou may want to extend JTokkit to support custom encodings. To do so, you have two\noptions:\n\n1. Implement the `Encoding` interface and register it with the `EncodingRegistry`\n```java\nEncodingRegistry registry = Encodings.newDefaultEncodingRegistry();\nEncoding customEncoding = new CustomEncoding();\nregistry.registerEncoding(customEncoding);\n```\n2. Add new parameters for use with the existing BPE algorithm\n```java\nEncodingRegistry registry = Encodings.newDefaultEncodingRegistry();\nGptBytePairEncodingParams params = new GptBytePairEncodingParams(\n        \"custom-name\",\n        Pattern.compile(\"some custom pattern\"),\n        encodingMap,\n        specialTokenEncodingMap\n);\nregistry.registerGptBytePairEncoding(params);\n```\n\nAfterwards you can use the custom encodings alongside the default ones and access\nthem by using `registry.getEncoding(\"custom-name\")`. See the JavaDoc for more\ndetails.\n\n## 📄 License\nJTokkit is licensed under the MIT License. See the\n[LICENSE](https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fblob\u002Fmain\u002FLICENSE) file\nfor more information.\n","# 🚀 JTokkit - Java 分词工具包\n\n[![许可证：MIT](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fknuddelsgmbh\u002Fjtokkit)](https:\u002F\u002Fopensource.org\u002Flicense\u002Fmit\u002F)\n![GitHub 工作流状态](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002Fknuddelsgmbh\u002Fjtokkit\u002Fbuild-publish.yml)\n![Maven Central](https:\u002F\u002Fimg.shields.io\u002Fmaven-central\u002Fv\u002Fcom.knuddels\u002Fjtokkit)\n[![javadoc](https:\u002F\u002Fjavadoc.io\u002Fbadge2\u002Fcom.knuddels\u002Fjtokkit\u002Fjavadoc.svg)](https:\u002F\u002Fjavadoc.io\u002Fdoc\u002Fcom.knuddels\u002Fjtokkit)\n\n欢迎使用 JTokkit，这是一个专为 OpenAI 模型设计的 Java 分词库。\n```java\nEncodingRegistry registry = Encodings.newDefaultEncodingRegistry();\nEncoding enc = registry.getEncoding(EncodingType.CL100K_BASE);\nassertEquals(\"hello world\", enc.decode(enc.encode(\"hello world\")));\n\n\u002F\u002F 或者获取与特定 OpenAI 模型对应的分词器\nenc = registry.getEncodingForModel(ModelType.TEXT_EMBEDDING_ADA_002);\n```\n\n## 💡 快速入门\n\n如需快速开始，请参阅我们的[文档](https:\u002F\u002Fjtokkit.knuddels.de\u002F)。\n\n## 📖 简介\nJTokkit 旨在成为一个快速高效的分词工具，专为使用 OpenAI 模型进行自然语言处理任务而设计。它提供了一个易于使用的接口，用于对输入文本进行分词，例如在准备向 GPT-3.5 模型发送请求时计算所需的 token 数量。该库的诞生源于 JVM 生态系统中需要具备与 Python 库 [tiktoken](https:\u002F\u002Fgithub.com\u002Fopenai\u002Ftiktoken) 类似的功能。\n\n## 🤖 特性\n\n✅ 实现了 `r50k_base`、`p50k_base`、`p50k_edit`、`cl100k_base` 和 `o200k_base` 的编码与解码\n\n✅ 易于使用的 API\n\n✅ 轻松扩展以支持自定义编码算法\n\n✅ **零**依赖\n\n✅ 支持 Java 8 及以上版本\n\n✅ 高效且性能优越\n\n## 📊 性能\nJTokkit 的速度比同类分词器快 2 到 3 倍。\n\n![基准测试](benchmark\u002Freports\u002Fbenchmark.svg)\n\n有关基准测试的详细信息，请参阅 [benchmark](benchmark) 目录。\n\n## 🛠️ 安装\n您可以通过将以下依赖项添加到 Maven 项目中来安装 JTokkit：\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>com.knuddels\u003C\u002FgroupId>\n    \u003CartifactId>jtokkit\u003C\u002FartifactId>\n    \u003Cversion>1.1.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n或者使用 Gradle：\n\n```groovy\ndependencies {\n    implementation 'com.knuddels:jtokkit:1.1.0'\n}\n```\n\n## 🔰 使用入门\n要使用 JTokkit，只需创建一个新的 `EncodingRegistry`，然后使用 `getEncoding` 方法获取您想要使用的编码。之后，您可以使用 `encode` 和 `decode` 方法对文本进行编码和解码。\n\n```java\nEncodingRegistry registry = Encodings.newDefaultEncodingRegistry();\nEncoding enc = registry.getEncoding(EncodingType.CL100K_BASE);\nIntArrayList encoded = enc.encode(\"这是一句示例句子。\");\n\u002F\u002F encoded = [2028, 374, 264, 6205, 11914, 13]\n        \nString decoded = enc.decode(encoded);\n\u002F\u002F decoded = \"这是一句示例句子。\"\n\n\u002F\u002F 或者根据模型类型获取分词器\nEncoding secondEnc = registry.getEncodingForModel(ModelType.TEXT_EMBEDDING_ADA_002);\n\u002F\u002F enc == secondEnc\n```\n\n`EncodingRegistry` 和 `Encoding` 类是线程安全的，可以在各个组件之间自由共享。\n\n## ➰ 扩展 JTokkit\n如果您希望扩展 JTokkit 以支持自定义编码，有两种方法可供选择：\n\n1. 实现 `Encoding` 接口，并将其注册到 `EncodingRegistry` 中：\n```java\nEncodingRegistry registry = Encodings.newDefaultEncodingRegistry();\nEncoding customEncoding = new CustomEncoding();\nregistry.registerEncoding(customEncoding);\n```\n2. 为现有的 BPE 算法添加新参数：\n```java\nEncodingRegistry registry = Encodings.newDefaultEncodingRegistry();\nGptBytePairEncodingParams params = new GptBytePairEncodingParams(\n        \"custom-name\",\n        Pattern.compile(\"some custom pattern\"),\n        encodingMap,\n        specialTokenEncodingMap\n);\nregistry.registerGptBytePairEncoding(params);\n```\n\n完成上述操作后，您就可以将自定义编码与默认编码一起使用，并通过 `registry.getEncoding(\"custom-name\")` 来访问它们。更多详细信息请参阅 JavaDoc。\n\n## 📄 许可证\nJTokkit 采用 MIT 许可证授权。有关更多信息，请参阅 [LICENSE](https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fblob\u002Fmain\u002FLICENSE) 文件。","# JTokkit 快速上手指南\n\nJTokkit 是一个专为 OpenAI 模型设计的高性能 Java Tokenizer 库，零依赖且兼容 Java 8+，性能比同类工具快 2-3 倍。\n\n## 环境准备\n\n- **系统要求**：Java 8 或更高版本\n- **前置依赖**：无（零依赖库）\n- **构建工具**：Maven 3.6+ 或 Gradle 6.0+\n\n## 安装步骤\n\n### Maven 项目\n在 `pom.xml` 中添加以下依赖：\n```xml\n\u003Cdependency>\n    \u003CgroupId>com.knuddels\u003C\u002FgroupId>\n    \u003CartifactId>jtokkit\u003C\u002FartifactId>\n    \u003Cversion>1.1.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n### Gradle 项目\n在 `build.gradle` 中添加：\n```groovy\ndependencies {\n    implementation 'com.knuddels:jtokkit:1.1.0'\n}\n```\n\n> 💡 国内开发者如遇下载缓慢，可在 Maven\u002FGradle 配置中启用阿里云镜像加速。\n\n## 基本使用\n\n### 1. 初始化编码器注册表\n```java\nEncodingRegistry registry = Encodings.newDefaultEncodingRegistry();\n```\n\n### 2. 获取指定编码格式\n```java\n\u002F\u002F 方式一：按编码类型获取\nEncoding enc = registry.getEncoding(EncodingType.CL100K_BASE);\n\n\u002F\u002F 方式二：按 OpenAI 模型类型获取\nEncoding modelEnc = registry.getEncodingForModel(ModelType.TEXT_EMBEDDING_ADA_002);\n```\n\n### 3. 编码与解码文本\n```java\n\u002F\u002F 编码：字符串 -> Token ID 列表\nIntArrayList encoded = enc.encode(\"This is a sample sentence.\");\n\u002F\u002F 输出示例：[2028, 374, 264, 6205, 11914, 13]\n\n\u002F\u002F 解码：Token ID 列表 -> 字符串\nString decoded = enc.decode(encoded);\n\u002F\u002F 输出：\"This is a sample sentence.\"\n```\n\n### 线程安全说明\n`EncodingRegistry` 和 `Encoding` 对象均为线程安全，可在全局单例中复用。","某金融科技公司后端团队正在开发基于 GPT-4 的智能财报分析系统，需在 Java 服务中精准控制输入长度以优化 API 成本。\n\n### 没有 jtokkit 时\n- 团队被迫调用外部 Python 微服务进行 Token 计数，导致架构复杂化并增加网络延迟。\n- 因缺乏本地精确计数，常出现请求超出模型限制而报错，或为保险起见截断过多关键财务数据。\n- 无法在本地模拟 OpenAI 的分词逻辑，调试时需反复发送真实请求验证，大幅拖慢开发迭代速度。\n- 引入重型 NLP 库作为替代方案，导致应用启动缓慢且内存占用过高，影响高并发下的稳定性。\n\n### 使用 jtokkit 后\n- 直接在 Java 代码中集成 jtokkit，利用其零依赖特性实现本地毫秒级 Token 计算，彻底移除外部调用链路。\n- 通过 `getEncodingForModel` 精准匹配 GPT-4 分词规则，动态裁剪文本至最大阈值，既避免报错又最大化保留信息。\n- 开发人员可在单元测试中直接使用 `encode` 和 `decode` 方法模拟模型行为，将调试周期从小时级缩短至分钟级。\n- 凭借比同类库快 2-3 倍的性能及线程安全设计，轻松支撑高并发场景下的实时预检需求，显著降低服务器资源消耗。\n\njtokkit 让 Java 开发者拥有了与 Python 生态同等的原生分词能力，在保障精度的同时实现了成本与性能的双重优化。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fknuddelsgmbh_jtokkit_b83ee775.png","knuddelsgmbh","Knuddels","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fknuddelsgmbh_e5a626ec.png","",null,"https:\u002F\u002Fwww.knuddels.de","https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh",[23,27,31],{"name":24,"color":25,"percentage":26},"Java","#b07219",98.4,{"name":28,"color":29,"percentage":30},"Python","#3572A5",1.6,{"name":32,"color":33,"percentage":34},"Shell","#89e051",0.1,728,49,"2026-04-04T13:18:05","MIT",1,"未说明","不需要 GPU",{"notes":43,"python":44,"dependencies":45},"这是一个纯 Java 库，无外部依赖（Zero Dependencies）。支持 Java 8 及以上版本。可通过 Maven 或 Gradle 安装。EncodingRegistry 和 Encoding 类是线程安全的。","不适用",[],[47,48],"语言模型","开发框架",[50,51],"java","openai",2,"ready","2026-03-27T02:49:30.150509","2026-04-06T08:45:45.285064",[57,62,67,72,77,82,87],{"id":58,"question_zh":59,"answer_zh":60,"source_url":61},18128,"为什么 jtokkit 计算的 Token 数量与 OpenAI 官方显示的不一致？","这通常是因为 ChatML 格式的计算方式不同。请尝试使用官方推荐的 ChatML 计数方法（参考 OpenAI Cookbook）。此外，OpenAI 近期更新了函数调用（function invocation）功能，导致每个回复的引导 token 计算发生变化：旧版本是 `num_tokens += 3`（对应 `\u003C|start|>assistant\u003C|message|>`），新版本可能是 `num_tokens += 2`（对应 `\u003Cim_start>assistant`）。如果仅输入 prompt 或 completion 单独计算时结果一致，但在组合对话中不一致，请检查是否应用了正确的聊天模板计数逻辑。","https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fissues\u002F30",{"id":63,"question_zh":64,"answer_zh":65,"source_url":66},18129,"如何在多线程环境下避免 CPU 占用率过高（如 300%）的问题？","问题通常源于在每个线程任务中都创建了新的 `EncodingRegistry` 实例，导致词汇表被重复加载。`EncodingRegistry` 和 `Encoding` 都是线程安全的。解决方案是：只创建一次注册表实例，然后在所有线程中共享该实例，而不是在每个任务中调用 `Encodings.newDefaultEncodingRegistry()`。例如，将 `EncodingRegistry registry = Encodings.newDefaultEncodingRegistry();` 放在循环外部或作为静态单例使用。","https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fissues\u002F6",{"id":68,"question_zh":69,"answer_zh":70,"source_url":71},18130,"如何只加载需要的编码模型以加快初始化速度（特别是在移动端）？","默认情况下 `DefaultEncodingRegistry.initializeDefaultEncodings()` 会加载所有编码，导致初始化缓慢。从版本 0.5.0 开始，库支持懒加载或按需加载。你可以提取公共功能到 `AbstractEncodingRegistry`，使用 `LazyEncodingRegistry` 替代默认的 `EagerEncodingRegistry`，并通过 `Encodings` 类中的新工厂方法（如 `newLazyEncodingFactory`）来创建仅包含所需编码（如 `r50k_base.tiktoken`）的注册表实例，从而显著减少启动时间。","https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fissues\u002F23",{"id":73,"question_zh":74,"answer_zh":75,"source_url":76},18131,"如何获取编码后每个 Token 在原始字符串中的位置信息以便进行文本分块？","从版本 1.1.0 开始，`EncodingResult` 已支持返回位置信息。如果需要手动实现，可以在编码后迭代解码每个 token，通过比对解码结果与原始字符串的子串来确定位置。示例逻辑：创建一个指针指向原始字符串，逐个累加 token 并解码，当解码结果与当前指针位置的子串匹配时，记录该 token 的起始和结束位置。这允许你根据指定的 token 数量高效地对字符串进行分块。","https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fissues\u002F80",{"id":78,"question_zh":79,"answer_zh":80,"source_url":81},18132,"为什么 ModelType 枚举中没有包含 GPT-4 Turbo 或 gpt-4o 等新模型？","`ModelType` 枚举仅是一个便利工具，并非使用库的必要条件。对于尚未正式生产（preview）或新发布的模型（如早期的 GPT-4 Turbo 或 gpt-4o），维护者可能暂时不将其加入枚举以避免频繁更新。你可以直接使用 `EncodingRegistry#getEncoding(EncodingType)` 方法，传入对应的 `EncodingType`（例如 GPT-4 Turbo 使用 `CLK100K_BASE`，gpt-4o 使用 `O200K_BASE`）来获取编码器。从版本 1.1.0 起，相关编码类型和新模型支持已陆续发布。","https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fissues\u002F69",{"id":83,"question_zh":84,"answer_zh":85,"source_url":86},18133,"如何计算给定文本（如 \"Hello World\"）的 Token 数量？","可以使用库提供的 `encode` 方法。首先获取编码注册表和对应的编码器（例如 `CL100K_BASE`），然后调用 `enc.encode(\"你的文本\")`，返回的是一个整数列表，其大小（size）即为 Token 数量。示例代码：\n```java\nEncodingRegistry registry = Encodings.newDefaultEncodingRegistry();\nEncoding enc = registry.getEncoding(EncodingType.CL100K_BASE);\nint tokenCount = enc.encode(\"Hello World\").size();\n```","https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fissues\u002F4",{"id":88,"question_zh":89,"answer_zh":90,"source_url":91},18134,"Azure OpenAI 的 Token 计数为什么比实际消耗少 21 个？","如果遇到计数偏差（如少 21 个），首先请使用 OpenAI 官方的 Tokenizer 网页工具（https:\u002F\u002Fplatform.openai.com\u002Ftokenizer）输入相同的消息内容进行验证。如果官方工具的结果与 jtokkit 一致，则问题可能出在输入数据的构造上（例如是否包含了 System Role 或其他隐藏字符），而非库本身的错误。请确保输入的 ChatMessages 格式完全符合预期，包括所有的角色标记和内容。","https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fissues\u002F78",[93,98,103,108,113,118,123,128,133,138],{"id":94,"version":95,"summary_zh":96,"released_at":97},108598,"1.1.0","## 变更内容\n* 由 @dafriz 在 https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fpull\u002F92 中将 gpt-3.5-turbo 的 maxContextLength 增加至 16k\n* 由 @dafriz 在 https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fpull\u002F94 中新增 gpt-4-turbo 模型\n* 功能：实现 o200k_base 编码并支持 gpt-4o，由 @chatanywhere 在 https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fpull\u002F99 中完成\n* 由 @dafriz 在 https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fpull\u002F101 中将 o200k_base 编码添加到文档中\n* 由 @dafriz 在 https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fpull\u002F102 中新增 gpt-4o-mini 模型\n\n## 新贡献者\n* @dafriz 在 https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fpull\u002F92 中完成了首次贡献\n* @imsosleepy 在 https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fpull\u002F97 中完成了首次贡献\n* @chatanywhere 在 https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fpull\u002F99 中完成了首次贡献\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fcompare\u002F1.0.0...1.1.0","2024-07-19T14:01:53",{"id":99,"version":100,"summary_zh":101,"released_at":102},108599,"1.0.0","## 功能特性\n\n* CL100k 编码性能提升 5 倍\n  * 感谢 @paplorinc 的出色工作！\n* 在 `ModelType` 枚举中新增了 `text-embedding-3-small` 和 `text-embedding-3-large`\n\n## 重大变更\n\n* 由于性能优化，我们现在返回自定义的 `IntArrayList` 而不是 `List\u003CInteger>`，以避免不必要的装箱操作。`IntArrayList` 并未实现 `List` 接口，因此属于重大变更。如果您发现 `IntArrayList` 缺少某些关键功能，请提交问题。\n\n**完整更新日志**: https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fcompare\u002F0.6.1...1.0.0","2024-02-10T13:46:40",{"id":104,"version":105,"summary_zh":106,"released_at":107},108600,"0.6.1","## 修复\n* 添加了 workaround，以防止 Android 设备上正则表达式编译出现问题\n\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fcompare\u002F0.6.0...0.6.1","2023-07-03T08:37:47",{"id":109,"version":110,"summary_zh":111,"released_at":112},108601,"0.6.0","## 功能\n* 在 `ModelType` 枚举中添加了 `GPT_3_5_TURBO_16k`\n\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fcompare\u002F0.5.1...0.6.0","2023-06-30T14:45:00",{"id":114,"version":115,"summary_zh":116,"released_at":117},108602,"0.5.1","## 修复\n* 修复了一个导致 Unicode 输入编码错误的问题。感谢 @VoidIsVoid 提出并解决了这个问题 :slightly_smiling_face: \n\n## 新贡献者\n* @VoidIsVoid 在 https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fpull\u002F34 中完成了他们的首次贡献\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fcompare\u002F0.5.0...0.5.1","2023-06-26T08:42:48",{"id":119,"version":120,"summary_zh":121,"released_at":122},108603,"0.5.0","## 功能特性\n* 新增了一个 `EncodingRegistry`，它只会按需懒加载请求的词汇表，而不再在初始化时立即加载所有词汇表。感谢 @blackdiz 提出这一功能需求并实现它 :blush: \n\n## 新贡献者\n* @blackdiz 在 https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fpull\u002F24 中完成了他们的首次贡献\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fcompare\u002F0.4.0...0.5.0","2023-05-16T12:11:23",{"id":124,"version":125,"summary_zh":126,"released_at":127},108604,"0.4.0","## 功能特性\n* 向 `Encoding` 接口新增了两个方法：`encode(String, int)` 和 `encodeOrdinary(String, int)`。这两个方法都允许传入一个 `maxTokens` 整数参数，当编码达到指定的最大标记数时，编码过程将停止。感谢 @radosdesign 提出这一功能需求并实现它 :blush:  \n\n## 破坏性变更\n* `Encoding` 接口新增了两个方法：`encode(String, int)` 和 `encodeOrdinary(String, int)`。如果您自行实现了该接口，在升级时需要更新您的实现。\n\n## 新贡献者\n* @radosdesign 在 https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fpull\u002F12 中完成了他们的首次贡献。\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fcompare\u002F0.3.0...0.4.0","2023-04-17T08:30:54",{"id":129,"version":130,"summary_zh":131,"released_at":132},108605,"0.3.0","### 功能\n- 在 `ModelType` 中新增了 `gpt-4-32k`\n- 新增了 `ModelType#getMaxContextLength` 方法，用于返回模型允许的最大上下文长度。请注意，此上下文长度包括提示令牌以及在适用情况下还包括完成令牌。\n\n### 破坏性变更\n- `ModelType` 的 `name` 和 `encodingType` 属性已由公共访问权限改为私有。如果您之前直接访问这些属性，请迁移到使用 `modelType.getName()` 和 `modelType.getEncodingType()`。\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fcompare\u002F0.2.0...0.3.0","2023-04-15T10:11:44",{"id":134,"version":135,"summary_zh":136,"released_at":137},108606,"0.2.0","### 功能特性\n- 在 Encoding 类中添加了 encodeOrdinary 和 countTokensOrdinary 方法。\n  - 现有的 encode 和 countTokens 方法在遇到特殊标记时会抛出异常。此次更改引入了 encodeOrdinary 方法，该方法会将特殊标记视为普通文本进行编码。\n- 在 EncodingRegistry 中添加了 getEncodingForModel(String) 方法，允许通过模型的字符串名称获取对应的编码。\n- 现在可以使用模型的快照版本（例如 \"gpt-4-0314\"）调用 EncodingRegistry#getEncodingForModel(String)，并获得正确的编码。\n\n\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002Fknuddelsgmbh\u002Fjtokkit\u002Fcompare\u002F0.1.0...0.2.0","2023-04-06T07:25:32",{"id":139,"version":140,"summary_zh":141,"released_at":142},108607,"0.1.0","# ⭐ 初始发布\n\n* 实现了 `cl100k_base`、`p50k_base`、`p50k_edit`、`r50k_base` 的具体实现","2023-03-20T21:47:33",[144,155,163,171,179,192],{"id":145,"name":146,"github_repo":147,"description_zh":148,"stars":149,"difficulty_score":150,"last_commit_at":151,"category_tags":152,"status":53},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,3,"2026-04-05T11:01:52",[48,153,154],"图像","Agent",{"id":156,"name":157,"github_repo":158,"description_zh":159,"stars":160,"difficulty_score":52,"last_commit_at":161,"category_tags":162,"status":53},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 真正成长为懂上",140436,"2026-04-05T23:32:43",[48,154,47],{"id":164,"name":165,"github_repo":166,"description_zh":167,"stars":168,"difficulty_score":52,"last_commit_at":169,"category_tags":170,"status":53},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 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107662,"2026-04-03T11:11:01",[48,153,154],{"id":172,"name":173,"github_repo":174,"description_zh":175,"stars":176,"difficulty_score":52,"last_commit_at":177,"category_tags":178,"status":53},3704,"NextChat","ChatGPTNextWeb\u002FNextChat","NextChat 是一款轻量且极速的 AI 助手，旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性，以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发，NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。\n\n这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言，它也提供了便捷的自托管方案，支持一键部署到 Vercel 或 Zeabur 等平台。\n\nNextChat 的核心亮点在于其广泛的模型兼容性，原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型，让用户在一个界面即可自由切换不同 AI 能力。此外，它还率先支持 MCP（Model Context Protocol）协议，增强了上下文处理能力。针对企业用户，NextChat 提供专业版解决方案，具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能，满足公司对数据隐私和个性化管理的高标准要求。",87618,"2026-04-05T07:20:52",[48,47],{"id":180,"name":181,"github_repo":182,"description_zh":183,"stars":184,"difficulty_score":52,"last_commit_at":185,"category_tags":186,"status":53},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",84991,"2026-04-05T10:45:23",[153,187,188,189,154,190,47,48,191],"数据工具","视频","插件","其他","音频",{"id":193,"name":194,"github_repo":195,"description_zh":196,"stars":197,"difficulty_score":150,"last_commit_at":198,"category_tags":199,"status":53},3128,"ragflow","infiniflow\u002Fragflow","RAGFlow 是一款领先的开源检索增强生成（RAG）引擎，旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体（Agent）能力相结合，不仅支持从各类文档中高效提取知识，还能让模型基于这些知识进行逻辑推理和任务执行。\n\n在大模型应用中，幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构（如表格、图表及混合排版），显著提升了信息检索的准确度，从而有效减少模型“胡编乱造”的现象，确保回答既有据可依又具备时效性。其内置的智能体机制更进一步，使系统不仅能回答问题，还能自主规划步骤解决复杂问题。\n\n这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统，还是致力于探索大模型在垂直领域落地的创新者，都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口，既降低了非算法背景用户的上手门槛，也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目，它正成为连接通用大模型与行业专有知识之间的重要桥梁。",77062,"2026-04-04T04:44:48",[154,153,48,47,190]]