'use client' import { useState } from 'react' import type { Collection, SearchResult } from './types' import { API_BASE } from './types' export function SearchTab({ collections }: { collections: Collection[] }) { const [query, setQuery] = useState('') const [subject, setSubject] = useState('') const [year, setYear] = useState('') const [results, setResults] = useState([]) const [searching, setSearching] = useState(false) const [latency, setLatency] = useState(null) const [ratings, setRatings] = useState>({}) const submitRating = async (resultId: string, rating: number) => { setRatings(prev => ({ ...prev, [resultId]: rating })) try { const formData = new FormData() formData.append('result_id', resultId) formData.append('rating', rating.toString()) await fetch(`${API_BASE}/api/v1/admin/rag/search/feedback`, { method: 'POST', body: formData }) } catch (err) { console.error('Failed to submit rating:', err) } } const handleSearch = async () => { if (!query.trim()) return setSearching(true) const startTime = Date.now() try { const res = await fetch(`${API_BASE}/api/v1/admin/nibis/search`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ query: query.trim(), subject: subject || undefined, year: year ? parseInt(year) : undefined, limit: 10 }), }) if (res.ok) { const data = await res.json() setResults(data) setLatency(Date.now() - startTime) } } catch (err) { console.error('Search failed:', err) } finally { setSearching(false) } } const subjects = collections.flatMap(c => c.subjects).filter((v, i, a) => a.indexOf(v) === i).sort() const years = collections.flatMap(c => c.years).filter((v, i, a) => a.indexOf(v) === i).sort() return (

RAG Suche & Qualitätstest

Testen Sie die semantische Suche und bewerten Sie die Ergebnisqualität

{/* Search Form */}
setQuery(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleSearch()} placeholder="z.B. Analyse eines Gedichts von Rilke" className="w-full px-4 py-3 border border-slate-300 rounded-lg focus:ring-2 focus:ring-primary-500 focus:border-primary-500" />
{/* Results */} {results.length > 0 && (

{results.length} Ergebnisse

{latency && Latenz: {latency}ms}
{results.map((result, index) => (
#{index + 1} Score: {result.score.toFixed(3)}
{result.year && {result.year}} {result.subject && {result.subject}} {result.niveau && {result.niveau}}

{result.text}

Relevanz:
{[1, 2, 3, 4, 5].map((starRating) => ( ))}
{ratings[result.id] && Bewertet}
))}
)} {results.length === 0 && query && !searching && (

Keine Ergebnisse gefunden

)}
) }