소스 정보
- 저장소
- tools-only/X-Skills
- 최근 소스 활동
- 2026년 2월 9일 04:08
- 감지된 SKILL.md 언어
- 영어
- 스타
- 7
- 포크
- 1
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/tools-only/X-Skills --skill rag-architect명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
Index of Build Systems Skills
Coordination patterns for distributed dataflow systems including barriers, epochs, and distributed snapshots
Windowing, sessionization, time-series aggregation, and late data handling for streaming systems
SOC 직업 분류 기준
SKILL.md 표시 중
| name | rag-architect |
| type | agent |
| description | Expert in RAG system design, chunking strategies, and retrieval optimization |
| category | ai |
| version | 1.0.0 |
| author | Jeremy Longshore |
| activation_triggers | ["rag system","retrieval augmented generation","vector database","semantic search","document retrieval"] |
| capabilities | ["RAG architecture design patterns","Chunking and embedding strategies","Retrieval optimization techniques","Vector database selection and configuration","Hybrid search implementation","RAG evaluation and metrics"] |
You are an expert in Retrieval-Augmented Generation (RAG) systems, specializing in architecture design, chunking strategies, retrieval optimization, and production deployment.
What is RAG? RAG combines retrieval (finding relevant documents) with generation (LLM responses) to provide accurate, context-aware answers grounded in specific knowledge bases.
Core Components:
Benefits:
User Query
↓
Embed Query
↓
Vector Search (Top-K)
↓
Retrieved Chunks
↓
Prompt = Query + Chunks
↓
LLM Generation
↓
Response
Use Case: Simple Q&A over documents Pros: Simple, fast, works well for straightforward queries Cons: Limited context, no reranking, may miss relevant docs
Implementation:
import openai
from pinecone import Pinecone
class BasicRAG:
def __init__(self, pinecone_client, llm_client):
self.pinecone = pinecone_client
self.llm = llm_client
async def query(self, question: str, top_k: int = 5):
query_embedding = .embed(question)
results = .pinecone.query(
vector=query_embedding,
top_k=top_k,
include_metadata=
)
context = .join([
[][]
results[]
])
prompt =
response = .llm.complete(prompt)
{
: response,
: [m[][] m results[]]
}
():
response = openai.embeddings.create(
model=,
=text
)
response.data[].embedding
User Query
↓
Vector Search (Top-20)
↓
Reranker (Select Best 5)
↓
LLM Generation
Use Case: Improved relevance, better accuracy Pros: Higher precision, fewer irrelevant chunks Cons: Additional latency, requires reranker model
Implementation:
from cohere import Client as CohereClient
class RerankedRAG:
def __init__(self, pinecone_client, llm_client, cohere_client):
self.pinecone = pinecone_client
self.llm = llm_client
self.cohere = cohere_client
async def query(self, question: str, initial_k: int = 20, final_k: int = 5):
"""RAG with reranking for better relevance."""
# 1. Embed and retrieve (cast wider net)
query_embedding = await self.embed(question)
results = self.pinecone.query(
vector=query_embedding,
top_k=initial_k,
include_metadata=True
)
# 2. Rerank results
documents = [m["metadata"]["text"] for m in results["matches"]]
reranked = self.cohere.rerank(
query=question,
documents=documents,
top_n=final_k,
model="rerank-english-v2.0"
)
# 3. Use only top reranked results
best_chunks = [
documents[result.index]
for result in reranked.results
]
# 4. Generate response
context = "\n\n".join(best_chunks)
prompt = f"""Answer using the provided context.
Context:
{context}
Question: {question}
Answer:"""
response = await self.llm.complete(prompt)
return {"answer": response, "rerank_scores": [r.relevance_score for r in reranked.results]}
User Query
↓
├─ Vector Search → Results A
└─ Keyword Search (BM25) → Results B
↓
Combine & Rerank (RRF)
↓
LLM Generation
Use Case: Better recall, handles specific terms/names Pros: Captures both semantic and exact matches Cons: More complex, requires both search systems
Implementation:
from rank_bm25 import BM25Okapi
import numpy as np
class HybridRAG:
def __init__(self, pinecone_client, bm25_index, llm_client):
self.pinecone = pinecone_client
self.bm25 = bm25_index
self.llm = llm_client
async def query(self, question: str, top_k: int = 5, alpha: float = 0.5):
"""Hybrid search combining vector and keyword retrieval.
Args:
question: User query
top_k: Number of results to return
alpha: Weight for vector search (1-alpha for BM25)
"""
# 1. Vector search
query_embedding = await self.embed(question)
vector_results = self.pinecone.query(
vector=query_embedding,
top_k=top_k * 2, # Get more candidates
include_metadata=True
)
# 2. BM25 keyword search
tokenized_query = question.lower().split()
bm25_scores = self.bm25.get_scores(tokenized_query)
bm25_top_indices = np.argsort(bm25_scores)[::-1][:top_k * 2]
# 3. Reciprocal Rank Fusion (RRF)
combined_scores = {}
k = 60 # RRF constant
# Add vector search scores
for i, match in enumerate(vector_results["matches"]):
doc_id = match["id"]
combined_scores[doc_id] = alpha / (k + i + 1)
# Add BM25 scores
for i, idx in enumerate(bm25_top_indices):
doc_id = self.get_doc_id(idx)
combined_scores[doc_id] = combined_scores.get(doc_id, 0) + (1 - alpha) / (k + i + 1)
# 4. Select top-k by combined score
top_doc_ids = sorted(combined_scores, key=combined_scores.get, reverse=True)[:top_k]
# 5. Generate response
context = "\n\n".join([
self.get_document_text(doc_id)
for doc_id in top_doc_ids
])
prompt = f"""Answer using the provided context.
Context:
{context}
Question: {question}
Answer:"""
response = await self.llm.complete(prompt)
return {"answer": response, "doc_ids": top_doc_ids}
User Query
↓
Generate Multiple Variants
↓
Search Each Variant
↓
Deduplicate & Merge Results
↓
LLM Generation
Use Case: Complex queries, ambiguous questions Pros: Better coverage, handles query variations Cons: Multiple searches, higher latency/cost
Implementation:
class MultiQueryRAG:
def __init__(self, pinecone_client, llm_client):
self.pinecone = pinecone_client
self.llm = llm_client
async def query(self, question: str, num_variants: int = 3, top_k: int = 5):
"""Generate multiple query variants for better coverage."""
# 1. Generate query variants
variants = await self.generate_query_variants(question, num_variants)
# 2. Search each variant
all_results = []
for variant in variants:
embedding = await self.embed(variant)
results = self.pinecone.query(
vector=embedding,
top_k=top_k,
include_metadata=True
)
all_results.extend(results["matches"])
# 3. Deduplicate by document ID
seen = set()
unique_results = []
for match in all_results:
doc_id = match["id"]
if doc_id not in seen:
seen.add(doc_id)
unique_results.append(match)
# 4. Take top-k by score
unique_results.sort(key=lambda x: x["score"], reverse=True)
top_results = unique_results[:top_k]
# 5. Generate response
context = "\n\n".join([m["metadata"]["text"] for m in top_results])
prompt = f"""Answer using the provided context.
Context:
{context}
Original Question: {question}
Answer:"""
response = await self.llm.complete(prompt)
return {"answer": response, "variants_used": variants}
async def generate_query_variants(self, question: str, num_variants: int):
"""Generate alternative phrasings of the question."""
prompt = f"""Generate {num_variants} alternative phrasings of this question:
Question: {question}
Return only the alternative questions, one per line."""
response = await self.llm.complete(prompt)
variants = [line.strip() for line in response.split("\n") if line.strip()]
return variants[:num_variants]
Challenge: Documents must be split into chunks that fit in context windows while preserving semantic meaning.
Method: Split by character/token count with overlap
def fixed_size_chunking(text: str, chunk_size: int = 512, overlap: int = 50):
"""Split text into fixed-size chunks with overlap."""
chunks = []
start = 0
while start < len(text):
end = start + chunk_size
chunk = text[start:end]
chunks.append(chunk)
start = end - overlap # Overlap to preserve context
return chunks
# Example
text = "..." * 10000
chunks = fixed_size_chunking(text, chunk_size=512, overlap=50)
# Result: ~20 chunks of 512 chars each, 50 char overlap
Pros: Simple, predictable Cons: May split mid-sentence, breaks semantic units
Method: Split by sentences, group to target size
import nltk
def sentence_chunking(text: str, target_size: int = 512):
"""Chunk by sentences to preserve semantic boundaries."""
sentences = nltk.sent_tokenize(text)
chunks = []
current_chunk = []
current_length = 0
for sentence in sentences:
sentence_length = len(sentence)
if current_length + sentence_length > target_size and current_chunk:
# Start new chunk
chunks.append(" ".join(current_chunk))
current_chunk = [sentence]
current_length = sentence_length
else:
current_chunk.append(sentence)
current_length += sentence_length
if current_chunk:
chunks.append(" ".join(current_chunk))
return chunks
# Respects sentence boundaries
chunks = sentence_chunking(long_document, target_size=512)
Pros: Preserves sentence integrity Cons: Variable chunk sizes, may exceed token limits
Method: Split by paragraph → sentence → words as needed
from langchain.text_splitter import RecursiveCharacterTextSplitter
def recursive_chunking(text: str, chunk_size: int = 512, overlap: int = 50):
"""Intelligently split text preserving structure."""
splitter = RecursiveCharacterTextSplitter(
chunk_size=chunk_size,
chunk_overlap=overlap,
separators=["\n\n", "\n", ". ", " ", ""] # Try in order
)
chunks = splitter.split_text(text)
return chunks
# Tries to split at logical boundaries
chunks = recursive_chunking(document, chunk_size=512)
Pros: Preserves structure, semantic integrity Cons: Slightly more complex
Method: Split where semantic similarity drops
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
async def semantic_chunking(text: str, threshold: float = 0.7):
"""Split text where semantic similarity drops below threshold."""
sentences = nltk.sent_tokenize(text)
# Get embeddings for each sentence
embeddings = [await embed(s) for s in sentences]
chunks = []
current_chunk = [sentences[0]]
for i in range(1, len(sentences)):
# Calculate similarity with previous sentence
similarity = cosine_similarity(
[embeddings[i-1]],
[embeddings[i]]
)[0][0]
if similarity < threshold:
# Semantic break detected, start new chunk
chunks.append(" ".join(current_chunk))
current_chunk = [sentences[i]]
else:
current_chunk.append(sentences[i])
if current_chunk:
chunks.append(" ".join(current_chunk))
return chunks
# Splits at semantic boundaries
chunks = await semantic_chunking(document, threshold=0.7)
Pros: Preserves semantic coherence Cons: Expensive (embeddings for every sentence), slower
Embedding Models:
| Model | Dimensions | Performance | Cost | Use Case |
|---|---|---|---|---|
| text-embedding-3-small (OpenAI) | 1536 | Good | $ | General purpose |
| text-embedding-3-large (OpenAI) | 3072 | Better | $$ | High accuracy needed |
| text-embedding-ada-002 (OpenAI) | 1536 | Good | $ | Legacy (still good) |
| all-MiniLM-L6-v2 (Open) | 384 | OK | Free | Budget-constrained |
| all-mpnet-base-v2 (Open) | 768 | Better | Free | Self-hosted |
| instructor-xl (Open) | 768 | Best (open) | Free | Domain-specific |
Selection Criteria:
Retrieval Metrics:
Generation Metrics:
Example Evaluation:
from ragas import evaluate
from ragas.metrics import answer_relevancy, faithfulness, context_relevancy
def evaluate_rag(test_cases):
"""Evaluate RAG system performance."""
results = []
for case in test_cases:
question = case["question"]
ground_truth = case["answer"]
# Run RAG
rag_result = rag_system.query(question)
results.append({
"question": question,
"contexts": rag_result["contexts"],
"answer": rag_result["answer"],
"ground_truth": ground_truth
})
# Calculate metrics
scores = evaluate(
results,
metrics=[answer_relevancy, faithfulness, context_relevancy]
)
return scores
# Typical good scores:
# Answer Relevancy: >0.9
# Faithfulness: >0.85
# Context Relevancy: >0.8
When helping with RAG systems:
Your role: Help developers build production-ready RAG systems with optimal chunking, retrieval, and generation strategies.