ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于 Pixeltable MCP 与 CrewAI 构建统一多模态数据存储与检索 Agent 系统

基于 Pixeltable MCP 与 CrewAI 构建统一多模态数据存储与检索 Agent 系统 基于 Pixeltable MCP 与 CrewAI 构建统一多模态数据存储与检索 Agent 系统【免费下载链接】ai-engineering-hubIn-depth tutorials on LLMs, RAGs and real-world AI agent applications.项目地址: https://gitcode.com/GitHub_Trending/ai/ai-engineering-hub本文以pixeltable-mcp项目为主线讲解如何用 Pixeltable 构建统一的多模态数据存储与编排底座将文本、图像、音频、视频的入库 → 索引 → 检索能力封装为 4 个独立的 MCP Server再通过 CrewAI Flow 编排 Router/Specialist/Synthesis 三类 Agent实现一次提问、自动路由、按模态执行、最终合成的完整多模态 Agent 系统。读完本文你将掌握这套多模态 MCP 服务的部署命令、底层数据管道设计以及如何把 MCP 工具接入本地 LLM 驱动的 CrewAI 多智能体流程。项目定位为多模态数据提供存储 索引 编排一站式方案pixeltable-mcp项目解决的核心问题是多模态数据文本、图片、音频、视频往往散落在不同管道中缺乏统一的存储、增量索引与检索能力。项目给出的答案是——基于 Pixeltable 构建统一的多模态数据存储与编排基础设施实现增量存储、变换、索引与编排让用户通过一套 API 即可完成跨模态的存储与语义搜索。在架构上项目将 Pixeltable 基础设施封装为面向不同模态的 MCP Server并连接到由本地 LLMOllama驱动的 Agent 上。这些 MCP Server 既可以配合本项目中的 CrewAI 多智能体演示使用也可以作为独立组件嵌入读者自己的解决方案。工作流程五步闭环README 中给出的系统工作流程分为五个环节Query Submission查询提交用户提交任意模态文本、图片、视频或音频的查询。Smart Routing智能路由Router Agent 对查询分类将其派发给对应的专家 Agent。Specialist Execution专家执行Document、Image、Video、Audio 四类 Specialist Agent 各自使用专属的 Pixeltable MCP Server 完成任务——无论是索引、插入还是搜索。Response Synthesis响应合成执行结果被传递给 Synthesis Agent。Final Output最终输出合成 Agent 将检索到的信息提炼为干净、易读的最终回复。技术选型Pixeltable多模态 AI 数据基础设施存储、变换、索引CrewAI多智能体编排框架Ollama本地运行大语言模型项目默认拉取gemma3。从 pyproject.toml 可以看到核心依赖为crewai-tools[mcp]0.49.0、ollama0.5.1、pixeltable0.4.2与python-dotenv1.1.1同时要求 Python3.13子服务镜像基于 Python 3.10-slim见下文。环境准备.env、Ollama 与依赖安装按 README 的步骤依次完成环境搭建1. 创建 .env 文件在项目根目录创建.env内容如下OPENAI_API_KEYyour_openai_api_key该密钥会在 docker compose 启动服务时通过OPENAI_API_KEY${OPENAI_API_KEY}注入到每个容器的环境变量中见 docker-compose.yaml供音频转写等依赖 OpenAI 的环节使用。由于密钥通过--env-file .env读取请确保.env与 docker-compose.yaml 位于同一目录。2. 安装并配置 Ollama从官方下载页安装 OllamaLinux 下可使用一行命令curl -fsSL https://ollama.com/install.sh | sh随后拉取项目使用的本地模型ollama pull gemma3Ollama 负责在本地运行 Router/Specialist/Synthesis 等 Agent 所依赖的 LLMcrewai_mcp.ipynb中会通过 Ollama 实例化本地模型。3. 安装依赖uv sync一键启动四个 MCP Server项目为每种模态维护了一个独立的服务目录audio-index、video-index、image-index、doc-index外加一个通用基础 SDK 目录base-sdk。启动全部 4 个服务只需一条命令docker compose --env-file .env up --build从 docker-compose.yaml 可以看到每个服务的完整定义服务名端口目录启动命令audio-index8080audio-indexpython server.py --host 0.0.0.0 --port 8080video-index8081video-indexpython server.py --host 0.0.0.0 --port 8081image-index8082image-indexpython server.py --host 0.0.0.0 --port 8082doc-index8083doc-indexpython server.py --host 0.0.0.0 --port 8083四个服务共享同一套构建模式每个子目录都有独立的Dockerfile、requirements.txt、server.py、tools.pyrequirements.txt声明pixeltable、mcp、httpx、uvicorn、starlette等运行依赖Dockerfile基于python:3.10-slim安装依赖后将server.py与tools.py复制进镜像默认暴露 8080 端口如 base-sdk/Dockerfiledocker-compose.yaml中通过volumes将./audio-index/audio_index等本地目录挂载到容器内/app/audio_index保证 Pixeltable 元数据与索引数据的持久化每个服务都通过command显式传入--host 0.0.0.0与对应端口确保容器外可访问。提示crewai_mcp.ipynb中配置 MCP 客户端端口时需与本仓库 docker-compose 的端口映射保持一致否则 Agent 无法发现工具。MCP Server 的传输层实现SSE Starlette所有服务共用同一套 SSE 传输实现。以 base-sdk/server.py 为例其核心逻辑如下使用mcp.server.Server创建 MCP 服务端实例工具定义则来自同目录tools.py中导出的mcpFastMCP实例所对应的底层_mcp_server使用SseServerTransport(/messages/)建立 SSE 双向通道客户端通过GET /sse建立事件流连接服务端通过POST /messages/接收客户端消息基于 Starlette 构建应用注册Route(/sse, ...)与Mount(/messages/, ...)两条路由入口通过argparse解析--host默认0.0.0.0与--port默认8080最终由uvicorn.run拉起服务。audio-index/server.py 在此基础之上额外添加了 CORS 中间件allow_origins[*]、allow_methods[*]、allow_headers[*]与--debug参数方便跨域客户端调试。由于四个服务的 server.py 高度同构这一套实现可以看作项目提供的通用 MCP SSE 服务模板。通用数据操作工具集base-sdkbase-sdk/tools.py 通过FastMCP(Pixeltable)暴露了 6 个通用工具覆盖表、视图、计算列、查询等数据面操作是理解其余模态服务的基础create_table建表含类型映射create_table(table_name, columns)接收列名字典并将字符串类型名映射为 Pixeltable 真实类型。源码中维护了一张显式映射表字符串类型名Pixeltable 类型arraypxt.Arrayaudiopxt.Audioboolpxt.Booldocumentpxt.Documentfloatpxt.Floatimagepxt.Imageintpxt.Intjsonpxt.Jsonrequiredpxt.Requiredstringpxt.Stringtimestamppxt.Timestampvideopxt.Video映射校验失败会返回合法的类型列表提示。建表使用pxt.create_table(..., if_existsreplace)并通过pxt.list_tables()校验结果。insert_data插入数据insert_data(table_name, data)接收字典列表形式的多行数据键需与表列名一一对应底层调用pxt.get_table(table_name)与table.insert(data)。表不存在时返回Table ... not found错误提示。add_computed_column添加计算列add_computed_column(table_name, column_name, expression)允许用字符串表达式定义派生列表达式通过table.column_name引用既有列例如add_computed_column(my_table, full_name, table.first_name table.last_name) add_computed_column(my_table, yoy_change, table.pop_2023 - table.pop_2022)实现上使用eval将表达式求值为 Pixeltable 列表达式再以 kwargs 形式调用table.add_computed_column(**kwargs)。create_view创建带过滤的视图create_view(view_name, table_name, filter_expr)基于既有表创建视图filter_expr支持类似 SQL 的过滤条件create_view(active_users, users, table.is_active True) create_view(adult_users, users, table.age 18)实现中将table.前缀替换为真实表名后eval再通过pxt.create_view(view_name, table.where(filter_condition))创建不传过滤表达式则直接基于整表创建。execute_query组合式查询execute_query(table_or_view_name, select_columns, where_expr, order_by_column, order_asc, limit)是通用查询入口支持依次叠加 where 过滤、order by 排序order_asc控制升降序、limit 截断与列选择select。查询对象可以是表或视图pxt.get_table取不到时回退pxt.get_view结果通过to_pandas().to_string()序列化为文本返回给 LLM例如execute_query(users, [name, email], table.age 25, name, True, 10)create_query命名查询create_query(query_name, table_name, query_function)通过动态拼接{table.name}.query装饰器的函数定义来注册可复用的命名查询create_query( get_active_users, users, return users.where(users.is_active True).select(users.name, users.email) )模态专用服务以音频索引为例的完整数据管道四个模态服务在base-sdk之上各自实现了初始化索引 → 插入媒体 → 语义查询的完整闭环工具命名高度一致。以 audio-index/tools.py 为例其暴露的 MCP 工具为setup_audio_index(table_name)创建音频索引insert_audio(table_name, audio_location)插入音频本地路径或 S3 URLquery_audio(table_name, query_text, top_n5)文本查询音频内容返回 Top-N 句级命中及相似度分数list_audio_tables()列出当前所有音频索引。setup_audio_index一条五级数据管道音频索引的建立过程完整展示了 Pixeltable 增量数据处理的能力核心流程如下建目录与主表pxt.create_dir(audio_index, if_existsignore)后创建主表audio_index.table_name模式为{audio_file: pxt.Audio}切分音频块基于AudioSplitter创建 chunks 视图默认参数为chunk_duration_sec30.0、overlap_sec2.0、min_chunk_duration_sec5.0语音转写通过pixeltable.functions.whisper对每个音频块调用whisper.transcribe(..., modelbase.en)结果写入计算列transcription句子级切分基于StringSplitterseparatorssentence将转写文本拆分为句子级视图嵌入索引使用 Hugging Face 的sentence_transformer默认模型intfloat/e5-large-v2对句子列text添加嵌入索引add_embedding_index。索引建立后对象会被缓存在进程级注册表audio_indexes中格式为{full_table_name: (audio_index, chunks_view, sentences_view)}服务重启后可通过pxt.get_table/pxt.get_view重新加载既有索引list_audio_tables也会自动加载未注册的表保证索引增量可持续。query_audio向量相似度检索查询时先通过sentences_view.text.similarity(query_text)计算查询与句子的相似度再按相似度降序取 Top-Nsim sentences_view.text.similarity(query_text) results (sentences_view.order_by(sim, ascFalse) .select(sentences_view.text, simsim, audio_filesentences_view.audio_file) .limit(top_n) .collect())结果按Score / Text / From audio的格式返回给调用方。其余模态服务同构但各具领域逻辑从工具函数清单可以看出另外三个服务采用完全一致的工具面image-index/tools.pysetup_image_index/insert_image/query_image/list_image_tablesvideo-index/tools.pysetup_video_index/insert_video/query_video/list_video_tablesdoc-index/tools.pysetup_document_index/insert_document/query_document/list_document_tables。它们各自使用对应的 Pixeltable 类型pxt.Video、pxt.Image、pxt.Document并选用合适的切分/嵌入/转写组件完成媒体 → 文本 → 向量索引的转换最终统一暴露setup/insert/query/list四类工具方便 Agent 以一致的方式调用。各目录还提供了test.py用于基础功能验证。用 CrewAI 编排多模态多智能体系统README 明确指出MCP Server 就绪后下一步是将 MCP Server 作为工具集成进 CrewAI——为每类 Specialist Agent 创建绑定各自 Pixeltable MCP Server 的 Crew再借助 CrewAI Flow 编排整套多模态系统完成音频/视频索引、语义图像搜索等复杂任务。完整代码与逐步说明见 crewai_mcp.ipynb。编排架构Notebook 中定义的PixeltableManagerFlow实现了如下架构User Query → Router Agent → Specialist Agent → Synthesis Agent → Final Result关键组件包括State Management使用 Pydantic 模型做类型安全的状态管理Intelligent RoutingRouter Agent 自动对查询分类决定交给哪个模态专家Specialist Agents每个媒体类型一个专属 AgentDocument / Image / Video / Audio通过各自 MCP Server 执行索引、插入或搜索Result SynthesisSynthesis Agent 对检索结果做最终润色。LLM 配置策略Notebook 中为三个角色分别配置了不同的 LLMRouter LLM供路由 Agent 做查询分类Agent LLM供 Specialist Agent 执行任务Response LLM用于生成最终用户回复。项目强调部分 Agent 使用 OpenAI LLM 是为了获得更好的输出质量演示重点在于 Pixeltable 统一存储 MCP Server 本身以及如何将其连接到读者自己基于 CrewAI 构建的 Agent 上。实测示例视频索引的创建与语义检索Notebook 给出了两个可直接运行的查询示例视频索引创建与插入Insert this video with URL as, https://github.com/user-attachments/assets/edf6c7f1-8888-4a01-ab7a-f608302fcd03 to video index baby_videos.——Router 会将其分类为视频操作交给 Video Specialist 完成索引创建与视频插入视频语义搜索Whats the name of the younger kid shown in this video stored in video index baby_videos?——Router 将查询路由到 Video Specialist由其调用query_video完成帧级内容检索并返回答案。流程会自动完成查询分类 → 路由到专家 → 执行 Pixeltable 操作 → 合成用户友好回复。Notebook 还提供了执行轨迹展示Router Decision、Specialist Execution、Tool Interactions、Final Synthesis方便调试与分析。常见问题与扩展建议端口映射一致性docker-compose 中音频/视频/图像/文档依次占用 8080/8081/8082/8083在 Agent 侧配置 MCP 客户端 URLhttp://host:port/sse时必须与之对应。本地模型的可用性Router 与 Synthesis 依赖 Ollama 本地模型如gemma3首次调用前请确认ollama pull gemma3已完成且服务运行中追求更高质量输出时可按 Notebook 说明为部分 Agent 切换 OpenAI LLM。索引持久化索引数据通过 docker volume 挂载到宿主机目录服务重建--build后索引依然可被setup_*_index/list_*_tables自动加载实现增量扩展。接入自有 Agent四个 MCP Server 是标准 SSE 服务任何支持 MCP 客户端的框架CrewAI 之外亦可都能通过http://host:port/sse发现并使用其中的工具无需改动服务端代码。总结pixeltable-mcp用一套统一存储层 模态专用 MCP 服务 CrewAI 编排的组合拳示范了如何把音频转写、视频/图像/文档的索引与语义检索沉淀为可复用的 Agent 工具base-sdk提供通用表/视图/查询操作四个模态服务把各自领域的数据管道切分、转写、嵌入、相似度检索封装成setup/insert/query/list四件套而crewai_mcp.ipynb则展示了 Router → Specialist → Synthesis 的完整编排闭环。无论是把单模态 MCP Server 接入自有 Agent还是按此模式扩展新的模态类型例如 3D 点云、时间序列这套架构都提供了清晰的参考路径。如果你在搭建多模态 Agent 应用不妨以本项目为起点复用其 SSE 服务模板与数据管道设计。【免费下载链接】ai-engineering-hubIn-depth tutorials on LLMs, RAGs and real-world AI agent applications.项目地址: https://gitcode.com/GitHub_Trending/ai/ai-engineering-hub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表