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 做全局限制。