[{"data":1,"prerenderedAt":2670},["ShallowReactive",2],{"search-docs":3,"doc-\u002Fai\u002Frag\u002Fvector-database":886},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,159,162,165,169,172,175,178,182,186,190,194,198,202,206,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,269,273,277,281,285,288,291,294,298,301,304,307,310,313,316,319,322,325,329,332,336,340,344,348,352,356,359,362,365,368,371,374,377,380,383,386,389,393,396,399,402,405,408,411,414,417,420,424,428,432,435,438,442,446,450,454,458,462,466,470,474,477,480,483,487,491,494,497,500,504,507,511,515,518,521,524,527,530,533,536,539,542,545,548,551,554,557,560,563,566,569,572,575,579,583,587,591,595,599,603,606,610,614,617,620,623,626,629,633,637,640,643,646,649,652,655,658,661,664,667,670,673,676,679,682,685,688,691,694,697,700,703,706,709,712,716,720,724,728,732,736,740,744,748,752,756,760,764,768,772,775,779,783,787,790,793,796,799,802,805,808,811,814,818,822,825,829,832,835,838,841,844,848,851,854,858,862,865,869,873,876,879,882],{"path":5,"title":6,"description":7},"\u002Fabout\u002Fauthor","作者相关","只想纯粹的做一个程序员...",{"path":9,"title":10,"description":11},"\u002Fabout\u002Fjourney","心路历程","",{"path":13,"title":14,"description":15},"\u002Fai\u002Fagent\u002Fframeworks","Agent 框架","主流 Agent 框架：LangChain、LlamaIndex、AutoGen、CrewAI",{"path":17,"title":18,"description":19},"\u002Fai\u002Fagent\u002Fhooks","Agent Hooks 与自动化","Claude Agent 的 Hooks 生命周期、事件类型、典型自动化场景",{"path":21,"title":22,"description":23},"\u002Fai\u002Fagent\u002Fintroduction","AI Agent 概述","AI Agent 核心概念：感知、规划、执行、记忆",{"path":25,"title":26,"description":27},"\u002Fai\u002Fagent\u002Fpractice","Agent 实战","AI Agent 实战：构建自主任务执行系统",{"path":29,"title":30,"description":31},"\u002Fai\u002Fagent\u002Fsdk","Claude Agent SDK 开发","使用 Claude Agent SDK 构建自定义 AI Agent：架构、API、生命周期",{"path":33,"title":34,"description":35},"\u002Fai\u002Fagent\u002Fsubagents","Subagents 子代理","用 Subagents 分解复杂任务、并发执行、隔离上下文",{"path":37,"title":38,"description":39},"\u002Fai\u002Fagent\u002Ftool-use","工具调用","AI Agent 工具调用：Function Calling、Tool Use 原理与实践",{"path":41,"title":42,"description":43},"\u002Fai\u002Ffundamentals\u002Fdeep-learning","深度学习入门","深度学习基础知识：前向传播、反向传播、损失函数、优化器",{"path":45,"title":46,"description":47},"\u002Fai\u002Ffundamentals\u002Fml-basics","机器学习基础","机器学习核心概念：监督学习、无监督学习、强化学习",{"path":49,"title":50,"description":51},"\u002Fai\u002Ffundamentals\u002Fneural-networks","神经网络原理","神经网络架构：CNN、RNN、注意力机制",{"path":53,"title":54,"description":55},"\u002Fai\u002Fgetting-started","AI 学习路线","AI 技术学习路线图，从基础到实战的完整指南",{"path":57,"title":58,"description":59},"\u002Fai\u002Fllm\u002Ffine-tuning","模型微调","大模型微调技术：LoRA、QLoRA、全量微调、RLHF",{"path":61,"title":62,"description":63},"\u002Fai\u002Fllm\u002Fintroduction","大模型概述","大语言模型发展历程、核心能力与主流模型对比",{"path":65,"title":66,"description":67},"\u002Fai\u002Fllm\u002Flocal-deploy","本地部署","大模型本地部署：Ollama、vLLM、llama.cpp",{"path":69,"title":70,"description":71},"\u002Fai\u002Fllm\u002Ftransformer","Transformer 架构","Transformer 架构详解：自注意力机制、位置编码、多头注意力",{"path":73,"title":74,"description":75},"\u002Fai\u002Fmcp\u002Fclient","MCP Client 开发","MCP Client 开发指南：连接、调用、集成",{"path":77,"title":78,"description":79},"\u002Fai\u002Fmcp\u002Fdebugging","MCP 调试与排错","MCP Server 开发与集成过程中的常见问题、日志分析、诊断工具",{"path":81,"title":82,"description":83},"\u002Fai\u002Fmcp\u002Fintroduction","MCP 概述","Model Context Protocol 协议概述：架构、核心概念、应用场景",{"path":85,"title":86,"description":87},"\u002Fai\u002Fmcp\u002Fserver","MCP Server 开发","MCP Server 开发指南：资源、工具、提示词的实现",{"path":89,"title":90,"description":91},"\u002Fai\u002Fmcp\u002Ftools","MCP Tools 深入","深入理解 MCP Tools：与 Resources\u002FPrompts 的差异、Schema 设计、Annotations 与权限控制",{"path":93,"title":94,"description":95},"\u002Fai\u002Fprompt\u002Fadvanced","高级 Prompt 模式","高级 Prompt 设计模式：Tree-of-Thought、自我反思、多轮对话策略",{"path":97,"title":98,"description":99},"\u002Fai\u002Fprompt\u002Fbasics","Prompt 基础","Prompt Engineering 入门：基本概念、角色设定、输出格式控制",{"path":101,"title":102,"description":103},"\u002Fai\u002Fprompt\u002Ftechniques","提示词技巧","常用提示词技巧：Few-shot、Chain-of-Thought、ReAct",{"path":105,"title":106,"description":107},"\u002Fai\u002Frag\u002Fembedding","文本嵌入","文本嵌入模型：Embedding 原理、模型选择、相似度计算",{"path":109,"title":110,"description":111},"\u002Fai\u002Frag\u002Fintroduction","RAG 概述","检索增强生成（RAG）架构原理、优势与应用场景",{"path":113,"title":114,"description":115},"\u002Fai\u002Frag\u002Fpractice","RAG 实战","RAG 应用实战：文档问答系统、知识库搭建",{"path":117,"title":118,"description":119},"\u002Fai\u002Frag\u002Fvector-database","向量数据库","主流向量数据库对比：Milvus、Pinecone、Chroma、Weaviate",{"path":121,"title":122,"description":123},"\u002Fai\u002Fskills\u002Fbest-practices","Skill 最佳实践","编写高质量 Skill 的设计原则、常见陷阱与优化技巧",{"path":125,"title":126,"description":127},"\u002Fai\u002Fskills\u002Fcreating","创建自定义 Skill","从零编写一个可被 Agent 自动发现和调用的 Skill",{"path":129,"title":130,"description":131},"\u002Fai\u002Fskills\u002Fintroduction","Agent Skills 概述","Claude Agent Skills 概念、工作原理、与 Tools\u002FMCP 的区别",{"path":133,"title":134,"description":135},"\u002Fgolang\u002Fadvanced\u002Fconcurrency","Go - 并发深入","深入理解 Go 并发编程的核心机制。",{"path":137,"title":138,"description":139},"\u002Fgolang\u002Fadvanced\u002Fgc","Go - 垃圾回收","理解 Go 的垃圾回收机制，掌握 GC 调优方法。",{"path":141,"title":142,"description":143},"\u002Fgolang\u002Fadvanced\u002Fgmp","Go - GMP 调度模型","GMP 是 Go 运行时调度器的核心模型，理解它对于编写高性能 Go 程序至关重要。",{"path":145,"title":146,"description":147},"\u002Fgolang\u002Fadvanced\u002Fgo-concurrency","Go - 并发编程","Go 的并发是其核心特性之一，通过 Goroutine 和 Channel 实现。",{"path":149,"title":150,"description":151},"\u002Fgolang\u002Fadvanced\u002Fmemory","Go - 内存模型","理解 Go 的内存分配机制和内存模型。",{"path":153,"title":154,"description":155},"\u002Fgolang\u002Fadvanced\u002Fprofiling","Go - 性能分析","掌握 Go 的性能分析工具：pprof、trace、benchmark。",{"path":157,"title":158,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-basic","Go - 基础语法",{"path":160,"title":161,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-composite","Go - 复合类型",{"path":163,"title":164,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-control","Go - 流程控制",{"path":166,"title":167,"description":168},"\u002Fgolang\u002Fcore\u002Fgo-error","Go - 错误处理","Go 使用显式的错误返回值来处理错误，而不是异常机制。",{"path":170,"title":171,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-function","Go - 函数",{"path":173,"title":174,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-install","Go - 环境搭建",{"path":176,"title":177,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-interface","Go - 接口",{"path":179,"title":180,"description":181},"\u002Fgolang\u002Fcore\u002Fgo-module","Go - 包管理","Go Modules 是 Go 1.11 引入的官方依赖管理方案，Go 1.16 后成为默认模式。",{"path":183,"title":184,"description":185},"\u002Fgolang\u002Fdistributed\u002Fgrpc","Go - gRPC","gRPC 是 Google 开发的高性能 RPC 框架，使用 Protocol Buffers 作为序列化协议。",{"path":187,"title":188,"description":189},"\u002Fgolang\u002Fdistributed\u002Fmicroservice","Go - 微服务","微服务架构的核心组件：服务发现、负载均衡、熔断降级。",{"path":191,"title":192,"description":193},"\u002Fgolang\u002Fdistributed\u002Fmq","Go - 消息队列","使用 Go 操作 Kafka 和 RabbitMQ。",{"path":195,"title":196,"description":197},"\u002Fgolang\u002Fdistributed\u002Fredis","Go - Redis","使用 go-redis 操作 Redis，实现缓存、分布式锁等功能。",{"path":199,"title":200,"description":201},"\u002Fgolang\u002Fengineering\u002Fconfig","Go - 配置管理","使用 viper 进行配置管理，支持多种配置格式和配置中心。",{"path":203,"title":204,"description":205},"\u002Fgolang\u002Fengineering\u002Fdocker","Go - Docker 部署","使用 Docker 容器化部署 Go 应用。",{"path":207,"title":208,"description":209},"\u002Fgolang\u002Fengineering\u002Fkubernetes","Go - Kubernetes 部署","在 Kubernetes 上部署和管理 Go 应用。",{"path":211,"title":212,"description":213},"\u002Fgolang\u002Fengineering\u002Flogging","Go - 日志系统","使用 zap 和 logrus 构建高性能结构化日志系统。",{"path":215,"title":216,"description":217},"\u002Fgolang\u002Fengineering\u002Ftesting","Go - 单元测试","Go 内置了强大的测试框架，掌握测试是编写高质量代码的基础。",{"path":219,"title":220,"description":221},"\u002Fgolang\u002Fstdlib\u002Fbufio","bufio","在 Go 语言中，bufio 包提供了带缓冲的 I\u002FO 操作，能够提高读写性能。以下是一些常用的 bufio 包 API 及其详细说明：",{"path":223,"title":224,"description":225},"\u002Fgolang\u002Fstdlib\u002Fcontainer","container","在Go语言标准库中，container 包提供了几种常用的数据结构实现，这些数据结构对于高效地管理和操作数据非常有用。以下是 container 包中主要的数据结构：",{"path":227,"title":228,"description":229},"\u002Fgolang\u002Fstdlib\u002Fcrypto","crypto","在 Go 语言中，crypto 包提供了一组用于加密和解密的功能。以下是一些常用的 crypto 包及其子包的 API 及其详细说明：",{"path":231,"title":232,"description":233},"\u002Fgolang\u002Fstdlib\u002Fencoding-csv","encoding\u002Fcsv","在 Go 语言中，encoding\u002Fcsv 包提供了对 CSV（逗号分隔值）文件进行读写的功能。以下是一些常用的 encoding\u002Fcsv 包的 API 及其详细说明：",{"path":235,"title":236,"description":237},"\u002Fgolang\u002Fstdlib\u002Fencoding-json","encoding\u002Fjson","在 Go 语言中，encoding\u002Fjson 包提供了对 JSON 数据进行编码和解码的功能。以下是一些常用的 encoding\u002Fjson 包的 API 及其详细说明：",{"path":239,"title":240,"description":241},"\u002Fgolang\u002Fstdlib\u002Fencoding-xml","encoding\u002Fxml","在 Go 语言中，encoding\u002Fxml 包提供了对 XML 数据进行编码和解码的功能。以下是一些常用的 encoding\u002Fxml 包的 API 及其详细说明：",{"path":243,"title":244,"description":245},"\u002Fgolang\u002Fstdlib\u002Fflag","flag","在Go语言中，flag 包是用于处理命令行参数的标准库，它提供了一种简单而直接的方式来解析和使用命令行参数。下面是关于 flag 包的一些基本介绍和常用功能：",{"path":247,"title":248,"description":249},"\u002Fgolang\u002Fstdlib\u002Ffmt","fmt","在 Go 语言的标准库中，fmt 包是非常重要的，它提供了处理格式化输入和输出的基本工具。以下是一些 fmt 包内常用的API：",{"path":251,"title":252,"description":253},"\u002Fgolang\u002Fstdlib\u002Fhttp","net\u002Fhttp","在 Go 语言中，net\u002Fhttp 包提供了用于构建 HTTP 客户端和服务器的强大工具。以下是一些常用的 net\u002Fhttp 包的 API 及其详细说明：",{"path":255,"title":256,"description":257},"\u002Fgolang\u002Fstdlib\u002Fio","io","在 Go 语言中，io 包提供了基本的输入输出功能。以下是一些常用的 io 包的 API 及其详细说明：",{"path":259,"title":260,"description":261},"\u002Fgolang\u002Fstdlib\u002Flog","log","在 Go 语言中，log 包提供了简单的日志记录功能。以下是一些常用的 log 包的 API 及其详细说明：",{"path":263,"title":264,"description":265},"\u002Fgolang\u002Fstdlib\u002Fmath","math","在 Go 语言中，math 包提供了基本的数学函数和常量。以下是一些常用的 math 包的 API 及其详细说明：",{"path":267,"title":268,"description":11},"\u002Fgolang\u002Fstdlib\u002Fnet","net",{"path":270,"title":271,"description":272},"\u002Fgolang\u002Fstdlib\u002Fos","os","在Go语言中，os 包是一个非常重要且常用的标准库，它提供了与操作系统交互的功能，包括文件操作、环境变量管理、进程管理等。下面是一些 os 包中常用的功能和API：",{"path":274,"title":275,"description":276},"\u002Fgolang\u002Fstdlib\u002Fsort","order","在 Go 语言中，sort 包提供了对切片和用户定义的集合进行排序的函数。它实现了常见的排序算法，如快速排序（Quicksort）和堆排序（Heapsort），并且为自定义集合提供了接口，使得用户可以根据特定的需求进行排序。",{"path":278,"title":279,"description":280},"\u002Fgolang\u002Fstdlib\u002Fstrconv","strconv","在 Go 语言中，strconv 包提供了字符串和基本数据类型之间的转换函数，例如将整数转换为字符串、字符串转换为整数，以及其他类型之间的转换。这些功能非常有用，特别是在处理用户输入或从外部数据源读取数据时。",{"path":282,"title":283,"description":284},"\u002Fgolang\u002Fstdlib\u002Ftime","time","在 Go 语言中，time 包提供了处理时间和日期的功能。以下是一些常用的 time 包的 API 及其详细说明：",{"path":286,"title":287,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Ferror","Gin - 错误处理",{"path":289,"title":290,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Ffile","Gin - 文件处理",{"path":292,"title":293,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fmiddleware","Gin - 中间件",{"path":295,"title":296,"description":297},"\u002Fgolang\u002Fweb\u002Fgin\u002Fquickstart","Gin - 快速开始","Gin 是目前最流行的 Go Web 框架，以高性能和简洁 API 著称。",{"path":299,"title":300,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Frequest","Gin - 请求处理",{"path":302,"title":303,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fresponse","Gin - 响应处理",{"path":305,"title":306,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Frouter","Gin - 路由",{"path":308,"title":309,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fvalidation","Gin - 参数校验",{"path":311,"title":312,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fassociation","GORM - 关联关系",{"path":314,"title":315,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fcrud","GORM - CRUD 操作",{"path":317,"title":318,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fmodel","GORM - 模型定义",{"path":320,"title":321,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fperformance","GORM - 日志与性能",{"path":323,"title":324,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fquery","GORM - 高级查询",{"path":326,"title":327,"description":328},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fquickstart","GORM - 快速开始","GORM 是 Go 语言最流行的 ORM 库，功能强大，使用简单。",{"path":330,"title":331,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Ftransaction","GORM - 事务与 Hook",{"path":333,"title":334,"description":335},"\u002Finterview\u002Fbasic","计算机基础面经","本章节汇总了面试中常见的通用技术概念，不局限于特定语言或数据库，是考察技术内功的关键考点。",{"path":337,"title":338,"description":339},"\u002Finterview\u002Fgolang","Golang 面试题","Go 语言面试高频考点，覆盖基础语法、数据结构、并发编程、内存管理、GC、调度器等核心知识。",{"path":341,"title":342,"description":343},"\u002Finterview\u002Fk8s","Kubernetes 面试题","Kubernetes（K8s）面试高频考点，覆盖架构原理、核心资源、网络存储、调度策略、运维监控等核心知识。",{"path":345,"title":346,"description":347},"\u002Finterview\u002Fmysql","MySQL 面试题","MySQL 数据库面试高频考点，覆盖索引、事务、锁、优化、主从复制等核心知识。",{"path":349,"title":350,"description":351},"\u002Finterview\u002Fredis","Redis 面试题","Redis 面试高频考点，覆盖数据结构、持久化、集群、缓存一致性、性能优化等核心知识。",{"path":353,"title":354,"description":355},"\u002Finterview\u002Frocketmq","RocketMQ 面试题","RocketMQ 面试高频考点，覆盖消息模型、可靠性、顺序消息、事务消息、存储与高可用等核心知识。",{"path":357,"title":358,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-arraylist","List - ArrayList 源码解析",{"path":360,"title":361,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-linkedlist","List - LinkedList 源码解析",{"path":363,"title":364,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-stack","List - Satck源码解析",{"path":366,"title":367,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-vectore","List - Vector 源码解析",{"path":369,"title":370,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-hashmap","Map - HashMap 源码解析",{"path":372,"title":373,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-linkedhashmap","Map - LinkedHashMap 源码解析",{"path":375,"title":376,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-treemap","Map - TreeMap 源码解析",{"path":378,"title":379,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fqueue-deque","Queue - Deque 接口解析",{"path":381,"title":382,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fqueue-queue","Queue - Queue 接口解析",{"path":384,"title":385,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-hashset","Set - HashSet源码解析",{"path":387,"title":388,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-linkedhashset","Set - LinkedHashSet 源码解析",{"path":390,"title":391,"description":392},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-treeset","Set - TreeSet源码解析","TreeSet 是一个 Set 集合接口的实现类，与 HashSet 类似，其底层也是通过维护了一个 TreeMap 对象来封装了一些实现方法，故本篇不再对 TreeSet 的底层原理进行详细说明，仅对常用 API 做简单介绍，如需了解 TreeMap 的底层实现原理，请移步 Map - HashMap 源码解析",{"path":394,"title":395,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fannotation","Java核心 - 注解",{"path":397,"title":398,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fbasic-grammar","Java核心 - 基础语法",{"path":400,"title":401,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fclass-and-object","Java核心 - 面向对象",{"path":403,"title":404,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fcommon-classes","Java核心 - 常用类",{"path":406,"title":407,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fexception","Java核心 - 异常处理",{"path":409,"title":410,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fgenerics","Java核心 - 泛型",{"path":412,"title":413,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fjdk-env-path","Java核心 - 环境搭建",{"path":415,"title":416,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Freflection","Java核心 - 反射",{"path":418,"title":419,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fstring","Java核心 - String 字符串",{"path":421,"title":422,"description":423},"\u002Fother\u002Fjava\u002Fio\u002Fbuffer-stream","Java IO - 缓冲流","缓冲流是对基本流的包装，通过内置缓冲区减少系统调用次数，大幅提升读写效率。",{"path":425,"title":426,"description":427},"\u002Fother\u002Fjava\u002Fio\u002Fbyte-stream","Java IO - 字节流","字节流是 Java IO 中最基本的流类型，以字节（byte）为单位进行数据读写，可以处理任意类型的文件。",{"path":429,"title":430,"description":431},"\u002Fother\u002Fjava\u002Fio\u002Fchar-stream","Java IO - 字符流","字符流以字符为单位进行读写，专门用于处理文本文件。相比字节流，字符流能够正确处理字符编码，避免中文乱码问题。",{"path":433,"title":434,"description":11},"\u002Fother\u002Fjava\u002Fio\u002Ffile","Java IO - File 类",{"path":436,"title":437,"description":11},"\u002Fother\u002Fjava\u002Fio\u002Fio-stream-system","Java IO - IO流概述",{"path":439,"title":440,"description":441},"\u002Fother\u002Fjava\u002Fio\u002Fnio","Java IO - NIO","NIO（New IO）是 JDK 1.4 引入的新 IO 模型，提供了更高效的 IO 操作方式，支持非阻塞 IO 和多路复用。",{"path":443,"title":444,"description":445},"\u002Fother\u002Fjava\u002Fjvm\u002Fclass-loading","类加载机制","类加载机制是 JVM 将 .class 文件加载到内存，并对数据进行校验、转换解析和初始化，最终形成可被 JVM 直接使用的 Java 类型的过程。",{"path":447,"title":448,"description":449},"\u002Fother\u002Fjava\u002Fjvm\u002Fgarbage-collection","垃圾回收","垃圾回收（Garbage Collection，GC）是 JVM 自动管理内存的机制，负责回收不再使用的对象所占用的内存。",{"path":451,"title":452,"description":453},"\u002Fother\u002Fjava\u002Fjvm\u002Fjvm-memory","JVM 内存结构","JVM 在执行 Java 程序时，会把它管理的内存划分为若干个不同的数据区域。这些区域有各自的用途、创建和销毁时间。",{"path":455,"title":456,"description":457},"\u002Fother\u002Fjava\u002Fjvm\u002Fjvm-tuning","JVM 调优","JVM 调优是优化 Java 应用性能的重要手段，主要包括参数配置、性能监控和问题排查。",{"path":459,"title":460,"description":461},"\u002Fother\u002Fjava\u002Fthread\u002Fatomic","原子类","Java 原子类（Atomic Classes）提供了一种无锁的线程安全方式，基于 CAS（Compare-And-Swap）操作实现。",{"path":463,"title":464,"description":465},"\u002Fother\u002Fjava\u002Fthread\u002Fcompletable-future","CompletableFuture","CompletableFuture 是 JDK 8 引入的异步编程工具，实现了 Future 和 CompletionStage 接口，支持函数式编程和链式调用。",{"path":467,"title":468,"description":469},"\u002Fother\u002Fjava\u002Fthread\u002Fconcurrent-collections","并发集合","Java 并发包提供了多种线程安全的集合类，用于替代传统的同步集合（如 Collections.synchronizedList）。",{"path":471,"title":472,"description":473},"\u002Fother\u002Fjava\u002Fthread\u002Fconcurrent-utils","并发工具类","Java 并发包提供了多种实用的并发工具类，用于控制线程之间的协调与同步。",{"path":475,"title":476,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fsynchronized-lock","同步机制",{"path":478,"title":479,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fthread-basic","线程基础",{"path":481,"title":482,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fthread-pool","线程池",{"path":484,"title":485,"description":486},"\u002Fother\u002Fspring-series\u002Fspring\u002Fannotations-beans","Spring - 基于注解管理Bean","从 Java 5 开始，Java 增加了对注解（Annotation）的支持，它是代码中的一种特殊标记，可以在编译、类加载和运行时被读取，执行相应的处理。开发人员可以通过注解在不改变原有代码和逻辑的情况下，在源代码中嵌入补充信息。",{"path":488,"title":489,"description":490},"\u002Fother\u002Fspring-series\u002Fspring\u002Fimplement-ioc","Spring - 原理手写IoC","Spring 框架的 IOC 是基于 Java 反射机制实现的，在学习手写 IoC 之前，你需要具备一定的 Java 反射相关的知识，参考本站内的 Java 教程。",{"path":492,"title":493,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fintroduction-case","Spring - 入门案例",{"path":495,"title":496,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-aop","Spring - 面向切面AOP",{"path":498,"title":499,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-aot","Spring - AOT提前编译",{"path":501,"title":502,"description":503},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-data-validation","Spring - 数据校验","在开发中，我们经常遇到参数校验的需求，比如用户注册的时候，要校验用户名不能为空、用户名长度不超过20个字符、手机号是合法的手机号格式等等。如果使用普通方式，我们会把校验的代码和真正的业务处理逻辑耦合在一起，而且如果未来要新增一种校验逻辑也需要在修改多个地方。而spring validation允许通过注解的方式来定义对象校验规则，把校验和业务逻辑分离开，让代码编写更加方便。Spring Validation其实就是对Hibernate Validator进一步的封装，方便在Spring中使用。",{"path":505,"title":506,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-i18n","Spring - 国际化i18n",{"path":508,"title":509,"description":510},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-ioc","Spring - IOC容器","IoC 是 Inversion of Control 的简写，译为“控制反转”，它不是一门技术，而是一种设计思想，是一个重要的面向对象编程法则，能够指导我们如何设计出松耦合、更优良的程序。",{"path":512,"title":513,"description":514},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-junit","Spring - 单元测试JUnit","在之前的测试方法中，几乎都能看到以下的两行代码：",{"path":516,"title":517,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-resources","Spring - 资源操作",{"path":519,"title":520,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-summarize","Spring - Spring概述",{"path":522,"title":523,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-transaction","Spring - 事务",{"path":525,"title":526,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fxml-beans","Spring - 基于XML管理Bean",{"path":528,"title":529,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-config","SpringBoot - 配置详解",{"path":531,"title":532,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-data","SpringBoot - 数据访问",{"path":534,"title":535,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-quickstart","SpringBoot - 快速入门",{"path":537,"title":538,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-web","SpringBoot - Web 开发",{"path":540,"title":541,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-config","SpringCloud - 配置中心",{"path":543,"title":544,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-discovery","SpringCloud - 服务注册与发现",{"path":546,"title":547,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-feign","SpringCloud - 服务调用",{"path":549,"title":550,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-gateway","SpringCloud - 服务网关",{"path":552,"title":553,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-introduction","SpringCloud - 微服务概述",{"path":555,"title":556,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-sentinel","SpringCloud - 服务保护",{"path":558,"title":559,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-databind","SpringMVC - 数据绑定与转换",{"path":561,"title":562,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-exception","SpringMVC - 异常处理",{"path":564,"title":565,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-interceptor","SpringMVC - 拦截器",{"path":567,"title":568,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-introduction","SpringMVC - 简介与环境搭建",{"path":570,"title":571,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-request","SpringMVC - 请求处理",{"path":573,"title":574,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-response","SpringMVC - 响应处理",{"path":576,"title":577,"description":578},"\u002Fproject\u002Frocket-leaf\u002Farchitecture","项目架构","Rocket-Leaf 的目录结构、模块划分、数据流向，以及各层之间的依赖关系。",{"path":580,"title":581,"description":582},"\u002Fproject\u002Frocket-leaf\u002Fbackend-layers","后端分层设计","Rocket-Leaf 的 model \u002F rocketmq \u002F service 三层结构，以及服务之间的依赖关系与设计取舍。",{"path":584,"title":585,"description":586},"\u002Fproject\u002Frocket-leaf\u002Fclient-manager","RocketMQ 客户端管理器","AdminClientManager 的多客户端池、默认连接懒加载、自动重连重试的设计与实现。",{"path":588,"title":589,"description":590},"\u002Fproject\u002Frocket-leaf\u002Fencryption","连接信息加密存储","AES-256-GCM + SHA-256 字段级派生密钥的实现，以及如何在不破坏兼容性的前提下为历史明文数据做透明迁移。",{"path":592,"title":593,"description":594},"\u002Fproject\u002Frocket-leaf\u002Ffrontend","前端结构与类型绑定","React + Vite 目录组织、自动生成的 Wails 绑定、api 薄封装与自定义 hooks 的职责划分。",{"path":596,"title":597,"description":598},"\u002Fproject\u002Frocket-leaf","项目简介","Rocket-Leaf 是一款基于 Wails v3 构建的跨平台 RocketMQ 桌面管理客户端，Go 后端 + React 前端。本文档系列拆解它的架构与关键实现。",{"path":600,"title":601,"description":602},"\u002Fproject\u002Frocket-leaf\u002Fwails-v3","Wails v3 入门","Wails v3 的核心概念、Service 绑定机制，以及 Rocket-Leaf 是如何用它把 Go 后端和 React 前端打通的。",{"path":604,"title":605,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-basic","Docker - 入门基础",{"path":607,"title":608,"description":609},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-compose","Docker - Compose","在部署应用时，常常使用到不止一个容器，那么在部署容器的时候就需要一个一个进行部署，这样的部署过程也相对来说比较繁琐复杂，也容易出问题，那么有没有一种更为简单的方法呢？",{"path":611,"title":612,"description":613},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-container-connection","Docker - 容器互联","在上一个章节中我们学习了 Docker 容器的端口映射，可以将 Docker 容器和本地以及网络中的端口进行连接起来。",{"path":615,"title":616,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-dockerfile","Docker - Dockerfile",{"path":618,"title":619,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-helloworld","Docker - HelloWorld",{"path":621,"title":622,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-install","Docker - 安装",{"path":624,"title":625,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-introduce","Docker - 简介",{"path":627,"title":628,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-object","Docker - 镜像、容器、仓库",{"path":630,"title":631,"description":632},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-warehouse","Docker - 仓库管理","仓库是集中存放资源的地方，代码仓库是存放代码的，那么Docker 中的仓库就是存放 Docker 镜像的。",{"path":634,"title":635,"description":636},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-web-containers","Docker - WEB应用实例","在之前的章节中，仅对普通容器进行了演示，但在实际中常常使用到 Docker 容器中的 WEB 应用程序。",{"path":638,"title":639,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-config","Kubernetes - ConfigMap 与 Secret",{"path":641,"title":642,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-helm","Kubernetes - Helm 包管理",{"path":644,"title":645,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-install","Kubernetes - 集群安装",{"path":647,"title":648,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-introduction","Kubernetes - 简介与架构",{"path":650,"title":651,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-kubectl","Kubernetes - kubectl 命令行工具",{"path":653,"title":654,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-monitoring","Kubernetes - 监控与日志",{"path":656,"title":657,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-network-security","Kubernetes - 网络与安全",{"path":659,"title":660,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-service","Kubernetes - Service 与 Ingress",{"path":662,"title":663,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-storage","Kubernetes - 持久化存储",{"path":665,"title":666,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-workload","Kubernetes - 工作负载资源",{"path":668,"title":669,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-bash","Linux - Bash 基础语法",{"path":671,"title":672,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-file-directory","Linux - 文件与目录操作",{"path":674,"title":675,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-network","Linux - 网络配置",{"path":677,"title":678,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-package","Linux - 软件包管理",{"path":680,"title":681,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-process","Linux - 进程管理",{"path":683,"title":684,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-scripts","Linux - 常用脚本示例",{"path":686,"title":687,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-service","Linux - 服务管理",{"path":689,"title":690,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-user-permission","Linux - 用户与权限管理",{"path":692,"title":693,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-https","Nginx - HTTPS 配置",{"path":695,"title":696,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-install","Nginx - 安装与配置",{"path":698,"title":699,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-loadbalance","Nginx - 负载均衡",{"path":701,"title":702,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-optimization","Nginx - 性能优化",{"path":704,"title":705,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-proxy","Nginx - 反向代理",{"path":707,"title":708,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-static","Nginx - 静态资源服务",{"path":710,"title":711,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-vhost","Nginx - 虚拟主机配置",{"path":713,"title":714,"description":715},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-architecture","MySQL 高可用架构","主从复制、读写分离、分库分表。",{"path":717,"title":718,"description":719},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-index","MySQL 索引","索引是帮助 MySQL 高效获取数据的有序数据结构。",{"path":721,"title":722,"description":723},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-lock","MySQL 锁","锁用于解决并发访问时的数据一致性问题。",{"path":725,"title":726,"description":727},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-optimize","MySQL 性能优化","SQL 优化是后端开发必备技能。",{"path":729,"title":730,"description":731},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-transaction","MySQL 事务","事务是一组不可分割的操作，要么全部成功，要么全部失败。",{"path":733,"title":734,"description":735},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fsql-advanced","SQL 进阶","多表查询、子查询、函数、视图、存储过程。",{"path":737,"title":738,"description":739},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fsql-basic","SQL 基础","SQL（Structured Query Language）是操作关系型数据库的标准语言。",{"path":741,"title":742,"description":743},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-advanced","Redis 进阶功能","事务、发布订阅、Lua 脚本、Pipeline。",{"path":745,"title":746,"description":747},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-basic","Redis 基础","Redis 安装配置与基本命令。",{"path":749,"title":750,"description":751},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-cluster","Redis 高可用","主从复制、哨兵、Cluster 集群。",{"path":753,"title":754,"description":755},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-datatype","Redis 数据类型","Redis 5 种基本数据类型 + 4 种特殊类型。",{"path":757,"title":758,"description":759},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-optimize","Redis 性能优化","内存优化、缓存问题、最佳实践。",{"path":761,"title":762,"description":763},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-persistence","Redis 持久化","Redis 提供 RDB 和 AOF 两种持久化方式。",{"path":765,"title":766,"description":767},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-principle","Redis 底层原理","数据结构、线程模型、网络模型。",{"path":769,"title":770,"description":771},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fbehaiver-patterns\u002Fobserver-pattern","观察者模式","观察者模式属于行为型模式，定义了对象之间的一对多的依赖关系，在这种模式中，当一个对象的状态发生变化时，所有依赖于它的对象都会得到通知，并且执行相关操作。观察者模式又被成为“发布—订阅模式”，即发布者发生改变后，会通知所有订阅者。",{"path":773,"title":774,"description":11},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fcreate-patterns\u002Ffactory-pattern","工厂模式",{"path":776,"title":777,"description":778},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fcreate-patterns\u002Fsingleton-pattern","单例模式","单例模式是最常用的设计模式之一，他可以保证在整个应用中，某个类只存在一个实例化对象，即全局使用到该类的只有一个对象，这种模式在需要限制某些类的实例数量时非常有用，通常全局只需要一个该对象即可，如一些配置文件映射对象、数据库连接对象等。",{"path":780,"title":781,"description":782},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fstructural-patterns\u002Fadapter-pattern","适配器模式","适配器模式是一种结构型模式，可以将一个类的接口转换成客户端所期望的另一种接口，适配器模式可以帮助开发人员在不修改现有代码的情况下，将不兼容的类组合在一起。",{"path":784,"title":785,"description":786},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-basic-operations","Git 创建版本库","在 Git 上创建版本库有两种方式，一种是直接拷贝远程 Git 仓库到本地，另外一种是我们自己创建本地的版本库。",{"path":788,"title":789,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-branch-manage","Git 分支管理",{"path":791,"title":792,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-content-operations","Git 仓库内容操作",{"path":794,"title":795,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-introduce-install","Git 介绍和安装",{"path":797,"title":798,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-remote-manage","Git 远程管理",{"path":800,"title":801,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-workspace-index-repo","Git 工作原理",{"path":803,"title":804,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fhomebrew","HomeBrew 教程",{"path":806,"title":807,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fidea\u002Fshortcuts","快捷键",{"path":809,"title":810,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fmaven\u002Fintroduce-install-config","Maven - 介绍、安装、配置",{"path":812,"title":813,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fbasic-knowledge","2. 基础知识",{"path":815,"title":816,"description":817},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcomponent-communication","9. 组件通信","在前面的章节内，介绍了 Vue 中最核心的内容——组件的介绍和使用，和 Java 等编程语言相反，组件并不近似于这些变成语言中的类，类可以通过类或者其实例化的对象来相互交互，但 Vue 组件之间的作用域是相互独立的，这就意味着不同组件之间的数据无法相互引用。",{"path":819,"title":820,"description":821},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcomputed","4. 计算属性","虽然直接在模板中使用表达式方便，但是如果在模板中添加很多逻辑，会让模板变的臃肿且难维护，耦合度较高。有没有一种简单的方式来实现呢？答案是有的。",{"path":823,"title":824,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcreate-vue-project","1. 环境搭建及安装",{"path":826,"title":827,"description":828},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Flife-cycle","6. 生命周期","生命周期是指组件从创建、挂载、更新到销毁的整个过程中所经历的一系列阶段。在 Vue 中，每个组件都有自己的生命周期，可以通过生命周期钩子函数来监听和处理组件在不同阶段的行为和状态。",{"path":830,"title":831,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fother-api","10. 其他 API",{"path":833,"title":834,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fpinia","8. Pinia",{"path":836,"title":837,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Frouter","7. 路由",{"path":839,"title":840,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Ftemplate-grammar","3. 指令及模板语法",{"path":842,"title":843,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fvue3-new-component","11. Vue3 新组件",{"path":845,"title":846,"description":847},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fwatch","5. 监视","Watch 是 Vue 提供的一个用于监视响应式数据变化并执行相应操作的 API，能够对响应式数据的变化做出一些操作的功能。Vue3 中的 Watch 支持多种用法，包括监视响应式对象、ref 对象、数组、函数等。",{"path":849,"title":850,"description":11},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-introduction","Kafka 简介与安装",{"path":852,"title":853,"description":11},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-producer-consumer","Kafka 生产者与消费者",{"path":855,"title":856,"description":857},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-springboot","Spring Boot 整合 Kafka","Spring Kafka 提供了对 Apache Kafka 的便捷集成。",{"path":859,"title":860,"description":861},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-exchange","RabbitMQ Exchange 详解","Exchange（交换机）是 RabbitMQ 的核心组件，负责接收生产者发送的消息，并根据规则将消息路由到一个或多个队列。",{"path":863,"title":864,"description":11},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-introduction","RabbitMQ 简介与安装",{"path":866,"title":867,"description":868},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-reliability","RabbitMQ 消息可靠性","消息可靠性是消息队列的核心要求，RabbitMQ 提供了多种机制来保证消息不丢失。",{"path":870,"title":871,"description":872},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-springboot","Spring Boot 整合 RabbitMQ","Spring AMQP 提供了对 RabbitMQ 的便捷集成，大大简化了开发工作。",{"path":874,"title":875,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-client","RocketMQ 客户端使用",{"path":877,"title":878,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-concepts","RocketMQ 核心概念",{"path":880,"title":881,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-installation","RocketMQ 安装部署",{"path":883,"title":884,"description":885},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-message-type","RocketMQ 消息类型","RocketMQ 支持多种消息类型，满足不同业务场景需求。",{"id":887,"title":118,"body":888,"description":119,"extension":2665,"meta":2666,"navigation":1000,"path":117,"seo":2667,"stem":2668,"__hash__":2669},"docs\u002Fai\u002Frag\u002Fvector-database.md",{"type":889,"value":890,"toc":2624},"minimark",[891,895,908,911,922,926,930,933,940,943,946,949,952,955,958,962,969,1114,1118,1122,1125,1207,1211,1214,1289,1292,1361,1364,1589,1592,1595,1598,1601,1604,1607,1610,1613,1616,1619,1622,1625,1629,1633,1636,1639,1658,1661,2137,2140,2251,2254,2306,2309,2375,2378,2381,2385,2388,2393,2406,2411,2419,2425,2429,2432,2436,2447,2451,2459,2464,2467,2517,2520,2523,2526,2563,2566,2569,2572,2575,2578,2581,2584,2610,2614,2617,2620],[892,893,894],"h2",{"id":894},"什么是向量数据库",[896,897,898,899,903,904,907],"p",{},"向量数据库（Vector Database）是一种专门用于",[900,901,902],"strong",{},"存储、索引和查询高维向量数据","的数据库系统。与传统关系型数据库存储结构化数据不同，向量数据库以向量（即一组浮点数数组）作为核心数据类型，支持高效的",[900,905,906],{},"近似最近邻搜索（ANN, Approximate Nearest Neighbor）","。",[896,909,910],{},"在 RAG 系统中，文本经过嵌入模型转换为向量后，需要一个高效的存储和检索系统来管理这些向量——这正是向量数据库的核心作用。",[912,913,919],"pre",{"className":914,"code":916,"language":917,"meta":918},[915],"language-text","flowchart TD\n    Text[\"文本: Kubernetes 是一个容器编排平台\"]\n    Vec[\"向量: #91;0.023, -0.156, 0.892, ..., 0.034#93;\u003Cbr\u002F>#40;维度: 768 或 1536#41;\"]\n    DB[\"向量数据库: 索引 + 存储 + 高效检索\"]\n    Text -->|Embedding 模型| Vec\n    Vec -->|存储| DB\n","text","mermaid",[920,921,916],"code",{"__ignoreMap":11},[892,923,925],{"id":924},"为什么-rag-需要向量数据库","为什么 RAG 需要向量数据库",[927,928,929],"h3",{"id":929},"语义检索的需求",[896,931,932],{},"传统的关键词检索（如 Elasticsearch 的 BM25）基于词频匹配，无法理解语义相似性。例如，用户搜索\"如何部署容器应用\"，关键词检索可能无法匹配到包含\"Docker 镜像发布\"的文档，但这两者在语义上是高度相关的。",[896,934,935,936,939],{},"向量数据库通过在向量空间中计算距离，实现",[900,937,938],{},"语义级别","的相似度匹配，这是 RAG 系统检索质量的基础。",[927,941,942],{"id":942},"高效的大规模检索",[896,944,945],{},"在实际应用中，知识库可能包含数百万甚至数十亿条文档片段。向量数据库通过专门的索引结构，能够在毫秒级别完成大规模向量集合中的相似度搜索。",[927,947,948],{"id":948},"元数据过滤",[896,950,951],{},"除了向量检索，向量数据库还支持基于元数据（如文档来源、时间戳、类别标签等）的过滤，使检索结果更加精准。",[892,953,954],{"id":954},"相似度计算方法",[896,956,957],{},"向量之间的相似度计算是向量数据库的核心操作。常用的计算方法有以下三种：",[927,959,961],{"id":960},"余弦相似度cosine-similarity","余弦相似度（Cosine Similarity）",[896,963,964,965,968],{},"计算两个向量之间夹角的余弦值，取值范围为 ",[920,966,967],{},"[-1, 1]","，值越大表示越相似。余弦相似度只关注向量的方向，不受向量长度（模）的影响。",[912,970,974],{"className":971,"code":972,"language":973,"meta":11,"style":11},"language-python shiki shiki-themes github-light github-light github-dark","import numpy as np\n\ndef cosine_similarity(a, b):\n    return np.dot(a, b) \u002F (np.linalg.norm(a) * np.linalg.norm(b))\n\n# 示例\nvec_a = np.array([1.0, 2.0, 3.0])\nvec_b = np.array([2.0, 4.0, 6.0])\nprint(cosine_similarity(vec_a, vec_b))  # 输出: 1.0（方向完全相同）\n","python",[920,975,976,995,1002,1015,1036,1041,1048,1078,1102],{"__ignoreMap":11},[977,978,981,985,989,992],"span",{"class":979,"line":980},"line",1,[977,982,984],{"class":983},"s8jYJ","import",[977,986,988],{"class":987},"sxrX7"," numpy ",[977,990,991],{"class":983},"as",[977,993,994],{"class":987}," np\n",[977,996,998],{"class":979,"line":997},2,[977,999,1001],{"emptyLinePlaceholder":1000},true,"\n",[977,1003,1005,1008,1012],{"class":979,"line":1004},3,[977,1006,1007],{"class":983},"def",[977,1009,1011],{"class":1010},"snPdu"," cosine_similarity",[977,1013,1014],{"class":987},"(a, b):\n",[977,1016,1018,1021,1024,1027,1030,1033],{"class":979,"line":1017},4,[977,1019,1020],{"class":983},"    return",[977,1022,1023],{"class":987}," np.dot(a, b) ",[977,1025,1026],{"class":983},"\u002F",[977,1028,1029],{"class":987}," (np.linalg.norm(a) ",[977,1031,1032],{"class":983},"*",[977,1034,1035],{"class":987}," np.linalg.norm(b))\n",[977,1037,1039],{"class":979,"line":1038},5,[977,1040,1001],{"emptyLinePlaceholder":1000},[977,1042,1044],{"class":979,"line":1043},6,[977,1045,1047],{"class":1046},"sCsY4","# 示例\n",[977,1049,1051,1054,1057,1060,1064,1067,1070,1072,1075],{"class":979,"line":1050},7,[977,1052,1053],{"class":987},"vec_a ",[977,1055,1056],{"class":983},"=",[977,1058,1059],{"class":987}," np.array([",[977,1061,1063],{"class":1062},"sBjJW","1.0",[977,1065,1066],{"class":987},", ",[977,1068,1069],{"class":1062},"2.0",[977,1071,1066],{"class":987},[977,1073,1074],{"class":1062},"3.0",[977,1076,1077],{"class":987},"])\n",[977,1079,1081,1084,1086,1088,1090,1092,1095,1097,1100],{"class":979,"line":1080},8,[977,1082,1083],{"class":987},"vec_b ",[977,1085,1056],{"class":983},[977,1087,1059],{"class":987},[977,1089,1069],{"class":1062},[977,1091,1066],{"class":987},[977,1093,1094],{"class":1062},"4.0",[977,1096,1066],{"class":987},[977,1098,1099],{"class":1062},"6.0",[977,1101,1077],{"class":987},[977,1103,1105,1108,1111],{"class":979,"line":1104},9,[977,1106,1107],{"class":1062},"print",[977,1109,1110],{"class":987},"(cosine_similarity(vec_a, vec_b))  ",[977,1112,1113],{"class":1046},"# 输出: 1.0（方向完全相同）\n",[1115,1116,1117],"tip",{},"\n余弦相似度是 RAG 系统中最常用的相似度度量方式，因为嵌入模型生成的向量通常已经进行了归一化处理，使用余弦相似度能够很好地衡量语义相似性。\n",[927,1119,1121],{"id":1120},"欧氏距离euclidean-distance-l2","欧氏距离（Euclidean Distance \u002F L2）",[896,1123,1124],{},"计算两个向量在空间中的直线距离，值越小表示越相似。欧氏距离同时考虑了向量的方向和大小。",[912,1126,1128],{"className":971,"code":1127,"language":973,"meta":11,"style":11},"def euclidean_distance(a, b):\n    return np.linalg.norm(a - b)\n\nvec_a = np.array([1.0, 2.0, 3.0])\nvec_b = np.array([4.0, 5.0, 6.0])\nprint(euclidean_distance(vec_a, vec_b))  # 输出: 5.196\n",[920,1129,1130,1139,1152,1156,1176,1197],{"__ignoreMap":11},[977,1131,1132,1134,1137],{"class":979,"line":980},[977,1133,1007],{"class":983},[977,1135,1136],{"class":1010}," euclidean_distance",[977,1138,1014],{"class":987},[977,1140,1141,1143,1146,1149],{"class":979,"line":997},[977,1142,1020],{"class":983},[977,1144,1145],{"class":987}," np.linalg.norm(a ",[977,1147,1148],{"class":983},"-",[977,1150,1151],{"class":987}," b)\n",[977,1153,1154],{"class":979,"line":1004},[977,1155,1001],{"emptyLinePlaceholder":1000},[977,1157,1158,1160,1162,1164,1166,1168,1170,1172,1174],{"class":979,"line":1017},[977,1159,1053],{"class":987},[977,1161,1056],{"class":983},[977,1163,1059],{"class":987},[977,1165,1063],{"class":1062},[977,1167,1066],{"class":987},[977,1169,1069],{"class":1062},[977,1171,1066],{"class":987},[977,1173,1074],{"class":1062},[977,1175,1077],{"class":987},[977,1177,1178,1180,1182,1184,1186,1188,1191,1193,1195],{"class":979,"line":1038},[977,1179,1083],{"class":987},[977,1181,1056],{"class":983},[977,1183,1059],{"class":987},[977,1185,1094],{"class":1062},[977,1187,1066],{"class":987},[977,1189,1190],{"class":1062},"5.0",[977,1192,1066],{"class":987},[977,1194,1099],{"class":1062},[977,1196,1077],{"class":987},[977,1198,1199,1201,1204],{"class":979,"line":1043},[977,1200,1107],{"class":1062},[977,1202,1203],{"class":987},"(euclidean_distance(vec_a, vec_b))  ",[977,1205,1206],{"class":1046},"# 输出: 5.196\n",[927,1208,1210],{"id":1209},"点积dot-product-inner-product","点积（Dot Product \u002F Inner Product）",[896,1212,1213],{},"计算两个向量的内积，值越大表示越相似。当向量已归一化时，点积等价于余弦相似度。",[912,1215,1217],{"className":971,"code":1216,"language":973,"meta":11,"style":11},"def dot_product(a, b):\n    return np.dot(a, b)\n\nvec_a = np.array([1.0, 2.0, 3.0])\nvec_b = np.array([2.0, 4.0, 6.0])\nprint(dot_product(vec_a, vec_b))  # 输出: 28.0\n",[920,1218,1219,1228,1235,1239,1259,1279],{"__ignoreMap":11},[977,1220,1221,1223,1226],{"class":979,"line":980},[977,1222,1007],{"class":983},[977,1224,1225],{"class":1010}," dot_product",[977,1227,1014],{"class":987},[977,1229,1230,1232],{"class":979,"line":997},[977,1231,1020],{"class":983},[977,1233,1234],{"class":987}," np.dot(a, b)\n",[977,1236,1237],{"class":979,"line":1004},[977,1238,1001],{"emptyLinePlaceholder":1000},[977,1240,1241,1243,1245,1247,1249,1251,1253,1255,1257],{"class":979,"line":1017},[977,1242,1053],{"class":987},[977,1244,1056],{"class":983},[977,1246,1059],{"class":987},[977,1248,1063],{"class":1062},[977,1250,1066],{"class":987},[977,1252,1069],{"class":1062},[977,1254,1066],{"class":987},[977,1256,1074],{"class":1062},[977,1258,1077],{"class":987},[977,1260,1261,1263,1265,1267,1269,1271,1273,1275,1277],{"class":979,"line":1038},[977,1262,1083],{"class":987},[977,1264,1056],{"class":983},[977,1266,1059],{"class":987},[977,1268,1069],{"class":1062},[977,1270,1066],{"class":987},[977,1272,1094],{"class":1062},[977,1274,1066],{"class":987},[977,1276,1099],{"class":1062},[977,1278,1077],{"class":987},[977,1280,1281,1283,1286],{"class":979,"line":1043},[977,1282,1107],{"class":1062},[977,1284,1285],{"class":987},"(dot_product(vec_a, vec_b))  ",[977,1287,1288],{"class":1046},"# 输出: 28.0\n",[927,1290,1291],{"id":1291},"三种方法对比",[1293,1294,1295,1314],"table",{},[1296,1297,1298],"thead",{},[1299,1300,1301,1305,1308,1311],"tr",{},[1302,1303,1304],"th",{},"度量方法",[1302,1306,1307],{},"取值范围",[1302,1309,1310],{},"相似度判断",[1302,1312,1313],{},"适用场景",[1315,1316,1317,1334,1348],"tbody",{},[1299,1318,1319,1323,1328,1331],{},[1320,1321,1322],"td",{},"余弦相似度",[1320,1324,1325],{},[977,1326,1327],{},"-1, 1",[1320,1329,1330],{},"值越大越相似",[1320,1332,1333],{},"归一化向量、文本语义匹配",[1299,1335,1336,1339,1342,1345],{},[1320,1337,1338],{},"欧氏距离",[1320,1340,1341],{},"[0, +∞)",[1320,1343,1344],{},"值越小越相似",[1320,1346,1347],{},"图像特征、地理位置数据",[1299,1349,1350,1353,1356,1358],{},[1320,1351,1352],{},"点积",[1320,1354,1355],{},"(-∞, +∞)",[1320,1357,1330],{},[1320,1359,1360],{},"归一化向量、推荐系统",[892,1362,1363],{"id":1363},"主流向量数据库对比",[1293,1365,1366,1391],{},[1296,1367,1368],{},[1299,1369,1370,1373,1376,1379,1382,1385,1388],{},[1302,1371,1372],{},"特性",[1302,1374,1375],{},"Milvus",[1302,1377,1378],{},"Pinecone",[1302,1380,1381],{},"Chroma",[1302,1383,1384],{},"Weaviate",[1302,1386,1387],{},"Qdrant",[1302,1389,1390],{},"FAISS",[1315,1392,1393,1415,1439,1462,1484,1505,1525,1543,1565],{},[1299,1394,1395,1400,1403,1406,1408,1410,1412],{},[1320,1396,1397],{},[900,1398,1399],{},"类型",[1320,1401,1402],{},"开源",[1320,1404,1405],{},"云服务",[1320,1407,1402],{},[1320,1409,1402],{},[1320,1411,1402],{},[1320,1413,1414],{},"开源库",[1299,1416,1417,1422,1425,1427,1430,1433,1436],{},[1320,1418,1419],{},[900,1420,1421],{},"开发语言",[1320,1423,1424],{},"Go\u002FC++",[1320,1426,1148],{},[1320,1428,1429],{},"Python",[1320,1431,1432],{},"Go",[1320,1434,1435],{},"Rust",[1320,1437,1438],{},"C++",[1299,1440,1441,1446,1449,1452,1455,1457,1459],{},[1320,1442,1443],{},[900,1444,1445],{},"部署方式",[1320,1447,1448],{},"自托管\u002F云",[1320,1450,1451],{},"仅云端",[1320,1453,1454],{},"嵌入式\u002F服务端",[1320,1456,1448],{},[1320,1458,1448],{},[1320,1460,1461],{},"嵌入式",[1299,1463,1464,1469,1472,1475,1478,1480,1482],{},[1320,1465,1466],{},[900,1467,1468],{},"分布式支持",[1320,1470,1471],{},"支持",[1320,1473,1474],{},"内置",[1320,1476,1477],{},"不支持",[1320,1479,1471],{},[1320,1481,1471],{},[1320,1483,1477],{},[1299,1485,1486,1491,1494,1496,1499,1501,1503],{},[1320,1487,1488],{},[900,1489,1490],{},"最大数据规模",[1320,1492,1493],{},"十亿级",[1320,1495,1493],{},[1320,1497,1498],{},"百万级",[1320,1500,1493],{},[1320,1502,1493],{},[1320,1504,1493],{},[1299,1506,1507,1512,1514,1516,1519,1521,1523],{},[1320,1508,1509],{},[900,1510,1511],{},"混合检索",[1320,1513,1471],{},[1320,1515,1471],{},[1320,1517,1518],{},"有限",[1320,1520,1471],{},[1320,1522,1471],{},[1320,1524,1477],{},[1299,1526,1527,1531,1533,1535,1537,1539,1541],{},[1320,1528,1529],{},[900,1530,948],{},[1320,1532,1471],{},[1320,1534,1471],{},[1320,1536,1471],{},[1320,1538,1471],{},[1320,1540,1471],{},[1320,1542,1518],{},[1299,1544,1545,1550,1553,1556,1558,1560,1562],{},[1320,1546,1547],{},[900,1548,1549],{},"学习曲线",[1320,1551,1552],{},"中等",[1320,1554,1555],{},"低",[1320,1557,1555],{},[1320,1559,1552],{},[1320,1561,1552],{},[1320,1563,1564],{},"高",[1299,1566,1567,1571,1574,1577,1580,1583,1586],{},[1320,1568,1569],{},[900,1570,1313],{},[1320,1572,1573],{},"大规模生产",[1320,1575,1576],{},"快速上线",[1320,1578,1579],{},"原型开发",[1320,1581,1582],{},"语义搜索",[1320,1584,1585],{},"高性能检索",[1320,1587,1588],{},"研究\u002F嵌入",[927,1590,1375],{"id":1591},"milvus",[896,1593,1594],{},"Milvus 是由 Zilliz 公司开源的向量数据库，采用存算分离架构，支持十亿级向量的高效检索。它是目前功能最完善的开源向量数据库之一，适合大规模生产环境。",[927,1596,1378],{"id":1597},"pinecone",[896,1599,1600],{},"Pinecone 是一个全托管的云向量数据库服务，无需运维，开箱即用。适合不想自建基础设施、希望快速上线的团队。",[927,1602,1381],{"id":1603},"chroma",[896,1605,1606],{},"Chroma 是一个轻量级的开源向量数据库，支持嵌入式部署（直接在 Python 进程中运行），非常适合原型开发和小规模应用。",[927,1608,1384],{"id":1609},"weaviate",[896,1611,1612],{},"Weaviate 是一个支持多模态数据的开源向量数据库，内置了文本和图像的向量化模块，支持 GraphQL 查询接口。",[927,1614,1387],{"id":1615},"qdrant",[896,1617,1618],{},"Qdrant 使用 Rust 编写，以高性能和低资源消耗著称。支持丰富的过滤条件和负载（payload）管理。",[927,1620,1390],{"id":1621},"faiss",[896,1623,1624],{},"FAISS（Facebook AI Similarity Search）是 Meta 开源的向量相似度搜索库。严格来说它不是一个完整的数据库，而是一个高性能的索引和搜索库，常被其他系统集成使用。",[1626,1627,1628],"note",{},"\n对于学习和原型开发，推荐从 **Chroma** 入手，它的 API 简洁，部署方便，零配置即可运行。当项目进入生产阶段并需要处理大规模数据时，可以考虑迁移到 Milvus 或 Qdrant。\n",[892,1630,1632],{"id":1631},"chroma-快速入门","Chroma 快速入门",[896,1634,1635],{},"以下示例展示如何使用 Chroma 构建一个简单的向量检索系统。",[927,1637,1638],{"id":1638},"安装",[912,1640,1644],{"className":1641,"code":1642,"language":1643,"meta":11,"style":11},"language-bash shiki shiki-themes github-light github-light github-dark","pip install chromadb\n","bash",[920,1645,1646],{"__ignoreMap":11},[977,1647,1648,1651,1655],{"class":979,"line":980},[977,1649,1650],{"class":1010},"pip",[977,1652,1654],{"class":1653},"sIIMD"," install",[977,1656,1657],{"class":1653}," chromadb\n",[927,1659,1660],{"id":1660},"基本使用",[912,1662,1664],{"className":971,"code":1663,"language":973,"meta":11,"style":11},"import chromadb\n\n# 创建 Chroma 客户端（内存模式）\nclient = chromadb.Client()\n\n# 创建一个集合（Collection），类似于数据库中的表\ncollection = client.create_collection(\n    name=\"my_knowledge_base\",\n    metadata={\"hnsw:space\": \"cosine\"}  # 使用余弦相似度\n)\n\n# 添加文档（Chroma 内置了默认的嵌入模型）\ncollection.add(\n    documents=[\n        \"Docker 是一个开源的容器化平台，用于构建、发布和运行应用\",\n        \"Kubernetes 是一个容器编排系统，用于自动化部署和管理容器化应用\",\n        \"Nginx 是一个高性能的 HTTP 服务器和反向代理服务器\",\n        \"Redis 是一个开源的内存数据结构存储系统，可用作数据库和缓存\",\n        \"MySQL 是最流行的开源关系型数据库管理系统\",\n    ],\n    ids=[\"doc1\", \"doc2\", \"doc3\", \"doc4\", \"doc5\"],\n    metadatas=[\n        {\"category\": \"container\"},\n        {\"category\": \"container\"},\n        {\"category\": \"web\"},\n        {\"category\": \"database\"},\n        {\"category\": \"database\"},\n    ]\n)\n\n# 查询相似文档\nresults = collection.query(\n    query_texts=[\"如何部署容器应用？\"],\n    n_results=3  # 返回最相似的 3 条\n)\n\nprint(\"查询结果：\")\nfor i, doc in enumerate(results[\"documents\"][0]):\n    distance = results[\"distances\"][0][i]\n    print(f\"  [{i+1}] (距离: {distance:.4f}) {doc}\")\n",[920,1665,1666,1672,1676,1681,1691,1695,1700,1710,1724,1749,1755,1760,1766,1772,1783,1791,1799,1807,1815,1823,1829,1866,1876,1893,1906,1920,1934,1947,1953,1958,1963,1969,1980,1995,2009,2014,2019,2032,2062,2083],{"__ignoreMap":11},[977,1667,1668,1670],{"class":979,"line":980},[977,1669,984],{"class":983},[977,1671,1657],{"class":987},[977,1673,1674],{"class":979,"line":997},[977,1675,1001],{"emptyLinePlaceholder":1000},[977,1677,1678],{"class":979,"line":1004},[977,1679,1680],{"class":1046},"# 创建 Chroma 客户端（内存模式）\n",[977,1682,1683,1686,1688],{"class":979,"line":1017},[977,1684,1685],{"class":987},"client ",[977,1687,1056],{"class":983},[977,1689,1690],{"class":987}," chromadb.Client()\n",[977,1692,1693],{"class":979,"line":1038},[977,1694,1001],{"emptyLinePlaceholder":1000},[977,1696,1697],{"class":979,"line":1043},[977,1698,1699],{"class":1046},"# 创建一个集合（Collection），类似于数据库中的表\n",[977,1701,1702,1705,1707],{"class":979,"line":1050},[977,1703,1704],{"class":987},"collection ",[977,1706,1056],{"class":983},[977,1708,1709],{"class":987}," client.create_collection(\n",[977,1711,1712,1716,1718,1721],{"class":979,"line":1080},[977,1713,1715],{"class":1714},"sP4rz","    name",[977,1717,1056],{"class":983},[977,1719,1720],{"class":1653},"\"my_knowledge_base\"",[977,1722,1723],{"class":987},",\n",[977,1725,1726,1729,1731,1734,1737,1740,1743,1746],{"class":979,"line":1104},[977,1727,1728],{"class":1714},"    metadata",[977,1730,1056],{"class":983},[977,1732,1733],{"class":987},"{",[977,1735,1736],{"class":1653},"\"hnsw:space\"",[977,1738,1739],{"class":987},": ",[977,1741,1742],{"class":1653},"\"cosine\"",[977,1744,1745],{"class":987},"}  ",[977,1747,1748],{"class":1046},"# 使用余弦相似度\n",[977,1750,1752],{"class":979,"line":1751},10,[977,1753,1754],{"class":987},")\n",[977,1756,1758],{"class":979,"line":1757},11,[977,1759,1001],{"emptyLinePlaceholder":1000},[977,1761,1763],{"class":979,"line":1762},12,[977,1764,1765],{"class":1046},"# 添加文档（Chroma 内置了默认的嵌入模型）\n",[977,1767,1769],{"class":979,"line":1768},13,[977,1770,1771],{"class":987},"collection.add(\n",[977,1773,1775,1778,1780],{"class":979,"line":1774},14,[977,1776,1777],{"class":1714},"    documents",[977,1779,1056],{"class":983},[977,1781,1782],{"class":987},"[\n",[977,1784,1786,1789],{"class":979,"line":1785},15,[977,1787,1788],{"class":1653},"        \"Docker 是一个开源的容器化平台，用于构建、发布和运行应用\"",[977,1790,1723],{"class":987},[977,1792,1794,1797],{"class":979,"line":1793},16,[977,1795,1796],{"class":1653},"        \"Kubernetes 是一个容器编排系统，用于自动化部署和管理容器化应用\"",[977,1798,1723],{"class":987},[977,1800,1802,1805],{"class":979,"line":1801},17,[977,1803,1804],{"class":1653},"        \"Nginx 是一个高性能的 HTTP 服务器和反向代理服务器\"",[977,1806,1723],{"class":987},[977,1808,1810,1813],{"class":979,"line":1809},18,[977,1811,1812],{"class":1653},"        \"Redis 是一个开源的内存数据结构存储系统，可用作数据库和缓存\"",[977,1814,1723],{"class":987},[977,1816,1818,1821],{"class":979,"line":1817},19,[977,1819,1820],{"class":1653},"        \"MySQL 是最流行的开源关系型数据库管理系统\"",[977,1822,1723],{"class":987},[977,1824,1826],{"class":979,"line":1825},20,[977,1827,1828],{"class":987},"    ],\n",[977,1830,1832,1835,1837,1840,1843,1845,1848,1850,1853,1855,1858,1860,1863],{"class":979,"line":1831},21,[977,1833,1834],{"class":1714},"    ids",[977,1836,1056],{"class":983},[977,1838,1839],{"class":987},"[",[977,1841,1842],{"class":1653},"\"doc1\"",[977,1844,1066],{"class":987},[977,1846,1847],{"class":1653},"\"doc2\"",[977,1849,1066],{"class":987},[977,1851,1852],{"class":1653},"\"doc3\"",[977,1854,1066],{"class":987},[977,1856,1857],{"class":1653},"\"doc4\"",[977,1859,1066],{"class":987},[977,1861,1862],{"class":1653},"\"doc5\"",[977,1864,1865],{"class":987},"],\n",[977,1867,1869,1872,1874],{"class":979,"line":1868},22,[977,1870,1871],{"class":1714},"    metadatas",[977,1873,1056],{"class":983},[977,1875,1782],{"class":987},[977,1877,1879,1882,1885,1887,1890],{"class":979,"line":1878},23,[977,1880,1881],{"class":987},"        {",[977,1883,1884],{"class":1653},"\"category\"",[977,1886,1739],{"class":987},[977,1888,1889],{"class":1653},"\"container\"",[977,1891,1892],{"class":987},"},\n",[977,1894,1896,1898,1900,1902,1904],{"class":979,"line":1895},24,[977,1897,1881],{"class":987},[977,1899,1884],{"class":1653},[977,1901,1739],{"class":987},[977,1903,1889],{"class":1653},[977,1905,1892],{"class":987},[977,1907,1909,1911,1913,1915,1918],{"class":979,"line":1908},25,[977,1910,1881],{"class":987},[977,1912,1884],{"class":1653},[977,1914,1739],{"class":987},[977,1916,1917],{"class":1653},"\"web\"",[977,1919,1892],{"class":987},[977,1921,1923,1925,1927,1929,1932],{"class":979,"line":1922},26,[977,1924,1881],{"class":987},[977,1926,1884],{"class":1653},[977,1928,1739],{"class":987},[977,1930,1931],{"class":1653},"\"database\"",[977,1933,1892],{"class":987},[977,1935,1937,1939,1941,1943,1945],{"class":979,"line":1936},27,[977,1938,1881],{"class":987},[977,1940,1884],{"class":1653},[977,1942,1739],{"class":987},[977,1944,1931],{"class":1653},[977,1946,1892],{"class":987},[977,1948,1950],{"class":979,"line":1949},28,[977,1951,1952],{"class":987},"    ]\n",[977,1954,1956],{"class":979,"line":1955},29,[977,1957,1754],{"class":987},[977,1959,1961],{"class":979,"line":1960},30,[977,1962,1001],{"emptyLinePlaceholder":1000},[977,1964,1966],{"class":979,"line":1965},31,[977,1967,1968],{"class":1046},"# 查询相似文档\n",[977,1970,1972,1975,1977],{"class":979,"line":1971},32,[977,1973,1974],{"class":987},"results ",[977,1976,1056],{"class":983},[977,1978,1979],{"class":987}," collection.query(\n",[977,1981,1983,1986,1988,1990,1993],{"class":979,"line":1982},33,[977,1984,1985],{"class":1714},"    query_texts",[977,1987,1056],{"class":983},[977,1989,1839],{"class":987},[977,1991,1992],{"class":1653},"\"如何部署容器应用？\"",[977,1994,1865],{"class":987},[977,1996,1998,2001,2003,2006],{"class":979,"line":1997},34,[977,1999,2000],{"class":1714},"    n_results",[977,2002,1056],{"class":983},[977,2004,2005],{"class":1062},"3",[977,2007,2008],{"class":1046},"  # 返回最相似的 3 条\n",[977,2010,2012],{"class":979,"line":2011},35,[977,2013,1754],{"class":987},[977,2015,2017],{"class":979,"line":2016},36,[977,2018,1001],{"emptyLinePlaceholder":1000},[977,2020,2022,2024,2027,2030],{"class":979,"line":2021},37,[977,2023,1107],{"class":1062},[977,2025,2026],{"class":987},"(",[977,2028,2029],{"class":1653},"\"查询结果：\"",[977,2031,1754],{"class":987},[977,2033,2035,2038,2041,2044,2047,2050,2053,2056,2059],{"class":979,"line":2034},38,[977,2036,2037],{"class":983},"for",[977,2039,2040],{"class":987}," i, doc ",[977,2042,2043],{"class":983},"in",[977,2045,2046],{"class":1062}," enumerate",[977,2048,2049],{"class":987},"(results[",[977,2051,2052],{"class":1653},"\"documents\"",[977,2054,2055],{"class":987},"][",[977,2057,2058],{"class":1062},"0",[977,2060,2061],{"class":987},"]):\n",[977,2063,2065,2068,2070,2073,2076,2078,2080],{"class":979,"line":2064},39,[977,2066,2067],{"class":987},"    distance ",[977,2069,1056],{"class":983},[977,2071,2072],{"class":987}," results[",[977,2074,2075],{"class":1653},"\"distances\"",[977,2077,2055],{"class":987},[977,2079,2058],{"class":1062},[977,2081,2082],{"class":987},"][i]\n",[977,2084,2086,2089,2091,2094,2097,2099,2102,2105,2108,2111,2113,2116,2119,2122,2125,2127,2130,2132,2135],{"class":979,"line":2085},40,[977,2087,2088],{"class":1062},"    print",[977,2090,2026],{"class":987},[977,2092,2093],{"class":983},"f",[977,2095,2096],{"class":1653},"\"  [",[977,2098,1733],{"class":1062},[977,2100,2101],{"class":987},"i",[977,2103,2104],{"class":983},"+",[977,2106,2107],{"class":1062},"1}",[977,2109,2110],{"class":1653},"] (距离: ",[977,2112,1733],{"class":1062},[977,2114,2115],{"class":987},"distance",[977,2117,2118],{"class":983},":.4f",[977,2120,2121],{"class":1062},"}",[977,2123,2124],{"class":1653},") ",[977,2126,1733],{"class":1062},[977,2128,2129],{"class":987},"doc",[977,2131,2121],{"class":1062},[977,2133,2134],{"class":1653},"\"",[977,2136,1754],{"class":987},[927,2138,2139],{"id":2139},"使用自定义嵌入模型",[912,2141,2143],{"className":971,"code":2142,"language":973,"meta":11,"style":11},"import chromadb\nfrom chromadb.utils import embedding_functions\n\n# 使用 OpenAI 嵌入模型\nopenai_ef = embedding_functions.OpenAIEmbeddingFunction(\n    api_key=\"your-api-key\",\n    model_name=\"text-embedding-3-small\"\n)\n\n# 创建集合时指定嵌入函数\ncollection = client.create_collection(\n    name=\"openai_collection\",\n    embedding_function=openai_ef\n)\n",[920,2144,2145,2151,2164,2168,2173,2183,2195,2205,2209,2213,2218,2226,2237,2247],{"__ignoreMap":11},[977,2146,2147,2149],{"class":979,"line":980},[977,2148,984],{"class":983},[977,2150,1657],{"class":987},[977,2152,2153,2156,2159,2161],{"class":979,"line":997},[977,2154,2155],{"class":983},"from",[977,2157,2158],{"class":987}," chromadb.utils ",[977,2160,984],{"class":983},[977,2162,2163],{"class":987}," embedding_functions\n",[977,2165,2166],{"class":979,"line":1004},[977,2167,1001],{"emptyLinePlaceholder":1000},[977,2169,2170],{"class":979,"line":1017},[977,2171,2172],{"class":1046},"# 使用 OpenAI 嵌入模型\n",[977,2174,2175,2178,2180],{"class":979,"line":1038},[977,2176,2177],{"class":987},"openai_ef ",[977,2179,1056],{"class":983},[977,2181,2182],{"class":987}," embedding_functions.OpenAIEmbeddingFunction(\n",[977,2184,2185,2188,2190,2193],{"class":979,"line":1043},[977,2186,2187],{"class":1714},"    api_key",[977,2189,1056],{"class":983},[977,2191,2192],{"class":1653},"\"your-api-key\"",[977,2194,1723],{"class":987},[977,2196,2197,2200,2202],{"class":979,"line":1050},[977,2198,2199],{"class":1714},"    model_name",[977,2201,1056],{"class":983},[977,2203,2204],{"class":1653},"\"text-embedding-3-small\"\n",[977,2206,2207],{"class":979,"line":1080},[977,2208,1754],{"class":987},[977,2210,2211],{"class":979,"line":1104},[977,2212,1001],{"emptyLinePlaceholder":1000},[977,2214,2215],{"class":979,"line":1751},[977,2216,2217],{"class":1046},"# 创建集合时指定嵌入函数\n",[977,2219,2220,2222,2224],{"class":979,"line":1757},[977,2221,1704],{"class":987},[977,2223,1056],{"class":983},[977,2225,1709],{"class":987},[977,2227,2228,2230,2232,2235],{"class":979,"line":1762},[977,2229,1715],{"class":1714},[977,2231,1056],{"class":983},[977,2233,2234],{"class":1653},"\"openai_collection\"",[977,2236,1723],{"class":987},[977,2238,2239,2242,2244],{"class":979,"line":1768},[977,2240,2241],{"class":1714},"    embedding_function",[977,2243,1056],{"class":983},[977,2245,2246],{"class":987},"openai_ef\n",[977,2248,2249],{"class":979,"line":1774},[977,2250,1754],{"class":987},[927,2252,2253],{"id":2253},"持久化存储",[912,2255,2257],{"className":971,"code":2256,"language":973,"meta":11,"style":11},"# 使用持久化客户端，数据保存到磁盘\nclient = chromadb.PersistentClient(path=\".\u002Fchroma_db\")\n\n# 之后的操作与内存模式相同\ncollection = client.get_or_create_collection(\"my_collection\")\n",[920,2258,2259,2264,2283,2287,2292],{"__ignoreMap":11},[977,2260,2261],{"class":979,"line":980},[977,2262,2263],{"class":1046},"# 使用持久化客户端，数据保存到磁盘\n",[977,2265,2266,2268,2270,2273,2276,2278,2281],{"class":979,"line":997},[977,2267,1685],{"class":987},[977,2269,1056],{"class":983},[977,2271,2272],{"class":987}," chromadb.PersistentClient(",[977,2274,2275],{"class":1714},"path",[977,2277,1056],{"class":983},[977,2279,2280],{"class":1653},"\".\u002Fchroma_db\"",[977,2282,1754],{"class":987},[977,2284,2285],{"class":979,"line":1004},[977,2286,1001],{"emptyLinePlaceholder":1000},[977,2288,2289],{"class":979,"line":1017},[977,2290,2291],{"class":1046},"# 之后的操作与内存模式相同\n",[977,2293,2294,2296,2298,2301,2304],{"class":979,"line":1038},[977,2295,1704],{"class":987},[977,2297,1056],{"class":983},[977,2299,2300],{"class":987}," client.get_or_create_collection(",[977,2302,2303],{"class":1653},"\"my_collection\"",[977,2305,1754],{"class":987},[927,2307,2308],{"id":2308},"带元数据过滤的查询",[912,2310,2312],{"className":971,"code":2311,"language":973,"meta":11,"style":11},"# 只在 category 为 \"database\" 的文档中检索\nresults = collection.query(\n    query_texts=[\"高性能缓存方案\"],\n    n_results=2,\n    where={\"category\": \"database\"}  # 元数据过滤\n)\n",[920,2313,2314,2319,2327,2340,2351,2371],{"__ignoreMap":11},[977,2315,2316],{"class":979,"line":980},[977,2317,2318],{"class":1046},"# 只在 category 为 \"database\" 的文档中检索\n",[977,2320,2321,2323,2325],{"class":979,"line":997},[977,2322,1974],{"class":987},[977,2324,1056],{"class":983},[977,2326,1979],{"class":987},[977,2328,2329,2331,2333,2335,2338],{"class":979,"line":1004},[977,2330,1985],{"class":1714},[977,2332,1056],{"class":983},[977,2334,1839],{"class":987},[977,2336,2337],{"class":1653},"\"高性能缓存方案\"",[977,2339,1865],{"class":987},[977,2341,2342,2344,2346,2349],{"class":979,"line":1017},[977,2343,2000],{"class":1714},[977,2345,1056],{"class":983},[977,2347,2348],{"class":1062},"2",[977,2350,1723],{"class":987},[977,2352,2353,2356,2358,2360,2362,2364,2366,2368],{"class":979,"line":1038},[977,2354,2355],{"class":1714},"    where",[977,2357,1056],{"class":983},[977,2359,1733],{"class":987},[977,2361,1884],{"class":1653},[977,2363,1739],{"class":987},[977,2365,1931],{"class":1653},[977,2367,1745],{"class":987},[977,2369,2370],{"class":1046},"# 元数据过滤\n",[977,2372,2373],{"class":979,"line":1043},[977,2374,1754],{"class":987},[892,2376,2377],{"id":2377},"索引策略",[896,2379,2380],{},"向量数据库的检索性能很大程度上取决于底层的索引算法。以下是两种最常用的索引策略：",[927,2382,2384],{"id":2383},"hnswhierarchical-navigable-small-world","HNSW（Hierarchical Navigable Small World）",[896,2386,2387],{},"HNSW 是目前最流行的 ANN 索引算法，基于分层的小世界图结构。它通过在多层图中进行贪心搜索来快速找到近似最近邻。",[896,2389,2390],{},[900,2391,2392],{},"优点：",[2394,2395,2396,2400,2403],"ul",{},[2397,2398,2399],"li",{},"查询速度快，召回率高",[2397,2401,2402],{},"支持增量插入，无需重建索引",[2397,2404,2405],{},"内存中运行，延迟极低",[896,2407,2408],{},[900,2409,2410],{},"缺点：",[2394,2412,2413,2416],{},[2397,2414,2415],{},"内存占用较大（需要存储图结构）",[2397,2417,2418],{},"构建索引速度较慢",[896,2420,2421,2424],{},[900,2422,2423],{},"适用场景："," 数据规模在百万到千万级，对查询延迟要求高的场景。Chroma、Qdrant 等默认使用 HNSW 索引。",[927,2426,2428],{"id":2427},"ivfinverted-file-index","IVF（Inverted File Index）",[896,2430,2431],{},"IVF 先将向量空间划分为多个聚类（通过 K-Means），查询时只在最相近的几个聚类中搜索，从而减少比较次数。",[896,2433,2434],{},[900,2435,2392],{},[2394,2437,2438,2441,2444],{},[2397,2439,2440],{},"内存占用相对较小",[2397,2442,2443],{},"适合超大规模数据集",[2397,2445,2446],{},"可与量化（PQ）结合进一步压缩",[896,2448,2449],{},[900,2450,2410],{},[2394,2452,2453,2456],{},[2397,2454,2455],{},"需要预先训练聚类中心",[2397,2457,2458],{},"不支持增量更新，新增数据需要重建索引",[896,2460,2461,2463],{},[900,2462,2423],{}," 数据规模在十亿级以上，可以接受略低召回率的场景。FAISS 中大量使用 IVF 系列索引。",[927,2465,2466],{"id":2466},"索引选择建议",[1293,2468,2469,2482],{},[1296,2470,2471],{},[1299,2472,2473,2476,2479],{},[1302,2474,2475],{},"数据规模",[1302,2477,2478],{},"推荐索引",[1302,2480,2481],{},"说明",[1315,2483,2484,2495,2506],{},[1299,2485,2486,2489,2492],{},[1320,2487,2488],{},"\u003C 10 万",[1320,2490,2491],{},"Flat（暴力搜索）",[1320,2493,2494],{},"数据量小，暴力搜索即可满足需求",[1299,2496,2497,2500,2503],{},[1320,2498,2499],{},"10 万 ~ 1000 万",[1320,2501,2502],{},"HNSW",[1320,2504,2505],{},"平衡查询速度和召回率",[1299,2507,2508,2511,2514],{},[1320,2509,2510],{},"> 1000 万",[1320,2512,2513],{},"IVF + PQ",[1320,2515,2516],{},"大规模数据需要压缩和分区",[892,2518,2519],{"id":2519},"实践建议",[927,2521,2522],{"id":2522},"向量维度选择",[896,2524,2525],{},"向量维度直接影响存储空间和检索性能。常见的维度选择：",[2394,2527,2528,2538,2544,2554],{},[2397,2529,2530,2533,2534,2537],{},[900,2531,2532],{},"384 维","：轻量级模型（如 ",[920,2535,2536],{},"all-MiniLM-L6-v2","），适合资源受限场景",[2397,2539,2540,2543],{},[900,2541,2542],{},"768 维","：中等规模模型（如 BGE-base），性能与效率的平衡点",[2397,2545,2546,2549,2550,2553],{},[900,2547,2548],{},"1536 维","：OpenAI ",[920,2551,2552],{},"text-embedding-3-small","，高质量通用嵌入",[2397,2555,2556,2549,2559,2562],{},[900,2557,2558],{},"3072 维",[920,2560,2561],{},"text-embedding-3-large","，最高质量但资源消耗大",[1115,2564,2565],{},"\nOpenAI 的 `text-embedding-3` 系列模型支持通过 `dimensions` 参数动态降维，可以在不更换模型的前提下灵活调整维度。\n",[927,2567,2568],{"id":2568},"批量操作",[896,2570,2571],{},"向量数据库的写入和查询通常支持批量操作，批量处理比逐条处理的效率高出数倍。建议每批处理 100~1000 条数据。",[927,2573,2574],{"id":2574},"数据备份与恢复",[896,2576,2577],{},"生产环境中必须定期备份向量数据库。大多数向量数据库支持快照（Snapshot）功能，建议设置自动定时备份。",[927,2579,2580],{"id":2580},"监控指标",[896,2582,2583],{},"部署向量数据库后，需要关注以下关键指标：",[2394,2585,2586,2592,2598,2604],{},[2397,2587,2588,2591],{},[900,2589,2590],{},"查询延迟（P95\u002FP99）","：端到端的查询响应时间",[2397,2593,2594,2597],{},[900,2595,2596],{},"召回率（Recall）","：检索结果与真实最近邻的重合程度",[2397,2599,2600,2603],{},[900,2601,2602],{},"内存使用","：索引和数据的内存占用",[2397,2605,2606,2609],{},[900,2607,2608],{},"QPS","：每秒查询数，衡量系统吞吐能力",[2611,2612,2613],"warning",{},"\n向量数据库的内存使用量与数据规模和向量维度成正比。在规划服务器资源时，请确保预留充足的内存空间。一个粗略的估算公式：内存 ≈ 向量数量 × 维度 × 4 字节（float32）× 索引膨胀系数（HNSW 约 1.5x）。\n",[892,2615,2616],{"id":2616},"小结",[896,2618,2619],{},"向量数据库是 RAG 系统的核心基础设施，负责高效地存储和检索文本嵌入向量。选择合适的向量数据库需要综合考虑数据规模、部署方式、性能需求和团队能力等因素。对于初学者和原型开发，Chroma 是最佳入门选择；对于生产环境的大规模应用，Milvus 和 Qdrant 是更成熟的方案。",[2621,2622,2623],"style",{},"html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sP4rz, html code.shiki .sP4rz{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":11,"searchDepth":997,"depth":997,"links":2625},[2626,2627,2632,2638,2646,2653,2658,2664],{"id":894,"depth":997,"text":894},{"id":924,"depth":997,"text":925,"children":2628},[2629,2630,2631],{"id":929,"depth":1004,"text":929},{"id":942,"depth":1004,"text":942},{"id":948,"depth":1004,"text":948},{"id":954,"depth":997,"text":954,"children":2633},[2634,2635,2636,2637],{"id":960,"depth":1004,"text":961},{"id":1120,"depth":1004,"text":1121},{"id":1209,"depth":1004,"text":1210},{"id":1291,"depth":1004,"text":1291},{"id":1363,"depth":997,"text":1363,"children":2639},[2640,2641,2642,2643,2644,2645],{"id":1591,"depth":1004,"text":1375},{"id":1597,"depth":1004,"text":1378},{"id":1603,"depth":1004,"text":1381},{"id":1609,"depth":1004,"text":1384},{"id":1615,"depth":1004,"text":1387},{"id":1621,"depth":1004,"text":1390},{"id":1631,"depth":997,"text":1632,"children":2647},[2648,2649,2650,2651,2652],{"id":1638,"depth":1004,"text":1638},{"id":1660,"depth":1004,"text":1660},{"id":2139,"depth":1004,"text":2139},{"id":2253,"depth":1004,"text":2253},{"id":2308,"depth":1004,"text":2308},{"id":2377,"depth":997,"text":2377,"children":2654},[2655,2656,2657],{"id":2383,"depth":1004,"text":2384},{"id":2427,"depth":1004,"text":2428},{"id":2466,"depth":1004,"text":2466},{"id":2519,"depth":997,"text":2519,"children":2659},[2660,2661,2662,2663],{"id":2522,"depth":1004,"text":2522},{"id":2568,"depth":1004,"text":2568},{"id":2574,"depth":1004,"text":2574},{"id":2580,"depth":1004,"text":2580},{"id":2616,"depth":997,"text":2616},"md",{},{"title":118,"description":119},"ai\u002Frag\u002Fvector-database","oA4cVRT5SdkYWGCwHHL5pAgQ4OcNFre1HavXhew4tQk",1775474635172]