@sylix/coworker 2.0.11 → 2.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/slash/config.d.ts.map +1 -1
- package/dist/commands/slash/config.js +22 -4
- package/dist/commands/slash/config.js.map +1 -1
- package/dist/core/CoWorkerAgent.d.ts.map +1 -1
- package/dist/core/CoWorkerAgent.js +6 -3
- package/dist/core/CoWorkerAgent.js.map +1 -1
- package/dist/skills/defaults/accessibility/screen-reader-testing.md +545 -0
- package/dist/skills/defaults/accessibility/wcag-audit-patterns.md +555 -0
- package/dist/skills/defaults/ai-ml/rag.md +276 -0
- package/dist/skills/defaults/backend-development/api-design-principles.md +528 -0
- package/dist/skills/defaults/backend-development/api-design.md +285 -0
- package/dist/skills/defaults/backend-development/architecture-patterns.md +494 -0
- package/dist/skills/defaults/backend-development/async-python.md +237 -0
- package/dist/skills/defaults/backend-development/auth-implementation-patterns.md +638 -0
- package/dist/skills/defaults/backend-development/bazel-build-optimization.md +387 -0
- package/dist/skills/defaults/backend-development/billing-automation/SKILL.md +566 -0
- package/dist/skills/defaults/backend-development/code-review-excellence.md +538 -0
- package/dist/skills/defaults/backend-development/cqrs-implementation.md +554 -0
- package/dist/skills/defaults/backend-development/database-design.md +305 -0
- package/dist/skills/defaults/backend-development/debugging-strategies.md +536 -0
- package/dist/skills/defaults/backend-development/e2e-testing-patterns.md +544 -0
- package/dist/skills/defaults/backend-development/error-handling-patterns.md +641 -0
- package/dist/skills/defaults/backend-development/fastapi-templates.md +559 -0
- package/dist/skills/defaults/backend-development/fastapi.md +309 -0
- package/dist/skills/defaults/backend-development/git-advanced-workflows.md +405 -0
- package/dist/skills/defaults/backend-development/microservices-patterns.md +595 -0
- package/dist/skills/defaults/backend-development/microservices.md +284 -0
- package/dist/skills/defaults/backend-development/monorepo-management.md +623 -0
- package/dist/skills/defaults/backend-development/nodejs-backend-patterns.md +1048 -0
- package/dist/skills/defaults/backend-development/nx-workspace-patterns.md +457 -0
- package/dist/skills/defaults/backend-development/paypal-integration/SKILL.md +478 -0
- package/dist/skills/defaults/backend-development/pci-compliance/SKILL.md +480 -0
- package/dist/skills/defaults/backend-development/python-anti-patterns.md +349 -0
- package/dist/skills/defaults/backend-development/python-background-jobs.md +364 -0
- package/dist/skills/defaults/backend-development/python-code-style.md +360 -0
- package/dist/skills/defaults/backend-development/python-configuration.md +368 -0
- package/dist/skills/defaults/backend-development/python-design-patterns.md +296 -0
- package/dist/skills/defaults/backend-development/python-error-handling.md +323 -0
- package/dist/skills/defaults/backend-development/python-packaging.md +887 -0
- package/dist/skills/defaults/backend-development/python-performance-optimization.md +874 -0
- package/dist/skills/defaults/backend-development/python-project-structure.md +252 -0
- package/dist/skills/defaults/backend-development/python-resilience.md +376 -0
- package/dist/skills/defaults/backend-development/python-resource-management.md +421 -0
- package/dist/skills/defaults/backend-development/python-type-safety.md +428 -0
- package/dist/skills/defaults/backend-development/sql-optimization-patterns.md +509 -0
- package/dist/skills/defaults/backend-development/stripe-integration/SKILL.md +522 -0
- package/dist/skills/defaults/backend-development/turborepo-caching.md +376 -0
- package/dist/skills/defaults/blockchain/defi-protocol-templates.md +430 -0
- package/dist/skills/defaults/blockchain/nft-standards.md +364 -0
- package/dist/skills/defaults/blockchain/solidity-security.md +514 -0
- package/dist/skills/defaults/blockchain/web3-testing.md +360 -0
- package/dist/skills/defaults/business/competitive-landscape/SKILL.md +527 -0
- package/dist/skills/defaults/business/market-sizing-analysis/SKILL.md +451 -0
- package/dist/skills/defaults/business/startup-financial-modeling/SKILL.md +494 -0
- package/dist/skills/defaults/business/startup-metrics-framework/SKILL.md +564 -0
- package/dist/skills/defaults/business/team-composition-analysis.md +437 -0
- package/dist/skills/defaults/compliance/employment-contract-templates/SKILL.md +527 -0
- package/dist/skills/defaults/compliance/gdpr-data-handling/SKILL.md +630 -0
- package/dist/skills/defaults/data-engineering/airflow-dag-patterns.md +436 -0
- package/dist/skills/defaults/data-engineering/airflow.md +519 -0
- package/dist/skills/defaults/data-engineering/data-quality.md +583 -0
- package/dist/skills/defaults/data-engineering/dbt-transformation-patterns.md +482 -0
- package/dist/skills/defaults/data-engineering/dbt.md +556 -0
- package/dist/skills/defaults/data-engineering/ml-pipeline-workflow/SKILL.md +247 -0
- package/dist/skills/defaults/data-engineering/spark-optimization.md +348 -0
- package/dist/skills/defaults/data-engineering/spark.md +411 -0
- package/dist/skills/defaults/database/postgresql.md +202 -0
- package/dist/skills/defaults/debugging/systematic-debugging.md +249 -0
- package/dist/skills/defaults/devops/architecture-decision-records.md +448 -0
- package/dist/skills/defaults/devops/changelog-automation.md +580 -0
- package/dist/skills/defaults/devops/cicd.md +314 -0
- package/dist/skills/defaults/devops/cloud.md +263 -0
- package/dist/skills/defaults/devops/code-review-excellence.md +299 -0
- package/dist/skills/defaults/devops/cost-optimization.md +295 -0
- package/dist/skills/defaults/devops/deployment-pipeline-design.md +356 -0
- package/dist/skills/defaults/devops/docker.md +281 -0
- package/dist/skills/defaults/devops/git-workflows.md +205 -0
- package/dist/skills/defaults/devops/github-actions.md +311 -0
- package/dist/skills/defaults/devops/gitlab-ci-patterns.md +266 -0
- package/dist/skills/defaults/devops/hybrid-cloud-networking.md +241 -0
- package/dist/skills/defaults/devops/istio-traffic-management.md +327 -0
- package/dist/skills/defaults/devops/kubernetes.md +339 -0
- package/dist/skills/defaults/devops/linkerd-patterns.md +311 -0
- package/dist/skills/defaults/devops/multi-cloud-architecture.md +181 -0
- package/dist/skills/defaults/devops/observability.md +243 -0
- package/dist/skills/defaults/devops/openapi-spec-generation.md +1024 -0
- package/dist/skills/defaults/devops/postmortem-writing.md +396 -0
- package/dist/skills/defaults/devops/prometheus-configuration.md +265 -0
- package/dist/skills/defaults/devops/secrets-management.md +341 -0
- package/dist/skills/defaults/devops/service-mesh-observability.md +385 -0
- package/dist/skills/defaults/devops/terraform-module-library.md +244 -0
- package/dist/skills/defaults/finance/backtesting-frameworks/SKILL.md +663 -0
- package/dist/skills/defaults/finance/risk-metrics-calculation/SKILL.md +557 -0
- package/dist/skills/defaults/frontend/accessibility-compliance.md +420 -0
- package/dist/skills/defaults/frontend/design-system-patterns.md +337 -0
- package/dist/skills/defaults/frontend/interaction-design.md +327 -0
- package/dist/skills/defaults/frontend/javascript.md +311 -0
- package/dist/skills/defaults/frontend/modern-javascript-patterns.md +927 -0
- package/dist/skills/defaults/frontend/react-native-design.md +440 -0
- package/dist/skills/defaults/frontend/react.md +345 -0
- package/dist/skills/defaults/frontend/responsive-design.md +472 -0
- package/dist/skills/defaults/frontend/tailwind-design-system.md +337 -0
- package/dist/skills/defaults/frontend/typescript-advanced-types.md +724 -0
- package/dist/skills/defaults/frontend/typescript.md +334 -0
- package/dist/skills/defaults/frontend/visual-design-foundations.md +326 -0
- package/dist/skills/defaults/frontend/web-component-design.md +279 -0
- package/dist/skills/defaults/game-development/godot-gdscript-patterns.md +188 -0
- package/dist/skills/defaults/game-development/unity-ecs-patterns.md +594 -0
- package/dist/skills/defaults/kubernetes/gitops-workflow.md +285 -0
- package/dist/skills/defaults/kubernetes/gitops.md +280 -0
- package/dist/skills/defaults/kubernetes/helm-chart-scaffolding.md +553 -0
- package/dist/skills/defaults/kubernetes/helm.md +343 -0
- package/dist/skills/defaults/kubernetes/k8s-manifest-generator.md +501 -0
- package/dist/skills/defaults/kubernetes/k8s-security-policies.md +342 -0
- package/dist/skills/defaults/kubernetes/manifests.md +330 -0
- package/dist/skills/defaults/kubernetes/security.md +337 -0
- package/dist/skills/defaults/llm-application/embedding-strategies.md +608 -0
- package/dist/skills/defaults/llm-application/hybrid-search-implementation.md +570 -0
- package/dist/skills/defaults/llm-application/hybrid-search.md +570 -0
- package/dist/skills/defaults/llm-application/langchain-architecture.md +666 -0
- package/dist/skills/defaults/llm-application/langchain.md +259 -0
- package/dist/skills/defaults/llm-application/llm-evaluation.md +695 -0
- package/dist/skills/defaults/llm-application/prompt-engineering-patterns.md +449 -0
- package/dist/skills/defaults/llm-application/prompt-engineering.md +219 -0
- package/dist/skills/defaults/llm-application/rag-implementation.md +434 -0
- package/dist/skills/defaults/llm-application/similarity-search-patterns.md +560 -0
- package/dist/skills/defaults/llm-application/similarity-search.md +560 -0
- package/dist/skills/defaults/llm-application/vector-index-tuning.md +523 -0
- package/dist/skills/defaults/mobile/mobile-android-design.md +440 -0
- package/dist/skills/defaults/mobile/mobile-ios-design.md +266 -0
- package/dist/skills/defaults/monitoring/distributed-tracing.md +436 -0
- package/dist/skills/defaults/monitoring/grafana-dashboards.md +370 -0
- package/dist/skills/defaults/monitoring/prometheus-configuration.md +379 -0
- package/dist/skills/defaults/monitoring/slo-implementation.md +323 -0
- package/dist/skills/defaults/refactoring/code-refactoring.md +349 -0
- package/dist/skills/defaults/security/anti-reversing-techniques/SKILL.md +559 -0
- package/dist/skills/defaults/security/auditor.md +168 -0
- package/dist/skills/defaults/security/binary-analysis-patterns/SKILL.md +438 -0
- package/dist/skills/defaults/security/memory-forensics/SKILL.md +483 -0
- package/dist/skills/defaults/security/mtls-configuration.md +349 -0
- package/dist/skills/defaults/security/protocol-reverse-engineering/SKILL.md +520 -0
- package/dist/skills/defaults/security/sast-configuration.md +182 -0
- package/dist/skills/defaults/security/security.md +313 -0
- package/dist/skills/defaults/security/stride-analysis.md +273 -0
- package/dist/skills/defaults/security/threat-mitigation-mapping.md +290 -0
- package/dist/skills/defaults/systems/bash-defensive-patterns/SKILL.md +539 -0
- package/dist/skills/defaults/systems/bats-testing-patterns/SKILL.md +631 -0
- package/dist/skills/defaults/systems/go-concurrency-patterns.md +657 -0
- package/dist/skills/defaults/systems/memory-safety-patterns.md +605 -0
- package/dist/skills/defaults/systems/rust-async-patterns.md +519 -0
- package/dist/skills/defaults/systems/shellcheck-configuration/SKILL.md +456 -0
- package/dist/skills/defaults/team-collaboration/multi-reviewer-patterns.md +126 -0
- package/dist/skills/defaults/team-collaboration/parallel-feature-development.md +151 -0
- package/dist/skills/defaults/testing/javascript-testing-patterns.md +1021 -0
- package/dist/skills/defaults/testing/python-testing-patterns.md +351 -0
- package/dist/skills/defaults/testing/testing.md +332 -0
- package/dist/skills/defaults/workflows/context-driven-development.md +384 -0
- package/dist/skills/defaults/workflows/track-management.md +592 -0
- package/dist/skills/defaults/workflows/workflow-patterns.md +622 -0
- package/dist/skills/index.d.ts +11 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +129 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/utils/character.js +4 -4
- package/dist/utils/character.js.map +1 -1
- package/dist/utils/inputbar.d.ts.map +1 -1
- package/dist/utils/inputbar.js +7 -0
- package/dist/utils/inputbar.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: rag
|
|
3
|
+
description: Build production retrieval-augmented generation systems with hybrid search, reranking, and vector databases.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# RAG Implementation — CoWorker Edition
|
|
7
|
+
|
|
8
|
+
Build production-ready LLM applications that ground responses in your data.
|
|
9
|
+
|
|
10
|
+
## When to Use This Skill
|
|
11
|
+
|
|
12
|
+
- Building knowledge base chatbots
|
|
13
|
+
- Creating document Q&A systems
|
|
14
|
+
- Implementing enterprise search
|
|
15
|
+
- Adding context to LLM responses
|
|
16
|
+
|
|
17
|
+
## Core Concepts
|
|
18
|
+
|
|
19
|
+
### 1. RAG Architecture
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
User Query → Embedding Model → Vector Search → Context → LLM → Response
|
|
23
|
+
↓
|
|
24
|
+
Vector Database
|
|
25
|
+
(Pinecone/Qdrant/Weaviate)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### 2. Document Processing Pipeline
|
|
29
|
+
|
|
30
|
+
```python
|
|
31
|
+
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
|
32
|
+
from langchain_community.document_loaders import (
|
|
33
|
+
PyPDFLoader, TextLoader, WebLoader
|
|
34
|
+
)
|
|
35
|
+
from langchain.schema import Document
|
|
36
|
+
|
|
37
|
+
class DocumentProcessor:
|
|
38
|
+
def __init__(
|
|
39
|
+
self,
|
|
40
|
+
chunk_size: int = 1000,
|
|
41
|
+
chunk_overlap: int = 200
|
|
42
|
+
):
|
|
43
|
+
self.splitter = RecursiveCharacterTextSplitter(
|
|
44
|
+
chunk_size=chunk_size,
|
|
45
|
+
chunk_overlap=chunk_overlap,
|
|
46
|
+
separators=["\n\n", "\n", " ", ""]
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
def load_and_split(self, file_path: str) -> list[Document]:
|
|
50
|
+
# Choose loader based on file type
|
|
51
|
+
if file_path.endswith('.pdf'):
|
|
52
|
+
loader = PyPDFLoader(file_path)
|
|
53
|
+
elif file_path.endswith('.txt'):
|
|
54
|
+
loader = TextLoader(file_path)
|
|
55
|
+
else:
|
|
56
|
+
raise ValueError(f"Unsupported file type: {file_path}")
|
|
57
|
+
|
|
58
|
+
documents = loader.load()
|
|
59
|
+
return self.splitter.split_documents(documents)
|
|
60
|
+
|
|
61
|
+
def process_batch(self, file_paths: list[str]) -> list[Document]:
|
|
62
|
+
all_docs = []
|
|
63
|
+
for path in file_paths:
|
|
64
|
+
docs = self.load_and_split(path)
|
|
65
|
+
all_docs.extend(docs)
|
|
66
|
+
return all_docs
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 3. Embedding Strategy
|
|
70
|
+
|
|
71
|
+
```python
|
|
72
|
+
from langchain_openai import OpenAIEmbeddings
|
|
73
|
+
from langchain_community.embeddings import VoyageEmbeddings
|
|
74
|
+
|
|
75
|
+
# OpenAI embeddings
|
|
76
|
+
openai_embeddings = OpenAIEmbeddings(
|
|
77
|
+
model="text-embedding-3-large",
|
|
78
|
+
dimensions=3072
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
# Voyage AI (recommended for Claude)
|
|
82
|
+
voyage_embeddings = VoyageEmbeddings(
|
|
83
|
+
model="voyage-2",
|
|
84
|
+
truncation=True
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
# For local/self-hosted
|
|
88
|
+
from langchain_community.embeddings import HuggingFaceEmbeddings
|
|
89
|
+
|
|
90
|
+
local_embeddings = HuggingFaceEmbeddings(
|
|
91
|
+
model_name="BAAI/bge-large-en-v1.5",
|
|
92
|
+
model_kwargs={'device': 'cuda'}
|
|
93
|
+
)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### 4. Vector Store Integration
|
|
97
|
+
|
|
98
|
+
```python
|
|
99
|
+
# Pinecone
|
|
100
|
+
from langchain_pinecone import PineconeVectorStore
|
|
101
|
+
|
|
102
|
+
vectorstore = PineconeVectorStore.from_documents(
|
|
103
|
+
documents=docs,
|
|
104
|
+
embedding=openai_embeddings,
|
|
105
|
+
index_name="my-knowledge-base",
|
|
106
|
+
namespace="v1"
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
# Qdrant
|
|
110
|
+
from langchain_qdrant import QdrantVectorStore
|
|
111
|
+
from qdrant_client import QdrantClient
|
|
112
|
+
|
|
113
|
+
qdrant = QdrantClient(host="localhost", port=6333)
|
|
114
|
+
vectorstore = QdrantVectorStore.from_documents(
|
|
115
|
+
documents=docs,
|
|
116
|
+
embedding=voyage_embeddings,
|
|
117
|
+
collection_name="documents",
|
|
118
|
+
client=qdrant
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
# Weaviate
|
|
122
|
+
from langchain_weaviate import WeaviateVectorStore
|
|
123
|
+
import weaviate
|
|
124
|
+
|
|
125
|
+
client = weaviate.Client(url="http://localhost:8080")
|
|
126
|
+
vectorstore = WeaviateVectorStore.from_documents(
|
|
127
|
+
documents=docs,
|
|
128
|
+
embedding=openai_embeddings,
|
|
129
|
+
client=client,
|
|
130
|
+
index_name="Documents"
|
|
131
|
+
)
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### 5. Hybrid Search
|
|
135
|
+
|
|
136
|
+
```python
|
|
137
|
+
from langchain.retrievers import ContextualCompressionRetriever
|
|
138
|
+
from langchain.retrievers.document_compressors import CohereRerank
|
|
139
|
+
from langchain_community.retrievers import BM25Retriever
|
|
140
|
+
|
|
141
|
+
class HybridRetriever:
|
|
142
|
+
def __init__(self, vectorstore, documents: list[Document]):
|
|
143
|
+
self.vector_retriever = vectorstore.as_retriever(
|
|
144
|
+
search_kwargs={"k": 10}
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
self.bm25_retriever = BM25Retriever.from_documents(
|
|
148
|
+
documents,
|
|
149
|
+
k=10
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
def get_relevant_documents(self, query: str) -> list[Document]:
|
|
153
|
+
# Parallel retrieval
|
|
154
|
+
vector_results = self.vector_retriever.get_relevant_documents(query)
|
|
155
|
+
keyword_results = self.bm25_retriever.get_relevant_documents(query)
|
|
156
|
+
|
|
157
|
+
# Merge with ranking
|
|
158
|
+
seen = set()
|
|
159
|
+
merged = []
|
|
160
|
+
for doc in vector_results + keyword_results:
|
|
161
|
+
if doc.page_content not in seen:
|
|
162
|
+
seen.add(doc.page_content)
|
|
163
|
+
merged.append(doc)
|
|
164
|
+
|
|
165
|
+
return merged[:5]
|
|
166
|
+
|
|
167
|
+
# With reranking
|
|
168
|
+
class RerankingRetriever:
|
|
169
|
+
def __init__(self, base_retriever):
|
|
170
|
+
self.base = base_retriever
|
|
171
|
+
self.reranker = CohereRerank(
|
|
172
|
+
cohere_api_key=os.getenv("COHERE_API_KEY"),
|
|
173
|
+
top_n=5
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
def get_relevant_documents(self, query: str) -> list[Document]:
|
|
177
|
+
return self.reranker.compress_documents(
|
|
178
|
+
self.base.get_relevant_documents(query),
|
|
179
|
+
query=query
|
|
180
|
+
)
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### 6. RAG Chain (LangGraph)
|
|
184
|
+
|
|
185
|
+
```python
|
|
186
|
+
from langgraph.graph import StateGraph, END
|
|
187
|
+
from typing import TypedDict
|
|
188
|
+
|
|
189
|
+
class RAGState(TypedDict):
|
|
190
|
+
question: str
|
|
191
|
+
context: list[Document]
|
|
192
|
+
answer: str
|
|
193
|
+
|
|
194
|
+
def retrieve(state: RAGState) -> RAGState:
|
|
195
|
+
"""Retrieve relevant documents."""
|
|
196
|
+
docs = retriever.get_relevant_documents(state["question"])
|
|
197
|
+
return {"context": docs}
|
|
198
|
+
|
|
199
|
+
def generate(state: RAGState) -> RAGState:
|
|
200
|
+
"""Generate answer from context."""
|
|
201
|
+
context_text = "\n\n".join(doc.page_content for doc in state["context"])
|
|
202
|
+
|
|
203
|
+
prompt = f"""Answer the question based on the context.
|
|
204
|
+
|
|
205
|
+
Context:
|
|
206
|
+
{context_text}
|
|
207
|
+
|
|
208
|
+
Question: {state["question"]}
|
|
209
|
+
|
|
210
|
+
Answer:"""
|
|
211
|
+
|
|
212
|
+
response = llm.invoke(prompt)
|
|
213
|
+
return {"answer": response.content}
|
|
214
|
+
|
|
215
|
+
# Build graph
|
|
216
|
+
graph = StateGraph(RAGState)
|
|
217
|
+
graph.add_node("retrieve", retrieve)
|
|
218
|
+
graph.add_node("generate", generate)
|
|
219
|
+
|
|
220
|
+
graph.set_entry_point("retrieve")
|
|
221
|
+
graph.add_edge("retrieve", "generate")
|
|
222
|
+
graph.add_edge("generate", END)
|
|
223
|
+
|
|
224
|
+
rag_agent = graph.compile()
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### 7. Evaluation
|
|
228
|
+
|
|
229
|
+
```python
|
|
230
|
+
from langchain.evaluation import load_evaluator
|
|
231
|
+
|
|
232
|
+
# Correctness evaluation
|
|
233
|
+
evaluator = load_evaluator("labeled_criteria", criteria="correctness")
|
|
234
|
+
|
|
235
|
+
eval_result = evaluator.evaluate_strings(
|
|
236
|
+
prediction=generated_answer,
|
|
237
|
+
input=user_question,
|
|
238
|
+
reference=ground_truth_answer
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
print(f"Score: {eval_result.score}")
|
|
242
|
+
print(f"Reasoning: {eval_result.reasoning}")
|
|
243
|
+
|
|
244
|
+
# Retrieval evaluation
|
|
245
|
+
def evaluate_retrieval(retriever, questions: list[str]):
|
|
246
|
+
results = []
|
|
247
|
+
for q in questions:
|
|
248
|
+
docs = retriever.get_relevant_documents(q)
|
|
249
|
+
# Calculate relevant docs precision
|
|
250
|
+
relevant = sum(1 for d in docs if is_relevant(q, d))
|
|
251
|
+
precision = relevant / len(docs) if docs else 0
|
|
252
|
+
results.append({
|
|
253
|
+
"question": q,
|
|
254
|
+
"num_docs": len(docs),
|
|
255
|
+
"precision": precision
|
|
256
|
+
})
|
|
257
|
+
return results
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## Best Practices
|
|
261
|
+
|
|
262
|
+
1. **Chunk sizing** - 500-1000 chars typically works well
|
|
263
|
+
2. **Overlap** - 10-20% overlap preserves context
|
|
264
|
+
3. **Hybrid search** - Vector + keyword catches more
|
|
265
|
+
4. **Reranking** - Improves relevance significantly
|
|
266
|
+
5. **Metadata** - Store source, page, timestamps
|
|
267
|
+
6. **Evaluation** - Test with real queries
|
|
268
|
+
7. **Caching** - Cache embeddings for repeated queries
|
|
269
|
+
|
|
270
|
+
## Common Issues
|
|
271
|
+
|
|
272
|
+
- Lost context (chunks too small)
|
|
273
|
+
- Noisy retrieval (missing metadata filtering)
|
|
274
|
+
- Slow retrieval (not using approximate search)
|
|
275
|
+
- Poor answer quality (wrong chunking strategy)
|
|
276
|
+
- Hallucinations (insufficient context)
|