当前位置: 首页 > news >正文

240922-chromadb的基本使用

在这里插入图片描述

A. 背景介绍

ChromaDB 是一个较新的开源向量数据库,专为高效的嵌入存储和检索而设计。与其他向量数据库相比,ChromaDB 更加专注于轻量化、简单性和与机器学习模型的无缝集成。它的核心目标是帮助开发者轻松管理和使用高维嵌入向量,特别是与生成式 AI(如 GPT 系列)集成。

ChromaDB 的优点

  1. 简单易用

    • ChromaDB 提供了简单直观的 API,开发者可以快速上手。其轻量化设计使得在开发环境中运行和集成变得非常便捷。
    • 内置支持文本嵌入,特别适合 NLP 项目,与诸如 OpenAI 的 GPT 模型结合使用效果显著。
  2. 轻量级

    • 相较于 Milvus 和 Vespa 等重量级系统,ChromaDB 是一种轻量级的选择,不需要复杂的配置和大规模基础设施支持。非常适合小型或中型项目。
  3. 内置存储和检索功能

    • 提供了嵌入的持久化和检索功能,能够方便地将计算出的嵌入存储在数据库中,并进行高效的相似度查询。
    • 支持基于向量的最近邻搜索,查询性能相对较好。
  4. 无缝集成机器学习模型

    • ChromaDB 特别强调与各种生成式 AI 和嵌入模型的集成。可以轻松与 Hugging Face 等机器学习库和模型结合使用,用于 NLP、图像嵌入等。
  5. 灵活的存储后端

    • 它可以本地运行,也可以连接到其他数据库或存储后端(例如 SQLite 或 PostgreSQL),从而提供了更多的灵活性。
  6. 社区支持

    • 虽然相对较新,但 ChromaDB 的开发者活跃,社区在不断推动其更新与发展。

ChromaDB 的缺点

  1. 扩展性有限

    • ChromaDB 目前的扩展性不如 Milvus、Vespa 或 FAISS 等专为大规模向量处理设计的数据库。它更适合中小规模的数据集,在大规模场景下可能面临性能瓶颈。
  2. 功能相对较少

    • 相比于 Milvus 和 Weaviate 提供的混合查询功能,ChromaDB 主要专注于嵌入和向量搜索,不具备复杂的查询处理能力。
    • 不具备一些高级功能(如 Weaviate 的分类器或 Vespa 的实时处理能力)。
  3. 集群支持不完善

    • 目前 ChromaDB 不支持多节点集群部署,无法像 Milvus 和 Vespa 那样轻松处理跨多个节点的大规模数据查询。
  4. 成熟度不足

    • ChromaDB 相对较新,虽然社区活跃,但在稳定性、文档完善性和企业级使用上与成熟的向量数据库如 FAISS、Milvus 还有一定差距。
    • 缺少一些企业级功能,比如事务管理、备份和恢复等。
  5. 缺少 GPU 加速

    • 与 FAISS 的 GPU 支持不同,ChromaDB 当前主要是 CPU 驱动的,没有内置的 GPU 加速选项,在处理大型向量数据集时性能会受到限制。

与其他向量数据库的比较

数据库优点缺点适用场景
Milvus高可扩展性、支持多种向量索引、混合查询配置复杂、资源消耗较高大规模数据、复杂查询场景
FAISS支持 GPU 加速、高效的相似性搜索缺少数据库功能、没有持久化和集群支持高效向量搜索、需要 GPU 加速的场景
Weaviate支持混合查询、集成外部机器学习模型大规模处理能力有限语义搜索、知识图谱
Pinecone托管服务、简单易用、实时查询非开源、灵活性较低快速开发、无需自建基础设施
Vespa实时数据处理、复杂查询、机器学习集成系统复杂、维护成本高大规模数据实时处理
ChromaDB简单易用、轻量级、与生成式 AI 无缝集成、灵活存储选项扩展性有限、功能较少、缺少集群和 GPU 支持小中型项目、NLP 项目和嵌入管理

总结

ChromaDB 的优势在于轻量级、易于使用和与生成式 AI 的无缝集成,适合中小规模项目,尤其是需要处理嵌入和高维向量的 NLP 和图像嵌入任务。对于需要处理大规模数据、复杂查询、或 GPU 加速的应用,可能 Milvus 或 FAISS 会是更好的选择。如果你需要在快速开发环境中部署向量搜索或嵌入管理,ChromaDB 是一个简单有效的选择。

B. 基本使用

ChromaDB 是一个专门为向量数据库和嵌入查询优化的数据库。它可以与嵌入模型结合使用,存储和查询高维向量数据,通常用于大规模语义搜索、推荐系统等领域。

以下是使用 ChromaDB 的步骤:

1. 安装 ChromaDB

你可以通过 pip 安装 ChromaDB:

pip install chromadb

2. 创建一个数据库并插入数据

你需要创建一个 Chroma 的实例,然后可以在这个实例中创建一个集合并添加向量数据。

import chromadb# 创建 ChromaDB 客户端
client = chromadb.Client()# 创建一个集合,用于存储向量数据
collection = client.create_collection(name="my_collection")# 插入向量数据
documents = ["Document 1", "Document 2", "Document 3"]
embeddings = [[0.1, 0.2, 0.3],  # 向量 1[0.4, 0.5, 0.6],  # 向量 2[0.7, 0.8, 0.9],  # 向量 3
]
metadata = [{"source": "A"}, {"source": "B"}, {"source": "C"}]collection.add(documents=documents,    # 文本embeddings=embeddings,  # 对应的嵌入向量metadatas=metadata      # 附加的元数据
)

3. 查询向量

你可以根据提供的查询向量进行相似性搜索,查找与查询向量相似的文档。

query_embedding = [0.2, 0.3, 0.4]  # 你的查询向量# 搜索最相似的文档
results = collection.query(query_embeddings=[query_embedding],n_results=2  # 返回最相似的 2 个文档
)# 输出结果
print(results)

4. 更新与删除数据

你可以根据需要更新或删除某些向量或文档:

更新:
collection.update(ids=["id_of_document"],  # 要更新的文档的 iddocuments=["Updated document"],embeddings=[[0.9, 0.8, 0.7]],  # 更新后的嵌入向量
)
删除:
collection.delete(ids=["id_of_document"])  # 删除特定 ID 的文档

5. 获取集合中的数据

如果你想获取某个集合中的所有数据,可以使用以下方法:

all_docs = collection.get()
print(all_docs)

6. 使用 OpenAI 生成的嵌入向量

你还可以结合 OpenAI 等模型生成文本的嵌入向量,然后存储到 ChromaDB 中:

import openai# 使用 OpenAI 模型生成嵌入
response = openai.Embedding.create(model="text-embedding-ada-002",input="This is a sample document."
)embedding = response['data'][0]['embedding']

生成嵌入后,你可以将其插入到 ChromaDB 中,用于后续的查询和分析。

总结

ChromaDB 的主要功能包括:

  • 存储和管理高维向量数据。
  • 快速进行相似性搜索。
  • 结合嵌入模型,用于语义搜索、推荐等应用。

如果你有更具体的需求或场景,可以进一步定制使用 ChromaDB 的操作。

C. 持久化与增量更新

在 ChromaDB 中,要实现持久化增量更新,可以利用以下机制:

1. 持久化存储

ChromaDB 默认使用内存中的数据库来存储数据,但它也支持将数据持久化到磁盘,以便在应用重启后仍然保留数据。要实现持久化存储,你可以指定一个路径来保存数据。

import chromadb# 创建持久化的 ChromaDB 客户端,指定存储路径
client = chromadb.Client(persist_directory="./chromadb_data")# 创建或加载集合
collection = client.create_collection(name="my_collection")# 插入文档和向量
documents = ["Document 1", "Document 2"]
embeddings = [[0.1, 0.2, 0.3],[0.4, 0.5, 0.6],
]
metadata = [{"source": "A"}, {"source": "B"}]collection.add(documents=documents,embeddings=embeddings,metadatas=metadata
)# 调用这个方法来保存数据到磁盘
client.persist()

每当你更新或插入数据后,可以调用 client.persist() 将数据写入磁盘,这样即使程序关闭后,数据依然存在。

2. 增量更新

增量更新指的是当有新数据时,不必重写整个数据库,而只对新数据进行添加或修改。

增量插入新数据

你可以使用 collection.add() 方法来增量添加新文档和嵌入向量:

# 插入新的文档和嵌入
new_documents = ["Document 3"]
new_embeddings = [[0.7, 0.8, 0.9]]
new_metadata = [{"source": "C"}]# 增量添加到现有的集合中
collection.add(documents=new_documents,embeddings=new_embeddings,metadatas=new_metadata
)# 持久化保存增量更新的数据
client.persist()
更新现有的数据

如果你需要更新现有的文档或向量,可以使用 collection.update()

# 更新已有的文档,假设你要更新 ID 为 "doc_id_1" 的文档
collection.update(ids=["doc_id_1"],  # 更新文档的 IDdocuments=["Updated Document 1"],  # 新的文档内容embeddings=[[0.3, 0.4, 0.5]]  # 新的向量
)# 持久化保存更新
client.persist()
删除文档

如果需要删除某些文档,可以使用 collection.delete() 方法:

# 删除 ID 为 "doc_id_1" 的文档
collection.delete(ids=["doc_id_1"])# 持久化保存更新
client.persist()

3. 加载已有数据

当你启动应用时,ChromaDB 可以从指定的持久化路径中加载已经保存的数据:

# 创建持久化的 ChromaDB 客户端并加载数据
client = chromadb.Client(persist_directory="./chromadb_data")# 加载已有的集合
collection = client.get_collection(name="my_collection")# 现在你可以查询、更新或删除集合中的数据

总结

  1. 持久化:通过指定 persist_directory 来保存数据到磁盘,并使用 client.persist() 确保更新写入磁盘。
  2. 增量更新:可以使用 collection.add() 插入新数据,collection.update() 更新现有数据,或 collection.delete() 删除数据,增量更新不会影响已有数据。
  3. 加载持久化数据:在应用启动时,通过指定路径加载已经保存的数据库集合。

这种方式确保数据的持久性,并且支持高效的增量更新。

D. 其它向量数据库

向量数据库是一种专门用于存储和查询高维向量数据的数据库,广泛用于自然语言处理、图像检索、推荐系统等场景。常见的开源向量数据库包括 MilvusFAISSWeaviatePineconeVespa。下面是这些数据库的优点和缺点比较:

1. Milvus

Milvus 是一种高度可扩展的开源向量数据库,专为海量非结构化数据管理而设计,支持数十亿级别的向量数据管理。

  • 优点

    • 支持多种向量搜索算法(例如 IVF、HNSW 等),提供灵活的搜索选项。
    • 支持混合查询,可以对结构化和非结构化数据进行联合查询。
    • 高可扩展性,能够处理大规模数据。
    • 与其他大数据工具如 Spark 和 Kafka 集成良好。
    • 提供了完善的社区支持和丰富的 API(Python、Java、Go 等)。
  • 缺点

    • 资源消耗较高,部署和维护成本较大。
    • 相对较新的项目,尽管发展迅速,但某些高级功能可能还不如更成熟的系统稳定。

2. FAISS

FAISS 是 Facebook AI Research 团队开发的开源库,用于高效的相似性搜索和密集向量的聚类。

  • 优点

    • 支持大规模、高维向量搜索,并在 CPU 和 GPU 上都能高效运行。
    • 在搜索速度和精度上表现优异,尤其是在 GPU 加速下。
    • 支持多种索引类型,能够根据不同的场景选择合适的索引结构。
  • 缺点

    • 主要是一个库而非数据库,没有持久化存储机制,需要与其他存储系统结合使用。
    • 缺乏内置的多节点集群支持,扩展性不如 Milvus 等数据库。
    • 功能较单一,主要专注于向量相似度搜索,不支持混合查询或其他高级数据库功能。

3. Weaviate

Weaviate 是一个基于 GraphQL 和 RESTful API 的开源向量数据库,设计用于支持向量和结构化数据的混合查询。

  • 优点

    • 提供了向量搜索与结构化数据查询的强大结合,适合知识图谱和语义搜索。
    • 内置分类器,可以自动处理非结构化数据并生成向量表示。
    • 拥有高度扩展的插件系统,能够轻松集成外部机器学习模型或其他第三方工具。
  • 缺点

    • 对大规模数据集的处理能力较为有限,性能不如 Milvus 和 FAISS 强大。
    • 社区活跃度相对较低,功能更新速度和文档支持可能不足。

4. Pinecone

Pinecone 是一个向量数据库,尽管不是完全开源,但仍然在向量搜索领域有着广泛应用。其目标是提供一个托管的、可扩展的向量搜索平台。

  • 优点

    • 提供托管服务,开发者无需担心底层基础设施的维护和管理。
    • 高度可扩展,支持实时查询和批量插入大规模数据。
    • 提供简单易用的 API 和集成工具。
  • 缺点

    • 非完全开源,某些高级功能可能需要付费版本。
    • 灵活性较低,因为它是托管服务,用户无法直接控制底层架构。
    • 依赖于第三方服务,可能面临服务商锁定的风险。

5. Vespa

Vespa 是 Verizon Media 推出的一个开源的、大规模实时搜索和推荐引擎,适合复杂的向量搜索和大规模数据处理。

  • 优点

    • 支持实时和批量数据的处理,适合实时性要求高的场景。
    • 除了向量搜索,还支持结构化查询、机器学习模型推理等多种功能。
    • 高度可扩展,适合处理数十亿级别的文档和查询。
  • 缺点

    • 架构复杂,配置和维护成本较高。
    • 相对较重的系统,适用于大规模工业应用,可能不适合较小的数据集或简单的应用场景。

总结:

  • Milvus 适合大规模向量数据的处理,且支持混合查询,适合需要高可扩展性的场景。
  • FAISS 适合需要在 CPU/GPU 上进行高效向量相似性搜索的场景,但不具备数据库功能。
  • Weaviate 适合处理向量和结构化数据的混合查询,且易于扩展和集成。
  • Pinecone 适合需要托管服务并希望避免基础设施管理的用户,但它不是完全开源的。
  • Vespa 适合大规模复杂查询和实时处理场景,功能强大但架构复杂。

根据你的应用场景和需求,选择合适的向量数据库可以帮助你更好地处理高维向量数据和优化查询性能。

E. 参考文献

  • chroma-core/chroma: the AI-native open-source embedding database
  • alejandro-ao/langchain-ask-pdf: An AI-app that allows you to upload a PDF and ask questions about it. It uses OpenAI’s LLMs to generate a response.
  • VikParuchuri/marker: Convert PDF to markdown quickly with high accuracy
  • 240922-Ollama使用Embedding实现RAG-CSDN博客

相关文章:

240922-chromadb的基本使用

A. 背景介绍 ChromaDB 是一个较新的开源向量数据库,专为高效的嵌入存储和检索而设计。与其他向量数据库相比,ChromaDB 更加专注于轻量化、简单性和与机器学习模型的无缝集成。它的核心目标是帮助开发者轻松管理和使用高维嵌入向量,特别是与生…...

工厂模式和抽象工厂模式的实验报告

1. 实验结果: 记录并附上不同模型对象(例如:士兵、机器人、骑士)的展示效果截图。 2. 性能分析: 记录并比较抽象工厂模式与直接实例化的性能测试结果,分析它们在不同数量级对象创建时的开销与效益。 2.1…...

C标准库<string.h>-str、strn开头的函数

char *strcat(char *dest, const char *src) 函数功能 strcat 函数用于将一个字符串追加到另一个字符串的尾部。 参数解释 dest:指向目标字符串的指针,这个字符串的尾部将被追加 src 字符串的内容。src:指向源字符串的指针,其…...

Anaconda/Miniconda的删除和安装

要在 MacBook 上删除 Anaconda 或 Miniconda,并重新安装它,您可以按照以下步骤进行操作。 删除 Anaconda/Miniconda 1. 删除 Anaconda/Miniconda 文件和目录 打开 终端 并运行以下命令来删除安装目录。 对于 Anaconda,通常安装在 ~/anaconda3: rm -rf ~/anaconda3对于…...

【Harmony】轮播图特效,持续更新中。。。。

效果预览 swiper官网例子 Swiper 高度可变化 两边等长露出,跟随手指滑动 Swiper 指示器导航点位于 Swiper 下方 卡片楼层层叠一 一、官网 例子 参考代码: // xxx.ets class MyDataSource implements IDataSource {private list: number[] []cons…...

Go 并发模式:管道的妙用

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在编写程序时,我们通常不会一口气写出一个冗长的函数。相反,我们通过构建函数、结构体和方法等抽象来简化代码。这不仅有助于隐藏不重要的细节,还使我们能够专注于某一部分代码,而不必担心影响其他部分。然而…...

CAN通信详解

1、CAN介绍 1.1、什么是CAN? CAN(Controller Area Network) 即控制器局域网,是ISO国际标准化的串行通信协议。 开发目的:为了满足汽车产业的“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”…...

52 文本预处理_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 例如:第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录一、理论部分二、代码读取数据集词元化词表整合所有功能小结练习 一、理论部分 对于序列数据处理问题,我们在序列处理中评估了所需的统计工具和预测时面临的挑战。 …...

【python】字符串扩展-格式化的精度控制

字符串扩展 字符串的三种定义方式字符串拼接字符串格式化格式化的精度控制字符串格式化方式2对表达式进行格式化 学习目标 掌握格式化字符串的过程中做数字的精度控制 字符串格式化 name "小明" set_up_year 2006 stock_price 19.99 message "我是&…...

C++第一次练习

题目1 class Solution { public:bool isletter(char s){if(s<z&&s>a)return true;if(s>A&&s<Z)return true;return false;}string reverseOnlyLetters(string s) {if(s.empty()){return s;}int left,right;left0;rights.size()-1;while(left<ri…...

计算机毕业设计 基于Python的医疗预约与诊断系统 Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…...

JAVA基础:正则表达式,String的intern方法,StringBuilder可变字符串特点与应用,+连接字符串特点

1 String中的常用方法2 1.1 split方法 将字符串按照指定的内容进行分割&#xff0c;将分割成的每一个子部分组成一个数组 分割内容不会出现在数组中 实际上该方法不是按照指定的简单的符号进行分割的&#xff0c;而是按照正则表达式进行分割 1.2 正则表达式 用简单的符号组合…...

前端接口报错302 [已解决]

前端接口报错302 [已解决] 在前端开发中&#xff0c;与后端接口的交互是项目成功的关键。然而&#xff0c;遇到如302这样的状态码报错时&#xff0c;可能会让开发者感到困惑。本文将通过详细解析和多个代码案例&#xff0c;帮助你深入理解前端接口报错302&#xff0c;并提供有效…...

【网络安全】利用未授权API接口实现创建Support Ticket

未经许可,不得转载。 文章目录 正文目标为一个技术平台,客户可以通过该平台预订不同类型的服务。 正文 redacted.com 是主域,但所有流量都通过 api.redacted.com。我过去曾使用该公司预订了一些服务,因此我的帐户中有预订历史。 我对我的订单开具了 Support Ticket,此时…...

气压高度加误差的两种方法(直接添加 vs 换算到气压误差),附MATLAB程序

在已知高度真实值时,如果需要计算此高度下的气压计误差,可考虑本文所述的两种方法 气压高度 气压与高度之间的关系可以用大气压的垂直变化来描述。随着高度的增加,气压通常会下降。这是因为空气的密度在高度增加时减少,导致上方空气柱对下方空气施加的压力减小。 主要关系…...

Word 制作会议名牌教程

文章目录 Part.I IntroductionPart.II 制作步骤 Part.I Introduction 本文详细介绍了如何用 Word 制作会议名牌&#xff0c;附有笔者制作好的一个成品&#xff08;戳我下载~&#xff09;。 下面是一些常识 会议名牌尺寸&#xff1a;100mm 180mm Part.II 制作步骤 1、新建文…...

浮动静态路由

浮动静态路由 首先我们知道静态路由的默认优先级是60&#xff0c;然后手动添加一条静态路由优先级为80的路由作为备份路由。当主路由失效的备份路由就会启动。 一、拓扑图 二、基本配置 1.R1: <Huawei>system-view [Huawei]sysname R1 [R1]interface GigabitEthernet…...

JavaWeb初阶 day1

目录 tomcat目录结构 tomcat:web服务器软件 项目部署的方式 直接将项目放到webapps下 配置conf/server.xml文件 在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写 静态项目和动态项目 Servlet Servlet执行原理 Servlet方法&#xff08;生命周期&#x…...

OpenAPI鉴权(二)jwt鉴权

一、思路 前端调用后端可以使用jwt鉴权&#xff1b;调用三方接口也可以使用jwt鉴权。对接多个三方则与每个third parth都约定一套token规则&#xff0c;因为如果使用同一套token&#xff0c;token串用可能造成权限越界问题&#xff0c;且payload交叉业务不够清晰。下面的demo包…...

【Rust练习】16.模式

文章题目来自&#xff1a;https://practice-zh.course.rs/pattern-match/patterns.html 1 &#x1f31f;&#x1f31f; 使用 | 可以匹配多个值, 而使用 … 可以匹配一个闭区间的数值序列 fn main() {} fn match_number(n: i32) {match n {// 匹配一个单独的值1 > println!(…...

个人自动化技能库构建指南:从Python脚本到Cron定时任务

1. 项目概述&#xff1a;一个为“摸鱼”场景设计的自动化技能库最近在GitHub上看到一个挺有意思的项目&#xff0c;叫my-copaw-skill。光看这个名字&#xff0c;就透着一股子“打工人”的幽默感——“copaw”这个词&#xff0c;我琢磨着应该是“copilot”&#xff08;副驾驶/助…...

基于Adafruit FLORA的红外遥控胸针DIY:从嵌入式编程到可穿戴艺术

1. 项目概述&#xff1a;一个藏在时尚配饰里的“电视终结者”几年前&#xff0c;我在一个朋友聚会上&#xff0c;发现大家明明在聊天&#xff0c;眼睛却总是不自觉地瞟向角落里那个正在播放无聊广告的电视。直接走过去关掉显得有点突兀&#xff0c;找遥控器又太麻烦。那一刻我就…...

智能路由器项目解析:基于策略路由实现多线路流量智能调度

1. 项目概述&#xff1a;一个“聪明”的路由器能做什么&#xff1f;最近在GitHub上看到一个挺有意思的项目&#xff0c;叫smart-router&#xff0c;作者是c0nSpIc0uS7uRk3r。光看名字&#xff0c;你可能会觉得这又是一个关于家庭网络优化的工具&#xff0c;但点进去仔细研究后&…...

手把手教你给STM32MP157开发板接上HDMI显示器(基于Sii9022A芯片与设备树配置)

STM32MP157开发板HDMI显示实战&#xff1a;从硬件连接到设备树配置全解析 引言 当你第一次拿到STM32MP157开发板时&#xff0c;最令人兴奋的莫过于看到图形界面在屏幕上亮起的那一刻。但现实往往很骨感——手头可能没有配套的LCD屏幕&#xff0c;而HDMI显示器却是大多数开发者桌…...

终极免费方案:3步轻松解锁QQ音乐加密文件,让音乐随处可听

终极免费方案&#xff1a;3步轻松解锁QQ音乐加密文件&#xff0c;让音乐随处可听 【免费下载链接】qmcflac2mp3 直接将qmcflac文件转换成mp3文件&#xff0c;突破QQ音乐的格式限制 项目地址: https://gitcode.com/gh_mirrors/qm/qmcflac2mp3 你是否曾遇到过这样的情况&a…...

怎样免费让老Mac重获新生:OpenCore Legacy Patcher专业教程

怎样免费让老Mac重获新生&#xff1a;OpenCore Legacy Patcher专业教程 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 想让你的旧Mac重新焕发活力吗&#xf…...

VectorDBBench:向量数据库性能基准测试工具详解与实战

1. 项目概述&#xff1a;向量数据库性能测试的“瑞士军刀”如果你正在评估或使用向量数据库&#xff0c;那么你一定遇到过这个灵魂拷问&#xff1a;“这么多产品&#xff0c;到底哪个最适合我的场景&#xff1f;”是选名声在外的老牌劲旅&#xff0c;还是选后起之秀的专精选手&…...

CircuitPython Web Workflow实战:无线开发Yoto Mini与I2C硬件验证

1. 项目概述与核心价值如果你玩过像树莓派Pico或者ESP32这类微控制器&#xff0c;肯定对“插拔-编程-调试”这个循环不陌生。每次改几行代码&#xff0c;就得拔下USB线&#xff0c;重新上电&#xff0c;然后盯着串口监视器看输出。这个过程在项目初期调试硬件时&#xff0c;尤其…...

飞书自动化开发实战:从脚本编写到事件驱动架构设计

1. 项目概述&#xff1a;飞书自动化&#xff0c;从“手动挡”到“自动驾驶”的进化 如果你每天的工作&#xff0c;有超过30%的时间是在飞书里重复着“点击-填写-发送”的枯燥操作&#xff0c;比如手动拉取数据生成日报、定时向群聊推送消息、或者根据特定条件审批流程&#xf…...

别再拷贝exe到NXBIN了!用批处理文件搞定NX二次开发外部exe的环境变量(附VS2015/NX12配置)

告别手动拷贝&#xff1a;用批处理智能管理NX二次开发环境变量 每次修改完NX二次开发的外部exe程序&#xff0c;都要手动拷贝到NXBIN目录&#xff1f;这种重复劳动不仅低效&#xff0c;还容易导致版本混乱。其实只需一个简单的批处理脚本&#xff0c;就能彻底解决环境变量配置问…...