-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrag_debug_example.py
More file actions
313 lines (246 loc) · 8.83 KB
/
rag_debug_example.py
File metadata and controls
313 lines (246 loc) · 8.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
"""
RAG Debug Example - Phase 2 완성 데모
RAG 디버깅 전체 워크플로우를 보여주는 예제
이 예제는 다음을 시연합니다:
1. RAGDebug 세션 시작
2. Embedding 분석 (UMAP + 클러스터링)
3. 청크 검증 (크기, 중복, 메타데이터)
4. 파라미터 튜닝 (top_k, score_threshold)
5. 리포트 내보내기 (JSON, Markdown, HTML)
"""
import asyncio
from pathlib import Path
# Facade (Public API)
from beanllm.facade.rag_debug_facade import RAGDebug
# CLI Commands (Optional, for Rich UI)
from beanllm.ui.repl.rag_commands import RAGDebugCommands
# Visualizers (Optional, for Rich UI)
from beanllm.ui.visualizers.embedding_viz import EmbeddingVisualizer
from beanllm.ui.visualizers.metrics_viz import MetricsVisualizer
async def example_basic_api():
"""
Example 1: Basic API Usage (Facade Pattern)
가장 간단한 사용법 - Facade를 통한 직접 호출
"""
print("\n" + "=" * 60)
print("Example 1: Basic API Usage (Facade)")
print("=" * 60 + "\n")
# Mock VectorStore (실제로는 Chroma, FAISS 등 사용)
class MockVectorStore:
def __init__(self):
self._documents = [
{"page_content": f"Document {i}" * 50, "metadata": {"source": f"doc{i}.txt"}}
for i in range(100)
]
def similarity_search(self, query, k=4):
return self._documents[:k]
vector_store = MockVectorStore()
# Create RAGDebug instance
debug = RAGDebug(
vector_store=vector_store,
session_name="production_debug",
)
# Start session
print("Starting debug session...")
session = await debug.start()
print(f"✅ Session started: {session.session_id}")
print(f" Documents: {session.num_documents}")
print(f" Embeddings: {session.num_embeddings}")
# Analyze embeddings (requires beanllm[advanced])
try:
print("\nAnalyzing embeddings (UMAP + clustering)...")
analysis = await debug.analyze_embeddings(
method="umap",
n_clusters=5,
detect_outliers=True,
)
print("✅ Analysis completed:")
print(f" Clusters: {analysis.num_clusters}")
print(f" Outliers: {len(analysis.outliers)}")
print(f" Silhouette Score: {analysis.silhouette_score:.4f}")
except ImportError:
print("⚠️ Skipping embedding analysis (install beanllm[advanced])")
# Validate chunks
print("\nValidating chunks...")
validation = await debug.validate_chunks(
size_threshold=2000,
)
print("✅ Validation completed:")
print(f" Total chunks: {validation.total_chunks}")
print(f" Valid chunks: {validation.valid_chunks}")
print(f" Issues: {len(validation.issues)}")
print(f" Duplicates: {len(validation.duplicate_chunks)}")
# Tune parameters
print("\nTuning parameters...")
tuning = await debug.tune_parameters(
parameters={"top_k": 10, "score_threshold": 0.7},
test_queries=["What is RAG?", "How does retrieval work?"],
)
print("✅ Tuning completed:")
print(f" Avg Score: {tuning.avg_score:.4f}")
if tuning.comparison_with_baseline:
improvement = tuning.comparison_with_baseline.get("improvement_pct", 0.0)
print(f" vs Baseline: {improvement:+.2f}%")
# Export report
print("\nExporting debug report...")
output_dir = Path("./debug_reports")
output_dir.mkdir(exist_ok=True)
results = await debug.export_report(
output_dir=str(output_dir),
formats=["json", "markdown"],
)
print("✅ Report exported:")
for fmt, path in results.items():
print(f" {fmt.upper()}: {path}")
print("\n✅ Basic API example completed!")
async def example_one_stop():
"""
Example 2: One-Stop Full Analysis
한 번에 모든 분석 실행 - run_full_analysis()
"""
print("\n" + "=" * 60)
print("Example 2: One-Stop Full Analysis")
print("=" * 60 + "\n")
class MockVectorStore:
def __init__(self):
self._documents = [
{"page_content": f"Sample text {i}" * 30, "metadata": {"id": i}} for i in range(50)
]
def similarity_search(self, query, k=4):
return self._documents[:k]
vector_store = MockVectorStore()
debug = RAGDebug(vector_store=vector_store)
# Run everything at once
print("Running full analysis...")
results = await debug.run_full_analysis(
analyze_embeddings=False, # Skip if advanced deps not installed
validate_chunks=True,
tune_parameters=False, # Skip if no test queries
)
print("\n✅ Full analysis completed!")
print(f" Session ID: {results['session'].session_id}")
if "chunk_validation" in results:
validation = results["chunk_validation"]
print(f" Chunk Validation: {validation.valid_chunks}/{validation.total_chunks} valid")
if "embedding_analysis" in results:
analysis = results["embedding_analysis"]
print(f" Embedding Analysis: {analysis.num_clusters} clusters")
async def example_rich_cli():
"""
Example 3: Rich CLI Interface
Rich UI를 사용한 인터랙티브 디버깅
"""
print("\n" + "=" * 60)
print("Example 3: Rich CLI Interface")
print("=" * 60 + "\n")
class MockVectorStore:
def __init__(self):
self._documents = [
{"page_content": f"Content {i}" * 40, "metadata": {"idx": i}} for i in range(80)
]
def similarity_search(self, query, k=4):
return self._documents[:k]
vector_store = MockVectorStore()
# Create CLI commands interface
commands = RAGDebugCommands(vector_store=vector_store)
# Start session with Rich UI
await commands.cmd_start(session_name="rich_demo")
# Validate chunks with Rich UI
await commands.cmd_validate(size_threshold=1500)
# Note: Embedding analysis requires advanced deps
# await commands.cmd_analyze(method="umap", n_clusters=5)
# Tune parameters with Rich UI
await commands.cmd_tune(
parameters={"top_k": 8},
test_queries=["sample query"],
)
# Export report with Rich UI
output_dir = Path("./cli_reports")
output_dir.mkdir(exist_ok=True)
await commands.cmd_export(
output_dir=str(output_dir),
formats=["json"],
)
print("\n✅ Rich CLI example completed!")
async def example_visualizers():
"""
Example 4: Standalone Visualizers
시각화 도구만 독립적으로 사용
"""
print("\n" + "=" * 60)
print("Example 4: Standalone Visualizers")
print("=" * 60 + "\n")
# Embedding Visualizer
print("Embedding Visualization Demo:")
print("-" * 60)
embedding_viz = EmbeddingVisualizer()
# Mock data: 2D coordinates
import random
random.seed(42)
reduced_embeddings = [[random.uniform(-5, 5), random.uniform(-5, 5)] for _ in range(50)]
labels = [i % 3 for i in range(50)] # 3 clusters
outliers = [5, 15, 35] # Some outliers
embedding_viz.plot_scatter(
reduced_embeddings=reduced_embeddings,
labels=labels,
outliers=outliers,
width=60,
height=20,
title="Demo: Embedding Clusters",
)
# Cluster summary
embedding_viz.show_cluster_summary(
cluster_sizes={0: 18, 1: 16, 2: 13, -1: 3},
silhouette_score=0.68,
method="UMAP",
)
# Metrics Visualizer
print("\n\nMetrics Visualization Demo:")
print("-" * 60)
metrics_viz = MetricsVisualizer()
# Search performance dashboard
metrics_viz.show_search_dashboard(
metrics={
"avg_score": 0.75,
"avg_latency_ms": 145,
"total_queries": 50,
"top_k": 4,
"score_threshold": 0.5,
}
)
# Parameter comparison
metrics_viz.compare_parameters(
baseline={"top_k": 4, "avg_score": 0.72, "avg_latency_ms": 120},
new={"top_k": 10, "avg_score": 0.78, "avg_latency_ms": 180},
)
# Chunk statistics
metrics_viz.show_chunk_statistics(
stats={
"total_chunks": 200,
"avg_size": 1200,
"min_size": 100,
"max_size": 1950,
"duplicates": 5,
"avg_overlap_ratio": 0.15,
}
)
print("\n✅ Visualizers example completed!")
async def main():
"""Run all examples"""
print("\n" + "=" * 60)
print("RAG Debug - Complete Integration Example")
print("Phase 2 Implementation Complete")
print("=" * 60)
# Example 1: Basic API
await example_basic_api()
# Example 2: One-stop analysis
await example_one_stop()
# Example 3: Rich CLI
await example_rich_cli()
# Example 4: Visualizers
await example_visualizers()
print("\n" + "=" * 60)
print("🎉 All examples completed successfully!")
print("=" * 60 + "\n")
if __name__ == "__main__":
asyncio.run(main())