Skill Seekers × Pinecone:将文档技能向量化并构建语义检索的完整实战指南 人工智能AI 应用AI 技能RAGMCP 服务网页爬虫【免费下载链接】Skill_SeekersConvert documentation websites, GitHub repositories, and PDFs into Claude AI skills with automatic conflict detection项目地址https://gitcode.com/gh_mirrors/sk/Skill_Seekers点击查看免费下载Skill Seekers 能够将文档网站、GitHub 仓库与 PDF 自动转化为可复用的 AI 技能Skill而本指南聚焦这条链路的下游环节把 Skill Seekers 生成的 LangChain 格式文档向量化批量 Upsert 进 Pinecone Serverless 索引并基于向量相似度完成语义检索。通过阅读本文你将掌握从生成文档、构建 OpenAI 嵌入、批量写入 Pinecone 到交互式语义查询的完整可运行方案并理解examples/pinecone-upsert/示例的每一行代码背后的设计意图。示例整体流程概览examples/pinecone-upsert/目录下的示例演示了一条端到端的 RAG检索增强生成数据链路核心动作如下创建一个 Pinecone Serverless 索引cosine距离、aws云、us-east-1区域、默认 1536 维加载Skill Seekers 生成的 LangChain 格式文档JSON 数组含page_content与metadata生成文档嵌入向量OpenAItext-embedding-ada-002批量 Upsert文档到 Pinecone并携带结构化元数据来源、分类、文件、类型演示语义搜索能力按向量相似度召回可按分类过滤提供交互式搜索模式在终端实时输入问题并获得结果。该示例由三个文件组成见 examples/pinecone-upsert/quickstart.py—— 完整可运行的示例脚本README.md—— 使用说明即本文的原始依据requirements.txt—— Python 依赖声明。环境准备与前置条件安装依赖requirements.txt中声明的核心依赖只有两个详见 examples/pinecone-upsert/requirements.txtpip install pinecone-client openai其中pinecone-client3.0.0用于连接 Pinecone 向量数据库openai1.12.0用于调用 OpenAI 嵌入接口。文件注释中还给出了可选的替代嵌入方案cohereCohere 嵌入与sentence-transformers本地嵌入模型。配置 API Key脚本运行前必须导出两个环境变量否则main()会在启动时直接退出并给出提示export PINECONE_API_KEYyour-pinecone-api-key export OPENAI_API_KEYsk-...从源码看quickstart.py 在main()的第 266-276 行会先检查这两个变量是否存在缺少任何一个都会打印❌ PINECONE_API_KEY not set或❌ OPENAI_API_KEY not set并提前返回避免在缺失凭证时浪费 API 调用。第一步用 Skill Seekers 生成 LangChain 格式文档Pinecone 示例消费的数据是 Skill Seekers 通过package命令输出的 LangChain 格式 JSON。README 给出了两种来源# 方式一使用预设配置如 Django skill-seekers create --config configs/django.json skill-seekers package output/django --target langchain # 方式二从 GitHub 仓库生成 skill-seekers create --repo django/django --name django skill-seekers package output/django --target langchain # 输出output/django-langchain.jsonLangChain 格式的数据结构从源码结构看LangChain 格式由 src/skill_seekers/cli/adaptors/langchain.py 中的LangChainAdaptor生成其format_skill_md()将SKILL.md与references/*.md全部转换为如下 JSON 数组{ page_content: ..., metadata: { source: django, category: overview, file: SKILL.md, type: documentation, version: 1.0.0, doc_version: } }几个值得注意的细节SKILL.md作为总览主文档的category固定为overview、type为documentation参考文件按文件名归类references/下每个.md文件的category由其文件名推导_替换为空格并转小写type为reference输出路径自动命名package()通过_format_output_path()自动追加-langchain.json后缀保证产物命名一致不支持直接上传该格式面向代码内导入而非平台上传upload()会返回一段示例代码指导你将 JSON 转为langchain.schema.Document后灌入任意向量库。RAG 平台自动开启分块package命令针对 RAG 平台会自动启用智能分块。在 src/skill_seekers/cli/package_skill.py 中RAG_PLATFORMS列表内的目标包含langchain与pinecone在未显式指定--chunk-for-rag时会被自动置为开启而分块参数取自 src/skill_seekers/cli/defaults.json 中的rag配置段rag: { chunk_for_rag: false, chunk_tokens: 512, chunk_overlap_tokens: 50, preserve_code_blocks: true, preserve_paragraphs: true }即默认每块最多 512 token、块间重叠 50 token、保留代码块与段落结构。分块逻辑由 base.py 的_maybe_chunk_content()与rag_chunker.py的RAGChunker共同完成先按“约 4 字符 ≈ 1 token”估算长度超过阈值才真正切分并给每块追加is_chunked: true与chunk_id元数据。第二步运行示例脚本cd examples/pinecone-upsert python quickstart.py脚本的执行流分为五个阶段由main()见 quickstart.py 第 252-335 行串联Step 1 创建索引调用create_index()若索引skill-seekers-demo不存在则创建并轮询等待就绪否则复用现有索引Step 2 加载文档读取DOCS_PATH指向的 JSON统计文档总数并打印分类分布Step 3 批量 Upsert对每篇文档生成嵌入向量按 100 条一批写入结束后通过describe_index_stats()校验向量总数Step 4 示例查询依次执行 3 个内置示例问题Django model / views / ORM打印得分与命中片段Step 5 交互式搜索进入interactive_search()终端循环输入quit/exit/q退出。脚本末尾还做了两处兜底KeyboardInterrupt会优雅打印告别信息其他异常会打印错误并提示检查 API Key 与依赖安装。核心函数逐段解析create_index创建 Serverless 索引def create_index(pc: Pinecone, index_name: str, dimension: int 1536) - None: if index_name not in pc.list_indexes().names(): pc.create_index( nameindex_name, dimensiondimension, metriccosine, specServerlessSpec(cloudaws, regionus-east-1) ) while not pc.describe_index(index_name).status[ready]: time.sleep(1)要点幂等设计索引已存在时仅打印提示不会重复创建因此脚本可反复执行等待就绪Serverless 索引创建后并非立即可用脚本用轮询status[ready]的方式阻塞等待避免后续 upsert 报错1536 维与 OpenAItext-embedding-ada-002的向量维度严格对应更换嵌入模型时必须同步修改。load_documents加载并统计分类with open(json_path) as f: documents json.load(f) categories {} for doc in documents: cat doc[metadata].get(category, unknown) categories[cat] categories.get(cat, 0) 1category缺失时回退为unknown保证统计逻辑对任意来源的 JSON 都健壮打印时按分类名排序便于快速核对产物是否完整。batch_upsert嵌入生成与批量写入for i, doc in enumerate(documents): response openai_client.embeddings.create( modeltext-embedding-ada-002, inputdoc[page_content] ) embedding response.data[0].embedding vectors.append({ id: fdoc_{i}, values: embedding, metadata: { text: doc[page_content][:1000], source: doc[metadata][source], category: doc[metadata][category], file: doc[metadata][file], type: doc[metadata][type] } }) if len(vectors) batch_size: index.upsert(vectorsvectors) vectors []设计要点元数据中携带原文片段text字段截取前 1000 字符存入 metadata查询时无需回源即可直接展示命中内容这与仓库内置PineconeAdaptor的做法一致——src/skill_seekers/cli/adaptors/pinecone_adaptor.py 中定义了PINECONE_METADATA_BYTES_LIMIT 40_000Pinecone 单向量 metadata 上限 40KB并通过_truncate_text_for_metadata()预留约 2KB 给其他字段、按 UTF-8 字节边界安全截断批量阈值触发写入len(vectors) batch_size时落盘并清空累积列表循环结束后处理剩余向量避免尾批丢失写入后校验describe_index_stats()返回total_vector_count与预期文档数对比即可确认无遗漏。semantic_search向量化查询与分类过滤def semantic_search(index, openai_client, query, top_k5, categoryNone): response openai_client.embeddings.create( modeltext-embedding-ada-002, inputquery ) query_embedding response.data[0].embedding filter_dict None if category: filter_dict {category: {$eq: category}} results index.query( vectorquery_embedding, top_ktop_k, include_metadataTrue, filterfilter_dict ) return results[matches]查询时必须使用与写入时相同的嵌入模型否则向量空间不一致会导致召回结果失真。filter支持按元数据精确过滤例如只检索models分类实现“分类限定的语义检索”。interactive_search终端交互模式while True: user_input input(Query: ).strip() if user_input.lower() in [quit, exit, q]: break matches semantic_search(indexindex, openai_clientopenai_client, queryuser_input, top_k3) elapsed time.time() - start print(f Found {len(matches)} results ({elapsed*1000:.2f}ms))每次查询会显示耗时毫秒、相似度得分、分类、文件名与命中片段并捕获异常打印❌ Error方便在真实文档集上即时验证检索效果。预期输出解读README 给出了脚本运行后的典型输出节选PINECONE UPSERT QUICKSTART Step 1: Creating Pinecone index... ✅ Index created: skill-seekers-demo Step 2: Loading documents... ✅ Loaded 180 documents Categories: {api: 38, guides: 45, models: 42, overview: 1, ...} Step 3: Upserting to Pinecone... Upserting 180 documents... Batch size: 100 Upserted 100/180 documents... Upserted 180/180 documents... ✅ Upserted all documents to Pinecone Total vectors in index: 180 QUERY: How do I create a Django model? ------------------------------------------------------------ Score: 0.892 Category: models Text: Django models are Python classes that define the structure...解读要点文档数量180取决于生成阶段的分块粒度——默认 512 token/块意味着长文档会被拆成多条向量记录因此“文档数”实际是“向量块数”分类分布直接来自 LangChain 包的metadata.category可作为后续按分类过滤的索引依据得分Score为余弦相似度越接近 1 相关性越高用于排序输出。定制化选项修改索引名INDEX_NAME my-custom-index # quickstart.py 中 main() 的配置处调整批大小batch_upsert(index, openai_client, documents, batch_size50)Pinecone 官方推荐单批不超过 100 条向量当遇到限流或超时错误时调低到 50 或 25 并增加批次间延时是常用的缓解手段。按分类过滤查询matches semantic_search( indexindex, openai_clientopenai_client, queryyour query, categorymodels # 仅在 models 分类内检索 )更换嵌入模型# 在 create_embeddings() 中替换模型 response openai_client.embeddings.create( modeltext-embedding-3-small, # 更便宜、维度更小 inputtexts ) # 同步更新索引维度为 1536text-embedding-3-small 的维度 create_index(pc, INDEX_NAME, dimension1536)注意text-embedding-ada-002与text-embedding-3-small均为 1536 维因此更换后维度可保持一致但若改用text-embedding-3-large3072 维或 sentence-transformers 的all-MiniLM-L6-v2384 维必须重建索引。仓库内置的PineconeAdaptor.upload()在 pinecone_adaptor.py 中维护了一张EMBEDDING_DIMENSIONS映射表openai → 1536sentence-transformers → 384并在创建索引前先生成嵌入、按实际模型自动探测维度可作参考。高级用法加载已有索引直接查询from pinecone import Pinecone pc Pinecone(api_keyyour-api-key) index pc.Index(skill-seekers-demo) results index.query( vectorquery_embedding, top_k5, include_metadataTrue )数据一旦写入便持久化存储后续进程无需重新生成与 upsert直接以查询向量命中即可。更新已有文档# 使用相同 ID 再次 upsert 即为更新 index.upsert(vectors[{ id: doc_123, values: new_embedding, metadata: updated_metadata }])Pinecone 对同一 ID 的重复 upsert 采用覆盖语义适合文档内容迭代后的增量刷新。删除文档# 按 ID 删除 index.delete(ids[doc_123, doc_456]) # 按元数据过滤删除 index.delete(filter{category: {$eq: deprecated}}) # 清空整个索引namespace 维度 index.delete(delete_allTrue)使用 Namespace 隔离# 写入指定 namespace index.upsert(vectorsvectors, namespaceproduction) # 只查询该 namespace results index.query( vectorquery_embedding, namespaceproduction, top_k5 )Namespace 是实现多租户或环境隔离如dev/staging/production的官方手段。仓库内置的PineconeAdaptor也内置了 namespace 支持format_skill_md()输出的 JSON 包含index_name、namespace、dimension、metric与vectors五个顶层字段namespace默认取技能名的小写下划线转连字符形式。与仓库内置 PineconeAdaptor 的关联本示例是“手写客户端代码”的教学路径而仓库同时提供了一条更自动化的通道直接执行skill-seekers package output/django --target pinecone即可由PineconeAdaptor生成带index_name/namespace/dimension/metric/vectors的 JSON 包再配合upload()见 pinecone_adaptor.py 的upload方法可自动完成“生成嵌入 → 创建索引 → 每 100 条一批 upsert”的全过程。两者对比维度本示例 quickstart.py内置 PineconeAdaptor嵌入模型text-embedding-ada-002openaitext-embedding-3-small或 sentence-transformers向量 ID序号doc_{i}内容元数据的 MD5 确定性 ID_generate_deterministic_id元数据截断固定截取 1000 字符按 40KB 上限动态截断并预留 2KB 余量批量大小可配置默认 100固定 100Namespace手动指定随 JSON 包携带upload 时透传前端分块由 package 阶段决定同样支持chunk_max_tokens等参数两条路径共享同一份 LangChain/Pinecone JSON 数据模型可以按需混用。故障排查指南“Index already exists”属正常提示脚本幂等设计已存在的索引会被直接复用不影响后续 upsert。“PINECONE_API_KEY not set”前往 Pinecone 控制台获取 API Key然后执行export PINECONE_API_KEYyour-key。“OPENAI_API_KEY not set”前往 OpenAI 平台创建 API Key然后执行export OPENAI_API_KEYsk-...。“Documents not found”确认已按“生成文档”一节先执行skill-seekers create与package --target langchain检查quickstart.py中的DOCS_PATH默认../../output/django-langchain.json是否与你的输出位置一致。“Rate limit exceeded”触发 OpenAI 或 Pinecone 限流将batch_size降为 50 或 25并在批次之间增加延时例如time.sleep。成本评估README 给出的参考估算以 1000 篇文档为例嵌入生成约 $0.01OpenAIada-002存储约 $0.03/月Pinecone Serverless 按用量计费查询约 $0.025 / 10 万次查询。首月合计约 $0.04 查询费用。以上为 README 提供的数量级参考实际费用取决于嵌入模型单价、向量维度、索引副本数与查询量请以对应服务商的实时计价为准。相关示例本示例属于 Skill Seekers 的 RAG 向量化示例家族可对照阅读LangChain RAG Pipeline 示例LlamaIndex Query Engine 示例它们分别展示了同一份 Skill Seekers 文档如何在 LangChain 检索管线与 LlamaIndex 查询引擎中使用与 Pinecone 示例共同覆盖了“文档 → 嵌入 → 向量库 → 语义检索”的主流落地路径。赞分享人工智能AI 应用AI 技能RAGMCP 服务网页爬虫【免费下载链接】Skill_SeekersConvert documentation websites, GitHub repositories, and PDFs into Claude AI skills with automatic conflict detection项目地址https://gitcode.com/gh_mirrors/sk/Skill_Seekers点击查看免费下载相关推荐Skill Seekers Pinecone 实战指南把文档技能库一键转化为可检索的向量知识库Skill Seekers Pinecone 实战指南把文档技能库一键转化为可检索的向量知识库 导读 本指南讲解如何将 Skill Seekers 从各类人工智能AI 应用AI 技能RAGMCP 服务网页爬虫Skill Seekers × FAISS 实战将文档网站与代码库技能包构建为大规模语义检索索引Skill Seekers × FAISS 实战将文档网站与代码库技能包构建为大规模语义检索索引 导读 FAISSFacebook AI Similarit人工智能AI 应用AI 技能RAGMCP 服务网页爬虫Skill Seekers 实战使用 Qdrant 构建可过滤的向量检索技能包Skill Seekers 实战使用 Qdrant 构建可过滤的向量检索技能包 导读 本文围绕 Skill Seekers 仓库中的 Qdrant 向量数据库人工智能AI 应用AI 技能RAGMCP 服务网页爬虫创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考