技能使用指南

cocoindex(CocoIndex数据索引框架)Skill 是什么?如何下载安装使用?

CocoIndex数据索引框架Skill用Python声明式编写AI数据ETL管道,支持增量处理与实时同步,内置分块、嵌入、LLM提取,多源多目标导出向量库与知识图谱。本文详解安装步骤、流编写方法与竞品对比,帮你快速搭建向量检索索引,立即上手提升开发效率。

CocoIndex数据索引框架Skillcocoindex
8 个章节 约 22 分钟阅读 AI 智能生成

CocoIndex数据索引框架Skill:用 Python 声明式搭建可增量更新的 AI 数据管道

  • 一句话定位:把「源数据 → 分块/嵌入/LLM 提取 → 向量库/图数据库/关系库」的 ETL 管道,用 Python 声明式写出来,并支持增量处理与实时同步。
  • 核心能力:编写索引流(Flow)、创建自定义转换函数、通过 CLI 或 Python API 运行与维护流。
  • 数据源与目标都很丰富:源支持本地文件、S3、Azure Blob、Google Drive、Postgres;目标支持 Postgres+pgvector、Qdrant、LanceDB、Neo4j、Kuzu。
  • 内置能力开箱可用:文本分块、嵌入(SentenceTransformer / LLM API / ColPali 多模态)、LLM 结构化提取。
  • 适合谁用:正在搭建 RAG 知识库、向量检索索引、知识图谱或实时数据同步管道的 AI 工程师与数据工程团队。

该技能叫什么?如何下载安装 AI 技能提升开发效率?

技能基本信息

项目 内容
技能中文名 CocoIndex数据索引框架Skill
技能英文名 cocoindex
技能ID 12225

它解决什么问题

做 AI 应用的团队几乎都会重复遇到同一类问题:把一堆散落在本地目录、对象存储、数据库里的文档、代码、图片,切分成块、生成嵌入、抽取结构化字段,然后写进向量数据库或图数据库。如果每个项目都手写一遍脚本,就会反复遇到增量更新、断点重跑、源数据变更同步、目标表结构演进这些问题。CocoIndex 的核心思路是:你只声明“数据从哪来、怎么变换、到哪去”,框架负责执行、缓存、增量与实时同步。这个技能就是让 AI 助手能够按照 CocoIndex 的规范,帮你写出可运行、符合最佳实践的索引流代码。

一键安装与启用思路

第 1 步,确认安装前提:本机需要可用的 Python 环境与包管理器(pip、uv、poetry 均可);内部状态存储需要一个 PostgreSQL 连接;如果流里用到嵌入或 LLM 提取,还需要对应的模型 API Key。

第 2 步,安装核心包并在 AI 技能平台中启用该技能(技能ID 12225),让助手获得 CocoIndex 的写作规范、内置函数与常见问题知识。具体安装入口与启用方式以官方说明为准。

第 3 步,安装 Python 依赖。核心包提供 CLI 与大多数内置函数,扩展按需叠加:

pip install cocoindex                   # 核心功能、CLI、多数内置函数
pip install "cocoindex[embeddings]"     # SentenceTransformer 本地嵌入
pip install "cocoindex[colpali]"        # ColPali 图像/文档多模态嵌入
pip install "cocoindex[lancedb]"        # LanceDB 目标
pip install "cocoindex[embeddings,lancedb]"  # 多个扩展可组合

使用 uv、poetry 的用户也可以把上述依赖写入 pyproject.toml,具体版本与命令以官方说明为准。

第 4 步,配置环境变量。在项目根目录创建 .env:

# 内部存储(必需)
COCOINDEX_DATABASE_URL=postgres://cocoindex:cocoindex@localhost/cocoindex

# LLM API 密钥(按需添加)
OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-...
GOOGLE_API_KEY=...
VOYAGE_API_KEY=pa-...
# Ollama 为本地模型,无需 API Key

若未设置 COCOINDEX_DATABASE_URL,框架会使用上面的默认值。

第 5 步,验证是否生效。写一个最小流后执行:

cocoindex update --setup -f main   # 带设置运行,-f 跳过确认提示
cocoindex server -ci main          # 启动服务,在 CocoInsight 中查看流图与运行状态

能正常完成 setup 与 update,并在 CocoInsight 里看到流结构与统计,就说明安装配置成功。

该技能的主要功能和特点

  • 声明式编写索引流:用 @cocoindex.flow_def 装饰器定义流,flow_builder.add_source(...) 引入数据源,data_scope.add_collector() 收集结果,collector.export(...) 导出到目标。整个管道就是一段可读的 Python。
  • 增量处理:只处理发生变化的数据,而不是每次全量重跑,数据量越大收益越明显。
  • 实时更新:配合源上的 refresh_interval 或源特定变更捕获,持续把源端变化同步到目标端。
  • 内置函数覆盖常见变换:SplitRecursively(智能分块,支持 markdown、python、javascript 等语言)、ParseJson、DetectProgrammingLanguage、SentenceTransformerEmbed、EmbedText(LLM API 嵌入)、ColPaliEmbedImage、ExtractByLlm(结构化抽取与摘要)。
  • 自定义函数两种形态:简单场景用 @cocoindex.op.function 独立函数;需要配置、需要加载模型或建立连接的场景,用「FunctionSpec + executor_class」模式,配合 prepare() 做一次性初始化。
  • 独立类型系统:类型在流定义阶段即确定,因此可以在不处理真实数据的情况下推断字段类型、预先创建目标表结构(例如固定维度的向量索引)。
  • CLI 与 API 双通道:CLI 覆盖 setup / update / drop / show / evaluate;Python API 覆盖一次性更新、FlowLiveUpdater 实时更新、transform_flow 复用查询逻辑。
  • 可组合性:源、变换、目标可以自由组合。比如「从 S3 索引图片 → 用视觉 API 生成标题 → 嵌入 → 写入 Qdrant」,并不依赖某个现成模板才能实现。
  • 配套参考文档:技能内附流模式、自定义函数、CLI 操作、API 操作四份参考文档,遇到具体模式可以按需加载。

与普通脚本或单点工具相比,它真正的差异在于:把「增量」「实时」「模式演进」「可观测」这些工程问题交给框架,而不是留给业务代码。

如何使用该技能?

第 1 步:讲清需求

向助手说明三件事:数据在哪里(本地文件、S3、Postgres 等)、文件类型是什么(文本、PDF、JSON、图像、代码)、变更频率如何(一次性、周期性、连续)。再说明需要的处理(分块、嵌入、抽取)和目标(Postgres、Qdrant、Neo4j 等,含主键与是否需要向量索引)。信息越具体,生成的流越贴合。

第 2 步:安装依赖并配置 .env

参考上一节的安装步骤。需要 LLM 的流必须提供真实 API Key,助手会先检查环境变量,缺失时会主动索要,而不是退化成“假数据示例”。

第 3 步:建立项目骨架

# main.py
from dotenv import load_dotenv
import cocoindex

@cocoindex.flow_def(name="FlowName")
def my_flow(flow_builder: cocoindex.FlowBuilder, data_scope: cocoindex.DataScope):
    pass

if __name__ == "__main__":
    load_dotenv()
    cocoindex.init()
    my_flow.update()

第 4 步:按四段式编写流

源 → 收集器 → 变换(可嵌套 .row() 迭代)→ 导出。

@cocoindex.flow_def(name="DocIndex")
def doc_index(flow_builder: cocoindex.FlowBuilder, data_scope: cocoindex.DataScope):
    data_scope["docs"] = flow_builder.add_source(
        cocoindex.sources.LocalFile(path="documents", included_patterns=["*.md", "*.txt"])
    )
    collector = data_scope.add_collector()

    with data_scope["docs"].row() as doc:
        doc["chunks"] = doc["content"].transform(
            cocoindex.functions.SplitRecursively(),
            language="markdown", chunk_size=2000, chunk_overlap=500
        )
        with doc["chunks"].row() as chunk:
            chunk["embedding"] = chunk["text"].transform(
                cocoindex.functions.EmbedText(
                    api_type=cocoindex.LlmApiType.OPENAI,
                    model="text-embedding-3-small",
                )
            )
            collector.collect(
                id=cocoindex.GeneratedField.UUID,
                text=chunk["text"],
                embedding=chunk["embedding"],
            )

    collector.export(
        "doc_embeddings",
        cocoindex.targets.Postgres(),
        primary_key_fields=["id"],
        vector_indexes=[cocoindex.VectorIndexDef(
            field_name="embedding",
            metric=cocoindex.VectorSimilarityMetric.COSINE_SIMILARITY
        )],
    )

第 5 步:注意最关键的两个易错点

其一,变换结果必须赋给行字段(doc["summary"] = doc["content"].transform(...)),不能赋给局部变量,否则收集器拿不到这个字段。其二,export 只能在顶层调用,不能写在 .row() 迭代内部。

第 6 步:测试与运行

cocoindex update --setup -f main       # 首次带设置运行
cocoindex update main.py -L            # 实时更新模式
cocoindex show main.py:FlowName        # 检查流
cocoindex evaluate main.py:FlowName --output-dir ./test_output  # 无副作用评估
cocoindex drop main.py                 # 删除流与相关资源

第 7 步:需要特殊逻辑时写自定义函数

简单变换直接用装饰器:

@cocoindex.op.function(behavior_version=1)
def normalize(text: str) -> str:
    return text.strip().lower()

需要模型或连接时用规范 + 执行器,把耗时初始化放进 prepare(),并开启 cache=True;当函数逻辑变更时递增 behavior_version 让缓存失效。

第 8 步:在应用内调用

stats = my_flow.update()                 # 一次性更新,返回处理行数
with cocoindex.FlowLiveUpdater(my_flow) as updater:  # 实时更新
    ...  # 应用逻辑

查询侧可以用 @cocoindex.transform_flow() 定义可复用的嵌入逻辑,索引与查询共用同一套代码,避免“入库用 A 模型、查询用 B 模型”的隐性错误。

同类型竞品对比分析

方案名称 定位 核心功能 安装与使用门槛 适用场景 优势与不足
CocoIndex(本技能) 面向 AI 的实时数据转换框架,增量优先 声明式索引流、自定义函数、内置分块/嵌入/LLM 提取、多源多目标、CLI + Python API 需 Python 环境与 Postgres;嵌入与 LLM 需对应 API Key,扩展按需安装 向量检索索引、知识图谱、实时文档同步、多模态嵌入管道 优势:增量与实时是内建能力,源与目标覆盖广,类型系统可预推模式;不足:需要理解流与作用域写法,新用户有学习曲线
自写 Python 脚本 + 向量库 SDK 最小依赖的自研方案 手写遍历、分块、调用嵌入 API、upsert 到向量库 门槛看似最低,只需熟悉向量库 SDK 一次性、小规模、原型验证 优势:完全可控、无额外框架;不足:增量、去重、失败重试、模式迁移全部要自己实现,数据一多维护成本陡增
通用编排工具(如 Airflow / Prefect 类) 任务级调度编排 DAG 调度、重试、告警、任务依赖 需部署调度服务与执行环境 已有数据平台、批处理为主的团队 优势:调度与运维成熟;不足:粒度是任务而非数据行,天然不做行级增量与向量索引管理,AI 数据转换要自己写算子
应用层 RAG 框架的文档入库模块 与应用框架绑定的入库能力 文档加载、切分、写入向量库 随框架安装,上手快 单体 RAG 应用、快速验证 优势:与框架生态耦合紧密、开箱即用;不足:源与目标的组合相对固定,实时增量与图数据库写入支持有限,脱离该框架后难以复用

选型建议:原型验证阶段用轻量脚本或 RAG 框架自带模块即可;一旦进入需要持续增量、多源、多目标的生产阶段,CocoIndex 这类专门的转换框架的价值会明显放大。

该技能的典型应用场景与实际体验情况

场景一:企业文档知识库的向量检索

角色是 AI 应用工程师,痛点是内部文档持续更新,每次全量重建索引既慢又产生大量重复的嵌入调用费用。使用方式是配置 LocalFile 或 AmazonS3 源,用 SplitRecursively 按 markdown 分块,EmbedText 生成嵌入,导出到 Postgres + pgvector 并建立余弦相似度索引。实际体验:改完文档后执行 cocoindex update,只处理变化的部分,运行统计能直接看到处理行数;cocoindex server -ci main 打开 CocoInsight 后,流图与各阶段状态一目了然,排查问题比翻日志高效得多。注意事项:分块大小与重叠要按文档类型调,chunk_size=2000 / chunk_overlap=500 是常见起点而非通用最优值。

场景二:代码库语义索引与检索

角色是研发效能团队,痛点是代码库大、语言混杂,希望做“按语义找代码”。使用方式是配置代码目录源,用 DetectProgrammingLanguage 识别语言、SplitRecursively 指定 language="python" 等做结构化分块,再用本地 SentenceTransformerEmbed 或云端 EmbedText 生成嵌入。实际体验:DetectProgrammingLanguage 省掉了自己维护扩展名映射表的麻烦;类型系统会在流定义阶段推断字段类型,目标表结构可以提前建好,不需要反复试跑。注意事项:本地嵌入需要安装 cocoindex[embeddings] 扩展,首次加载模型有额外时间与内存开销。

场景三:用 LLM 抽取结构化信息并构建知识图谱

角色是数据/算法工程师,痛点是大量非结构化文档里的人物、产品、事件关系需要变成图结构。使用方式是定义数据类(如 ProductInfo),用 ExtractByLlm 配 output_type=ProductInfo 和抽取指令,然后用 Neo4j 目标分别导出节点(Nodes)和关系(Relationships)。实际体验:结构化输出直接映射为流字段,不需要再手工解析 JSON;节点与关系分成两个收集器导出,图的构建流程清晰。注意事项:LLM 抽取建议开 cache=True,否则重跑会产生重复调用成本;ExtractByLlm 目前支持结构化类型和 str 两种输出。

场景四:多模态图像/PDF 实时索引

角色是搜索产品团队,痛点是扫描版 PDF 与图片难以做文本检索。使用方式是安装 cocoindex[colpali],用 ColPaliEmbedImage 生成多模态嵌入并写入支持的向量库。实际体验:多模态能力以扩展形式提供,不污染主包;配合 refresh_interval 可以把新增文件自动同步进索引。注意事项:多模态嵌入对算力要求较高,建议在源上设置 max_inflight_rows / max_inflight_bytes 做并发控制,避免内存溢出。

整体上手评价:从零到第一个能跑通的流不算难,官方四份参考文档基本覆盖常见模式;真正的门槛在于理解“作用域 + 行字段赋值 + 顶层导出”这套心智模型,只要记住变换结果必须写回字段这一点,大部分报错都能自行解决。

该技能能为用户带来的价值

  • 工程效率:把索引管道的骨架工作从“写脚本 + 处理增量 + 处理重试 + 处理模式迁移”压缩为一次声明式定义,常见场景下的代码量显著下降。
  • 成本可控:增量处理意味着只有变化的数据才触发嵌入与 LLM 调用;加上自定义函数的 cache=True,重复数据的调用成本被有效抑制。
  • 实时性从“不可能”变为“默认可选”:过去实时同步要单独搭一套变更监听,现在通过 refresh_interval 或 FlowLiveUpdater 就能纳入同一份代码。
  • 降低协作门槛:流定义就是可读的 Python,数据流向、字段来源、目标结构一目了然,评审与交接不再依赖口头解释。
  • 长期可维护:独立类型系统让字段类型在定义阶段即确定,目标表结构可以预先创建,避免“跑一遍才知道字段对不对”的返工循环;多源多目标的统一抽象也让换向量库、加数据源成为小改动而非重写。
  • 减少试错:技能内置常见错误提示与故障排查项(流未找到、数据库连接失败、模式不匹配、实时更新立即退出、内存不足),配合参考文档,多数问题可以在几分钟内定位。

常见问题 FAQ

Q1:这个技能怎么安装?装完怎么确认能用?

在 AI 技能平台中启用 cocoindex 技能(技能ID 12225),让助手获得 CocoIndex 的开发规范;同时用 pip、uv 或 poetry 安装 Python 依赖,核心是 cocoindex,需要本地嵌入再加 cocoindex[embeddings],需要 LanceDB 目标加 cocoindex[lancedb],多模态再加 cocoindex[colpali]。随后配置 .env 中的 COCOINDEX_DATABASE_URL 与所需 API Key,执行 cocoindex update --setup -f main,能完成 setup 与 update 即表示生效。具体安装入口与版本要求以官方说明为准。

Q2:使用它收费吗?

CocoIndex 本身是开源框架,技能里没有给出定价信息;实际费用主要来自你选择的外部服务,包括数据库(Postgres、Qdrant、Neo4j 等)的资源开销,以及嵌入与 LLM 调用产生的 API 费用。如果用 Ollama 等本地模型做生成与嵌入,可以省掉 API 费用但会占用本机算力。具体许可与商务条款以官方说明为准。

Q3:适合谁用?我是数据分析师,不会写复杂代码能用吗?

最适合的是需要把非结构化数据接进向量库或图数据库的 AI 工程师、算法工程师与数据工程团队。如果你能用 Python 读懂字典与循环,就能借助这个技能搭出第一条流——助手会按规范生成代码并解释每一段在做什么。但如果完全不想接触代码与命令行,建议先在平台上用小规模数据试跑。

Q4:和直接用 RAG 框架的入库模块、或自己写脚本相比,该怎么选?

如果你的场景是一次性导入、数据量不大、只用一个向量库,直接写脚本或使用框架自带模块更省事。一旦出现以下任一需求——数据源持续变化需要增量与实时同步、要同时写入关系库和向量库/图数据库、需要 LLM 做结构化抽取、需要预先固定向量维度建索引——CocoIndex 这类专门的数据转换框架优势就体现出来了:这些能力是内建的,而不是靠你自己在业务代码里补。

Q5:运行时提示“模式不匹配”或“数据库连接失败”怎么办?

“模式不匹配”通常是流定义改了字段或类型,重新执行 cocoindex setup main.py 即可;若仍不行,用 cocoindex drop main.py && cocoindex setup main.py 重建。“数据库连接失败”先检查 .env 中的 COCOINDEX_DATABASE_URL 是否存在且可连通,可以用 psql $COCOINDEX_DATABASE_URL 验证;配置文件不在默认位置时用 --env-file 指定。“实时更新立即退出”一般是源上缺少 refresh_interval 或变更捕获配置。“内存不足”则在源上设置 max_inflight_rows、max_inflight_bytes,或在环境变量里设置 COCOINDEX_SOURCE_MAX_INFLIGHT_ROWS 做全局限制。