К основному содержанию
скилл CX Codex

rag-infrastructure — скилл для Claude Code: RAG-инфраструктура

Скилл для сборки RAG-конвейера: загрузка документов, эмбеддинги, векторное хранилище, гибридный поиск и ответы LLM по найденному контексту.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add BagelHole/DevOps-Security-Agent-Skills --skill rag-infrastructure -a claude-code
Открыть на GitHub

Что делает rag-infrastructure

Скилл описывает полный путь от документов до ответа: чанкер режет текст, модель считает эмбеддинги, векторная база хранит их, а на запрос пользователя срабатывает поиск, реранкер и генерация. Внутри — готовые примеры на Python: SentenceTransformer для локальных эмбеддингов, QdrantClient для коллекций, RecursiveCharacterTextSplitter и MarkdownHeaderTextSplitter для нарезки, fastembed для разреженных векторов BM25, слияние результатов через Reciprocal Rank Fusion.

Реранкинг показан в двух вариантах: через Cohere API с ключом или локальным CrossEncoder, который не тратит деньги на запросы. Для развёртывания приложен docker-compose со стеком из Qdrant, Redis, воркера загрузки и API.

Заранее понадобятся Python 3.10+ с pip, векторная база (Qdrant, Weaviate, Pinecone или pgvector), модель эмбеддингов и эндпоинт LLM. Docker нужен, если поднимаете векторную базу локально. Без ключа Cohere остаётся только локальный реранкер — это повод выбрать его сразу, если не хотите зависеть от внешнего API.

Какие задачи решает

  • построить Q&A по внутренним документам
  • снизить галлюцинации LLM, подкладывая найденный контекст
  • настроить семантический поиск по большому корпусу
  • собрать гибридный поиск из плотных и разреженных векторов
  • развернуть стек векторной базы и воркера загрузки в Docker

Примеры запросов агенту

  • Помоги настроить пайплайн загрузки документов в Qdrant по этому скиллу
  • Собери гибридный поиск с BM25 и RRF для базы знаний
  • Добавь локальный реранкер на CrossEncoder в RAG-запрос

Как установить rag-infrastructure

1Через Skills CLI (Vercel)

npx skills add BagelHole/DevOps-Security-Agent-Skills --skill rag-infrastructure -a claude-code

2Вручную: положить файлы

~/.claude/skills/rag-infrastructure/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/rag-infrastructure/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора127

block-storage Скилл для работы с блочными устройствами: разметка дисков, LVM, файловые системы, снапшоты и тома AWS EBS. Пригодится, когда нужно расширить раздел на живом сервере. CX Codex +1 327установок pci-dss-compliance Скилл помогает разложить требования PCI DSS v4.0 по вашему проекту: выбрать SAQ, очертить CDE и настроить контроль доступа. CX Codex +1 327установок cloudflare-zero-trust Скилл помогает закрыть внутренние сервисы через Cloudflare Zero Trust без VPN. Настраивает туннели cloudflared, политики доступа по IdP и проверки устройств. CX Codex +1 325установок ai-pipeline-orchestration Скилл помогает агенту собирать пайплайны для загрузки данных, обучения моделей, батч-инференса и индексации RAG на Prefect, Airflow или Dagster. CX Codex +1 325установок cdn-setup Скилл помогает настроить CDN через CloudFront и Cloudflare: раздавать статику, защищать трафик по TLS и сбрасывать кеш. Пригодится при публикации сайтов и API. CX Codex +1 324установок azure-devops Скилл помогает агенту писать и править YAML-пайплайны Azure DevOps: сборка, тесты, деплой в Azure. Пригодится, если CI/CD живёт в Azure Pipelines. CX Codex +1 325установок circleci Помогает настроить пайплайны CI/CD для CircleCI в файле .circleci/config.yml. Пригодится для сборки, тестов, кэширования и развёртывания проектов. CX Codex +1 323установок gcp-audit-logs Скилл помогает настроить Cloud Audit Logs в GCP: включить логи доступа, выгрузить их в BigQuery и разобрать подозрительные события. CX Codex +1 324установок

Похожие

langchain-rag langchain-ai Даёт ИИ-агенту готовые шаблоны и код для сборки RAG-пайплайнов на LangChain в Python и TypeScript: от загрузки документов до векторного поиска. CX Codex +1 17 500установок qdrant-search-quality qdrant Скилл разбирает, почему поиск в Qdrant выдаёт мусор, и подсказывает, что чинить: модель эмбеддингов, данные или конфиг. CX Codex +1 1 800установок rag-architect https://github.com/Jeffallan Проектирует RAG-системы: разбивает документы на чанки, генерирует эмбеддинги, настраивает векторные базы, строит гибридный поиск и оценивает качество извлечения контекста. CX Codex +1 4 700установок rag giuseppe-trisciuoglio Скилл помогает развернуть пайплайн Retrieval-Augmented Generation: от нарезки документов и расчёта эмбеддингов до поиска в векторной базе и передачи контекста модели. CX Codex +1 3 700установок rag-engineer sickn33 Скилл для проектирования систем поиска и генерации с векторными базами данных. Помогает настроить чанкинг, выбрать embedding-модели и оптимизировать качество поиска перед тем, как результаты попадут в LLM. CX Codex +1 1 000установок pinecone-rag официальный github Скилл помогает строить RAG-системы и память агента на Pinecone. Подойдёт для семантического поиска по документам и хранения контекста между сессиями. 24установок

Рядом в теме «ИИ и ML»

Всё по теме «ИИ и ML» →

Вопросы о rag-infrastructure

Как установить rag-infrastructure в Claude?

Выполните npx skills add BagelHole/DevOps-Security-Agent-Skills --skill rag-infrastructure -a claude-code. Скилл окажется в ~/.claude/skills/rag-infrastructure/SKILL.md.

Что делает rag-infrastructure?

Собирает и обслуживает RAG-инфраструктуру: загрузку документов, нарезку на чанки, генерацию эмбеддингов, хранение в векторной базе, гибридный поиск, реранкинг и выдачу ответов LLM по контексту.

Какие зависимости нужны для работы скилла?

Python 3.10+ с pip, векторная база на выбор (Qdrant, Weaviate, Pinecone или pgvector), модель эмбеддингов и эндпоинт LLM. Docker пригодится для локального развёртывания векторной базы.

Исходный текст

SKILL.md · MIT
---
name: rag-infrastructure
description: Build and operate Retrieval-Augmented Generation (RAG) infrastructure with vector stores, embedding pipelines, and hybrid search. Covers ingestion, chunking strategies, reranking, and production deployment patterns.
license: MIT
metadata:
  author: devops-skills
  version: "1.0"
---

# RAG Infrastructure

Production infrastructure for Retrieval-Augmented Generation: ingest documents, generate embeddings, store in vector databases, and serve grounded LLM responses.

## When to Use This Skill

Use this skill when:
- Building a knowledge base Q&A system over internal documents
- Implementing semantic search over large document collections
- Reducing LLM hallucinations with retrieved context
- Setting up embedding pipelines and vector store infrastructure
- Deploying hybrid search (dense + sparse/BM25)

## Prerequisites

- Python 3.10+ with `pip`
- A vector database (Qdrant, Weaviate, Pinecone, or pgvector)
- An embedding model (OpenAI, Cohere, or local via `sentence-transformers`)
- An LLM endpoint (OpenAI API or self-hosted vLLM)
- Docker for local vector DB deployment

## Architecture Overview

```
Documents → Chunker → Embedder → Vector Store
                                      ↓
User Query → Embedder → Vector Store (search) → Reranker → LLM → Answer
```

## Embedding Pipeline

```python
from sentence_transformers import SentenceTransformer
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
import uuid

# Local embedding model (no API cost)
model = SentenceTransformer("BAAI/bge-large-en-v1.5")

# Connect to Qdrant
client = QdrantClient("http://localhost:6333")

# Create collection
client.create_collection(
    collection_name="knowledge-base",
    vectors_config=VectorParams(size=1024, distance=Distance.COSINE),
)

def ingest_documents(docs: list[dict]):
    """Chunk, embed, and upsert documents."""
    points = []
    for doc in docs:
        chunks = chunk_text(doc["text"], chunk_size=512, overlap=50)
        embeddings = model.encode(chunks, batch_size=32, show_progress_bar=True)
        for chunk, embedding in zip(chunks, embeddings):
            points.append(PointStruct(
                id=str(uuid.uuid4()),
                vector=embedding.tolist(),
                payload={"text": chunk, "source": doc["source"], "title": doc["title"]},
            ))
    client.upsert(collection_name="knowledge-base", points=points)
    print(f"Ingested {len(points)} chunks")
```

## Chunking Strategies

```python
from langchain.text_splitter import RecursiveCharacterTextSplitter

def chunk_text(text: str, chunk_size: int = 512, overlap: int = 50) -> list[str]:
    """Recursive character splitter — best general-purpose strategy."""
    splitter = RecursiveCharacterTextSplitter(
        chunk_size=chunk_size,
        chunk_overlap=overlap,
        separators=["\n\n", "\n", ". ", " ", ""],
    )
    return splitter.split_text(text)

# For code/markdown — use language-aware splitter
from langchain.text_splitter import MarkdownHeaderTextSplitter

headers = [("#", "H1"), ("##", "H2"), ("###", "H3")]
md_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers)
```

## Hybrid Search (Dense + Sparse)

```python
from qdrant_client.models import SparseVector, SparseVectorParams, NamedSparseVector
from fastembed import SparseTextEmbedding

# Qdrant hybrid collection (dense + BM25 sparse)
client.create_collection(
    collection_name="hybrid-kb",
    vectors_config={"dense": VectorParams(size=1024, distance=Distance.COSINE)},
    sparse_vectors_config={"sparse": SparseVectorParams()},
)

sparse_model = SparseTextEmbedding("prithivida/Splade_PP_en_v1")

def hybrid_search(query: str, top_k: int = 10) -> list[dict]:
    dense_vec = model.encode(query).tolist()
    sparse_vec = list(sparse_model.embed(query))[0]

    results = client.query_points(
        collection_name="hybrid-kb",
        prefetch=[
            {"query": dense_vec, "using": "dense", "limit": 20},
            {"query": SparseVector(indices=sparse_vec.indices.tolist(),
                                   values=sparse_vec.values.tolist()),
             "using": "sparse", "limit": 20},
        ],
        query={"fusion": "rrf"},   # Reciprocal Rank Fusion
        limit=top_k,
    )
    return [{"text": p.payload["text"], "score": p.score} for p in results.points]
```

## Reranking

```python
import cohere

co = cohere.Client("your-api-key")

def rerank(query: str, candidates: list[str], top_n: int = 5) -> list[str]:
    """Rerank retrieved chunks for relevance (improves RAG quality ~20-30%)."""
    response = co.rerank(
        model="rerank-english-v3.0",
        query=query,
        documents=candidates,
        top_n=top_n,
    )
    return [candidates[r.index] for r in response.results]

# Alternative: local reranker (no API cost)
from sentence_transformers import CrossEncoder
reranker = CrossEncoder("cross-encoder/ms-marco-MiniLM-L-6-v2")

def local_rerank(query: str, candidates: list[str], top_n: int = 5) -> list[str]:
    pairs = [[query, c] for c in candidates]
    scores = reranker.predict(pairs)
    ranked = sorted(zip(candidates, scores), key=lambda x: x[1], reverse=True)
    return [text for text, _ in ranked[:top_n]]
```

## RAG Query Pipeline

```python
from openai import OpenAI

llm = OpenAI(base_url="http://localhost:8000/v1", api_key="your-key")

def rag_query(user_question: str) -> str:
    # 1. Retrieve
    candidates = hybrid_search(user_question, top_k=20)
    texts = [c["text"] for c in candidates]

    # 2. Rerank
    top_chunks = local_rerank(user_question, texts, top_n=5)

    # 3. Generate
    context = "\n\n---\n\n".join(top_chunks)
    response = llm.chat.completions.create(
        model="meta-llama/Llama-3.1-8B-Instruct",
        messages=[
            {"role": "system", "content": (
                "Answer the question using only the provided context. "
                "If the answer isn't in the context, say so.\n\nContext:\n" + context
            )},
            {"role": "user", "content": user_question},
        ],
        temperature=0.1,
        max_tokens=1024,
    )
    return response.choices[0].message.content
```

## Docker Compose: Full RAG Stack

```yaml
services:
  qdrant:
    image: qdrant/qdrant:latest
    volumes:
      - qdrant-data:/qdrant/storage
    ports:
      - "6333:6333"
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    volumes:
      - redis-data:/data
    restart: unless-stopped

  ingestion-worker:
    build: ./ingestion
    environment:
      - QDRANT_URL=http://qdrant:6333
      - REDIS_URL=redis://redis:6379
    depends_on: [qdrant, redis]
    restart: unless-stopped

  rag-api:
    build: ./api
    ports:
      - "8080:8080"
    environment:
      - QDRANT_URL=http://qdrant:6333
      - LLM_BASE_URL=http://vllm:8000/v1
    depends_on: [qdrant]
    restart: unless-stopped

volumes:
  qdrant-data:
  redis-data:
```

## Common Issues

| Issue | Cause | Fix |
|-------|-------|-----|
| Poor retrieval quality | Chunk size too large | Try 256–512 tokens; overlap 10–15% |
| LLM ignores retrieved context | Context too long | Rerank and keep top 3–5 chunks |
| Slow ingestion | Sequential embedding | Use `batch_size=64` and async upserts |
| Stale documents | No re-ingestion pipeline | Track `doc_hash`; re-embed on change |
| High embedding costs | All chunks re-embedded | Cache embeddings with hash-based dedup |

## Best Practices

- Use `BAAI/bge-large-en-v1.5` or `nomic-embed-text` for strong free embeddings.
- Always rerank before passing to LLM — 5 precise chunks beat 20 noisy ones.
- Store source metadata (URL, page, section) in vector payloads for citations.
- Use namespace/tenant isolation in the vector store for multi-tenant RAG.
- Evaluate with RAGAS metrics: faithfulness, answer relevancy, context precision.

## Related Skills

- [vector-database-ops](../../databases/vector-database-ops/) - Qdrant/Weaviate management
- [vllm-server](../vllm-server/) - Self-hosted LLM endpoint
- [ollama-stack](../ollama-stack/) - Local LLM for development
- [ai-pipeline-orchestration](../../../devops/ai/ai-pipeline-orchestration/) - Ingestion pipelines

© devops-skills · MIT · BagelHole/DevOps-Security-Agent-Skills

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой