From e75716714e42b723d62bd0c4b967b136b1cfaf80 Mon Sep 17 00:00:00 2001
From: Philipp Mock
Date: Thu, 8 Oct 2026 09:07:51 +0200
Subject: [PATCH] Add LLM judge to retrieval eval; switch chat to pypdf with
2000/400 chunks
- eval_retrieval.py: --judge MODEL lets an OpenAI model decide whether the
top-5 chunks answer each question, regardless of source and page; reports
Answer@5, answer-level MRR and agreement with the page check; verdicts are
cached in eval/judge_cache.json
- On the curated goldset, gpt-6-luna rates pypdf and Docling equal
(Answer@5 0.93 each, MRR 0.90 vs 0.92), so the chat stays on pypdf for now
- local_rag.py: chunks 2000/400, chunk headers off by default, OpenAI model
gpt-6-luna; server.py loads ./vectorstore_pypdf_2000
Co-Authored-By: Claude Opus 5.5
---
add_pdfs.py | 2 +-
eval/judge_cache.json | 436 ++++++++++++++++++++
eval/kafka_human_judge_docling_2000_hdr.txt | 126 ++++++
eval/kafka_human_judge_pypdf_2000.txt | 126 ++++++
eval_retrieval.py | 108 ++++-
local_rag.py | 13 +-
server.py | 9 +-
7 files changed, 804 insertions(+), 16 deletions(-)
create mode 100644 eval/judge_cache.json
create mode 100644 eval/kafka_human_judge_docling_2000_hdr.txt
create mode 100644 eval/kafka_human_judge_pypdf_2000.txt
diff --git a/add_pdfs.py b/add_pdfs.py
index a6ca9fe..a1689bf 100644
--- a/add_pdfs.py
+++ b/add_pdfs.py
@@ -13,7 +13,7 @@ from local_rag import CHUNK_OVERLAP, CHUNK_SIZE, PDF_LOADER, PROCESSED_DIR, Loca
# Folder to scan for PDFs (recursively).
DATA_ROOT = Path("/Users/Philipp/Desktop/workspace/python/gpt_publikationen/data_vs")
-# The chat (server.py) currently loads ./vectorstore_docling_hdr; pass --index to build that one.
+# The chat (server.py) currently loads ./vectorstore_pypdf_2000; pass --index to build that one.
VECTORSTORE_PATH = "./vectorstore"
# If True: delete the existing vector store folder, then index all PDFs from scratch.
diff --git a/eval/judge_cache.json b/eval/judge_cache.json
new file mode 100644
index 0000000..af280e2
--- /dev/null
+++ b/eval/judge_cache.json
@@ -0,0 +1,436 @@
+{
+ "266bb27d6f8e7d4cb64e17edd5b468052676977996eabb62130ff4a8838c6119": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Auszug 1 sagt ausdrücklich, dass Kafkas Familie seiner literarischen Produktion auch nach seinem Tod gleichgültig gegenüberstand."
+ },
+ "cb5c8c54437ec284091f811706a844a4402d20d7c90138b50dd7b16ef58e8716": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Auszug 1 sagt ausdrücklich, dass die Aussagen des Prokuristen Gregors Selbstbild widersprechen und Zweifel an seinen Verkaufserfolgen wecken."
+ },
+ "3260dadc5e841fbc17a2e47e2a6d8764273d7cdef4d6514974d92d49682de331": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Auszug 1 benennt ausdrücklich den Widerspruch zwischen Gregors Selbstbild und der Beurteilung seiner beruflichen Leistungen durch den Prokuristen, der Gregors Verkaufserfolge infrage stellt."
+ },
+ "4f52d4c66284fdd8f3f74367c8ee14b8cc6481b3517065169703a2b85dba8366": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Auszug 1 nennt ausdrücklich Band 2 der Griechischen Kulturgeschichte und führt dort den Abschnitt „Die Verwandlungen“ auf."
+ },
+ "f88f9cbe0ca34958369abaaf6c9f91bd4007b5cd95e4f02e95eac34bfc6384cd": {
+ "auszuege": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5
+ ],
+ "begruendung": "Die Auszüge beschreiben Gestik und Mimik als vieldeutige Ausdrucksformen, die innere Zustände knapp verkörpern und von Figuren beobachtet und gedeutet werden."
+ },
+ "2c9539570f327b896aa3e2f8fbee72bef509855a4782ddc89ba56fd53361243e": {
+ "auszuege": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5
+ ],
+ "begruendung": "Die Auszüge beschreiben Bildgestaltung bei Kafka sowohl als erzählerische Bilder und Bildkontraste beziehungsweise übertragene Rede als auch als realitätsnah oder abstrakt verselbständigte Bilder."
+ },
+ "77a3c046481e87973308209885702008a6ab481d64542c9e0f193fce171c92fe": {
+ "auszuege": [],
+ "begruendung": "Keiner der Auszüge deutet die drei Untermieter ausdrücklich aus biblischer Perspektive; der biblische Apfelbezug in [2] betrifft eine andere Szene."
+ },
+ "39d4c0563db533f83edd35029645a41f76ab1de721fa76786edb9556e81ee9b5": {
+ "auszuege": [
+ 1,
+ 2,
+ 3,
+ 5
+ ],
+ "begruendung": "Die Auszüge 1, 2, 3 und 5 verknüpfen Gregors körperlichen Ekel beziehungsweise seine abstoßende Gestalt ausdrücklich mit Demütigung und Selbsterniedrigung; Auszug 4 behandelt Ekel, stellt diesen Zusammenhang aber nicht her."
+ },
+ "126ef040bb8581c5e607ca7cac042065dfb1a9da496094159c301abfc31f593b": {
+ "auszuege": [
+ 1,
+ 2,
+ 3
+ ],
+ "begruendung": "Die Auszüge 1 und 2 deuten die Dame als unerreichbares Ideal und als demütigenden Kontrast zu Gregors Gestalt; Auszug 3 beschreibt das Bild als menschliches Kulturgut und deutet seine Verbindung von Mensch und Tier."
+ },
+ "808472b80a58cd99d9df561e249c312479b70ed68f451773ef1b7e295904c3c4": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Auszug 1 sagt ausdrücklich, dass Gregors Tod ihm als „letzte Sohnespflicht“ bleibt."
+ },
+ "255a2a69fcdd9f654e5ce441265be10271bb78487ec7f5a3a4fe689ea8142585": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Nur Auszug 1 nennt ausdrücklich den Ort: Die Eltern erfahren die Nachricht aufrecht sitzend im Ehebett."
+ },
+ "a66116aaae6acda6de49ac1a5fe1dff05c0a55ecc065fe37108edf8735dfacfd": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Auszug 1 gibt Binders Erklärung ausdrücklich wieder: Kafka leite sich von „kajke“, einer niederdeutschen Koseform von Jakob, ab."
+ },
+ "7e5e1db0e6c948606950b538c571ed3f72a5093111f05668c50ae152a140a717": {
+ "auszuege": [
+ 2,
+ 3,
+ 4,
+ 5
+ ],
+ "begruendung": "Diese Auszüge belegen Tschechisch als Kafkas Umgangssprache und nennen konkrete mündliche Kommunikation, wobei Auszug 5 seine aktive Verwendung vorsichtiger formuliert."
+ },
+ "15f73e21f5ffb5b5a2bbd9cca715d24293df1db936d31d20146d3c1f4f25800d": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Auszug 1 nennt Kafkas Nichten ausdrücklich Marianne und Vera."
+ },
+ "9f704dd38b3e3fd77fd4e0e2085657e106bbefe1dd1a7d5c14fde9f045108f06": {
+ "auszuege": [
+ 1,
+ 2,
+ 4
+ ],
+ "begruendung": "[1] und [2] sagen ausdrücklich, dass Kafka mit seinen Nichten Tschechisch sprach; [4] stützt dies mit einem tschechischen Beispiel an seine Nichte Vera."
+ },
+ "625b0f0b60e802ecb1e84344bbc88f768316274f4dda29d485580a54c2fdc898": {
+ "auszuege": [
+ 1,
+ 2,
+ 4,
+ 5
+ ],
+ "begruendung": "Die Auszüge beschreiben die lautliche und buchstabenmäßige Entsprechung von Kafka und Samsa, insbesondere gleiche Vokalfolge beziehungsweise Buchstabenpositionen und einen Konsonantentausch; [4] ergänzt Kafkas Vorbehalt, Samsa sei kein vollständiges Kryptogramm für Kafka."
+ },
+ "d3f1476111efdf1d888ee6c5181cec65882fb25ff58e3db80519a5aa01d799f5": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Auszug 1 sagt ausdrücklich, dass das tschechische Wort „Kafka“ auf Deutsch „Dohle“ bedeutet."
+ },
+ "d4f3f3d74e6d3788c1b5695830048571cd4c539ba947fc95157b01742fe05ef5": {
+ "auszuege": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "begruendung": "Die Auszüge 1 bis 4 bezeichnen das Geschäft des Vaters als Galanteriewaren- beziehungsweise Kurzwarenhandlung, während Auszug 5 das Thema nicht beantwortet."
+ },
+ "53173d0b42df1056dcb885343e9a07e5c4ad816ce77fefca3a68ecba2fccaf65": {
+ "auszuege": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5
+ ],
+ "begruendung": "Alle Auszüge verorten Hermann Kafka in einem ärmlichen tschechisch-jüdischen ländlichen Milieu und nennen seine Herkunft als Sohn eines Fleischhauers beziehungsweise als wandernder Hausierer."
+ },
+ "de91e131ad6f54c06ae5d749d9da10a685c4e318563af2e5693c30f22df2c101": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Auszug 1 sagt ausdrücklich, dass Bachmann die Namengebung von Thomas Mann, Franz Kafka und James Joyce vergleicht."
+ },
+ "db6101aa6299e9a1b46b4a98aeee50e749967e497476b8b547681f79050a03e0": {
+ "auszuege": [
+ 1,
+ 2
+ ],
+ "begruendung": "[1] erläutert unmittelbar das ständige Schweben und Zurücknehmen von Aussagen, [2] nennt ergänzend Summierung und Verfremdung als notwendige Verfahren zur Darstellung der Totalität."
+ },
+ "2608dc0fae4f66648a0de419ff613a714bd5d730b1218598c206fe6a1c5c1669": {
+ "auszuege": [
+ 1,
+ 2,
+ 5
+ ],
+ "begruendung": "Die Auszüge 1, 2 und 5 nennen ausdrücklich den Band 22/23 der Reihe „Der jüngste Tag“."
+ },
+ "da142c5a92236cebf507cbc3dbca18b33cae1002981ab03b8154914911edb6f2": {
+ "auszuege": [
+ 1,
+ 2
+ ],
+ "begruendung": "Beide Auszüge sagen ausdrücklich, dass „Die Verwandlung“ seit Anfang 1913 abgeschlossen vorlag und erst 1915 veröffentlicht wurde."
+ },
+ "e88e68366655c39d57b75d83b7273c413d5400676ac3269765d824c9cd4bdce6": {
+ "auszuege": [
+ 1,
+ 3,
+ 5
+ ],
+ "begruendung": "Die Auszüge 1, 3 und 5 beschreiben Kafkas Helden als kleinbürgerlich geprägte, machtlose oder schwache Menschen, die an ihrem konflikthaften Verhältnis zur Gesellschaft scheitern."
+ },
+ "ff82906a55326c84ea32faa8d65afe5c1772a2ae14d504ca8c542e3dd4770720": {
+ "auszuege": [
+ 2,
+ 4
+ ],
+ "begruendung": "Beide Auszüge legen nahe, den Rigorismus zu korrigieren, indem man gesellschaftliche Lebensumstände und ihren Einfluss auf individuelles Versagen berücksichtigt, statt allein den Einzelnen zu verurteilen."
+ },
+ "f9fad44780948b61fa5731834bef581d96af1e4ba3bb78a527ebca31fda6a397": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Auszug 1 ordnet ausdrücklich Kafkas Erzählung „Die Verwandlung“ der Gattung der Großstadterzählung beziehungsweise -novelle zu."
+ },
+ "26131d6cb95d12f987f2780f651214ca4bc05eab1b94fb8c2a41a07fe6013e9b": {
+ "auszuege": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "begruendung": "Diese Auszüge nennen Gregor Samsa ausdrücklich als Protagonisten oder Helden der Erzählung."
+ },
+ "61843a26b7146112bedf6782cbb7c290f714a1bbb2ad24250667650c94301acf": {
+ "auszuege": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5
+ ],
+ "begruendung": "Alle Auszüge bezeichnen Gregors Gestalt ausdrücklich als Insekt beziehungsweise ungeheueres Ungeziefer; keiner legt eine eindeutige Tierart fest."
+ },
+ "af0bdc4808d5bb162b7e212e495f0cc48a1b528aaf9b369a99a96854e218f011": {
+ "auszuege": [],
+ "begruendung": "Keiner der Auszüge schildert, wie Gregor von seiner Familie aufgefunden wird; Auszug 3 erwähnt nur seinen Tod und das Verhalten der Familie danach."
+ },
+ "752052072e6ca9d584f02899bc658f34b121a46bcd15b44f486ce65ae49e15f4": {
+ "auszuege": [
+ 1,
+ 2
+ ],
+ "begruendung": "[1] schildert die Umkehr vom versorgenden Familienmitglied zum Ausgeschlossenen, [2] Gregors Wandel von Rücksichtnahme zu Gleichgültigkeit und Angriffslust gegenüber seiner Familie."
+ },
+ "f312aa1204eeab8dc336aca210ef6a696c84e754f5cab2b05f0ad543f93adc56": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Auszug 1 sagt ausdrücklich, dass Kafkas Familie seiner literarischen Produktion auch nach seinem Tod gleichgültig gegenüberstand."
+ },
+ "88380bd4d7e5900780d52288e15ff00419629a51db94bb03e919cb0602ea915a": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Auszug 1 sagt ausdrücklich, dass die Beurteilung des Vorgesetzten Gregors Selbstbild widerspricht und Zweifel an seinen Verkaufserfolgen weckt."
+ },
+ "8473d77f22a6ef34d98563dc93be81d01a132d78154bd9c6f0b6848618b7c0dd": {
+ "auszuege": [
+ 1,
+ 4
+ ],
+ "begruendung": "Beide Auszüge benennen den Widerspruch zwischen Gregors Selbstbild und der Einschätzung des Prokuristen, der Gregors wenige Abschlüsse kritisiert und dessen fachliche Kompetenz von Gregor selbst als maßgeblich anerkannt wird."
+ },
+ "6bd0fc3a3eb2bf0398c469f36751b45f378e4021e71c3ce1ddd154046efec73d": {
+ "auszuege": [
+ 1,
+ 2
+ ],
+ "begruendung": "Auszug 1 nennt den zweiten Band ausdrücklich, und Auszug 2 bestätigt Band 2 mit dem Anhang „Die Verwandlungen“."
+ },
+ "889f4f9fe48e953aca88e5044f62f4f13118ba4621f79ed06c0b6e5d4ba33897": {
+ "auszuege": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5
+ ],
+ "begruendung": "Alle Auszüge beschreiben konkrete Formen oder Funktionen von Gestik und Mimik bei Kafka, etwa ihre erzählerische Ökonomie, Deutung aus der Perspektive der Figuren, szenische Wirkung und Vieldeutigkeit."
+ },
+ "6db1ac7381c30cb3d867141c0dde839362190535503d8563368ba80709860eaa": {
+ "auszuege": [
+ 1,
+ 2,
+ 3,
+ 5
+ ],
+ "begruendung": "Diese Auszüge beschreiben konkrete Merkmale und Funktionen von Kafkas Bildformen, etwa ihr Verhältnis zu realistischer Darstellung, ihre symbolische Bedeutung, ein erweitertes Bildverständnis und werkübergreifende Bildgeflechte; Auszug 4 bleibt allgemein."
+ },
+ "1a57746f66670fccec00b100b37f48c9f0b7c66f6d0359155d5c97ad9b840fa8": {
+ "auszuege": [],
+ "begruendung": "Keiner der Auszüge deutet die drei Untermieter ausdrücklich aus einer biblischen Perspektive; ihre Dreizahl allein reicht für eine zutreffende Antwort nicht aus."
+ },
+ "2352e0d76305783f7d968a3e9d1f38ce4e6543dff09f6cdaafdf74ece8e92669": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Auszug 1 verknüpft ausdrücklich körperlichen Ekel mit Demütigung und Selbstdemütigung und erläutert den Zusammenhang am Kontrast zwischen der Dame im Pelz und Gregors entstelltem Körper."
+ },
+ "23b0c1227ca6ce0812b58c5d8756f7a47b5a832ecdaf8cc3a8756dec65d95f5c": {
+ "auszuege": [
+ 1,
+ 5
+ ],
+ "begruendung": "[1] deutet die Dame als unerreichbare Verkörperung eleganter Weltläufigkeit im Kontrast zu Gregor, [5] als Sinnbild libidinöser Verlockung."
+ },
+ "1d5bc038e540afd590b202a9498f520819ef6408aa3cc085f4cf8b975c5380f4": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Auszug 1 sagt ausdrücklich, Gregors Tod könne als seine „letzte Sohnespflicht“ gelten."
+ },
+ "ce529a5ad8384f681e8da68608ed35ef65227f1155696a8c0c2f8f7d75d89d3d": {
+ "auszuege": [
+ 2
+ ],
+ "begruendung": "Nur Auszug 2 nennt ausdrücklich den Ort: Die Eltern erfahren die Nachricht im aufrecht sitzenden Zustand im Ehebett."
+ },
+ "43093f44348571f34bf5e13d6c84ba200ec558410fdefe8f5be5a9cab446ada8": {
+ "auszuege": [
+ 1,
+ 2
+ ],
+ "begruendung": "Beide Auszüge nennen Binders Erklärung des Familiennamens Kafka aus „kajke“, einer niederdeutschen Diminutivform des Namens Jakob."
+ },
+ "5a6c5baf12785c2293824698ed705734fcd564e7d0fd160c0fa21d31896bfda6": {
+ "auszuege": [
+ 1,
+ 5
+ ],
+ "begruendung": "[1] sagt ausdrücklich, Kafka habe fast fehlerlos Tschechisch gesprochen, und [5] beschreibt seine Kommunikation auf Tschechisch im häuslichen Umfeld."
+ },
+ "887a03aff9884d2080db6ee9faddf57927068db65b8c847346a0a44c544fd650": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Auszug 1 nennt Kafkas Nichten ausdrücklich Marianne und Vera."
+ },
+ "95de9bbc505fbb913878bf7072618417b459cb1df9550b476e6e21f37f18ddee": {
+ "auszuege": [
+ 1,
+ 2,
+ 5
+ ],
+ "begruendung": "Die Auszüge 1 und 2 sagen ausdrücklich, dass Kafka mit seinen Nichten Tschechisch sprach; Auszug 5 bestätigt dies für die Kinder der Familien Valli und Ottla."
+ },
+ "d64b726dd60280ed45abc0f8dcbedb2ee83c17677ce71556a65e80b82dec1747": {
+ "auszuege": [
+ 1,
+ 2,
+ 3,
+ 5
+ ],
+ "begruendung": "Diese Auszüge beschreiben eine formale Abstimmung der Namen durch gleiche Buchstabenzahl sowie entsprechende Buchstabenpositionen, Vokalgleichklang oder Konsonantentausch."
+ },
+ "327dedb20feb52be2449f752db0e345aeb4c63d4df85c2bb9c7f0705442e3627": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Auszug 1 sagt ausdrücklich, dass „Kafka“ ein tschechisches Wort ist und auf Deutsch „Dohle“ bedeutet."
+ },
+ "94b863088e7f75c795ae3df7fe3bd9c64a02ff968173199857b60abfb41425e8": {
+ "auszuege": [
+ 1,
+ 2,
+ 3
+ ],
+ "begruendung": "Die Auszüge 1 und 2 nennen ausdrücklich ein Galanteriewarengeschäft beziehungsweise einen Galanteriewarenladen, und Auszug 3 bezeichnet den Vater als Galanteriewarenhändler."
+ },
+ "5e5512ba26a215132af3d9b71ed863bec808cf1ead7c2a5d7c2ab0abfc3cf76b": {
+ "auszuege": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "begruendung": "Die Auszüge 1–4 verorten Hermann Kafka in ärmlichen tschechisch-jüdischen Verhältnissen beziehungsweise im Provinzproletariat und nennen ihn als Sohn eines Fleischhauers oder wandernden Hausierer, während Auszug 5 nur seinen späteren Status als jüdischer Mittelständler beschreibt."
+ },
+ "a255cba7a525c368c59fae8c9c2668787cddeeb1a1640ae7057067fb7b381668": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Auszug 1 nennt ausdrücklich Thomas Mann, Franz Kafka und James Joyce als die Schriftsteller, deren Namengebung Bachmann vergleicht."
+ },
+ "e633b9b62814f3540764c63478cd250d98a36e6c678c11ed710516b35022f5ca": {
+ "auszuege": [
+ 1,
+ 4
+ ],
+ "begruendung": "Auszug 1 erläutert unmittelbar, dass die Form durch das ständige Korrigieren begrenzter Sprach- und Bildformen auf das Universelle ein Schweben und eine Entgrenzung erzeugt; Auszug 4 nennt dazu Summierung und Verfremdung als notwendige Voraussetzungen von Kafkas künstlerischer Methode."
+ },
+ "cdf6b6d768b853344281dfe999aeed405dc8c214a32ca09fe50a33d6608cca42": {
+ "auszuege": [
+ 1,
+ 4,
+ 5
+ ],
+ "begruendung": "Diese Auszüge nennen ausdrücklich Band 22/23 beziehungsweise Nr. 22/23 der Reihe „Der jüngste Tag“."
+ },
+ "95f5730a4c379018998c7c04fd5e1ead5ebe8f380fef47e199fbee01d1474c10": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Auszug 1 sagt ausdrücklich, dass „Die Verwandlung“ seit Anfang 1913 abgeschlossen vorlag und erst 1915 veröffentlicht wurde."
+ },
+ "eb6617010f4a314856cdabc02189fe8fa74728ebc18fb06528e1a50099150d64": {
+ "auszuege": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5
+ ],
+ "begruendung": "Alle Auszüge charakterisieren Kafkas Helden als Menschen, die sich in einer entfremdeten bürgerlichen Gesellschaft einsam, hilflos oder unterworfen erleben und an deren Lebensbedingungen scheitern."
+ },
+ "1ce9a81e5898beb700ba0b34aef0dc3c2bf56229d344f07d3f9d5c56af312c0e": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Auszug 1 nennt ausdrücklich einen Ansatz zur Korrektur: Bei der Beurteilung von Schuld auch die Umwelt zu berücksichtigen und eine Besserung sowie Wiedereingliederung zu ermöglichen."
+ },
+ "b8a61ffae0862f59279d9a176326b37134d2f1495678d4d128181984984d35c1": {
+ "auszuege": [
+ 1
+ ],
+ "begruendung": "Auszug 1 ordnet „Die Verwandlung“ ausdrücklich der Gattung der Großstadterzählung beziehungsweise Großstadtnovelle zu."
+ },
+ "7935b921838a7c54dc36f66233534e4bb46ad6355e16cd4341e21d2a4cbb188d": {
+ "auszuege": [
+ 1,
+ 2,
+ 3,
+ 5
+ ],
+ "begruendung": "Die Auszüge 1, 2 und 5 nennen Gregor Samsa ausdrücklich als Protagonisten beziehungsweise Helden, und Auszug 3 bezeichnet den Helden als Samsa; Auszug 4 nennt keinen konkreten Protagonisten."
+ },
+ "82235540a0f6fb8351ba94d4d1ce2a045a8b0ac4eec393cac7b55ea88e60cf7e": {
+ "auszuege": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5
+ ],
+ "begruendung": "Alle Auszüge nennen Gregors Verwandlung in Ungeziefer; Auszug 1 bezeichnet ihn außerdem als Käfer."
+ },
+ "27b3e2adc6e4905ff899ef4f7972ea5031778e97c1dff23ff1f0d0eba2f3bec9": {
+ "auszuege": [],
+ "begruendung": "Keiner der Auszüge schildert, in welchem Zustand oder unter welchen Umständen die Familie Gregor am Ende auffindet; Auszug 5 erwähnt nur, dass die Bedienstete seinen Tod meldet."
+ },
+ "75cd420d947ce5c46821e8709337faf8523821b41b24f0f3d3dec223aff5351c": {
+ "auszuege": [
+ 1,
+ 2,
+ 3,
+ 5
+ ],
+ "begruendung": "Diese Auszüge beschreiben die zunehmende Entfremdung und Umkehrung der Beziehungen: Gregor wird zunächst rücksichtsloser und gleichgültiger, während seine Familie ihn zunehmend ausgrenzt und einschließt."
+ }
+}
\ No newline at end of file
diff --git a/eval/kafka_human_judge_docling_2000_hdr.txt b/eval/kafka_human_judge_docling_2000_hdr.txt
new file mode 100644
index 0000000..f62981e
--- /dev/null
+++ b/eval/kafka_human_judge_docling_2000_hdr.txt
@@ -0,0 +1,126 @@
+====================================================================
+Retrieval-Auswertung — 2026-10-08 09:00
+====================================================================
+
+Konfiguration
+ Vektorspeicher ./vectorstore_docling_2000_hdr
+ Embedding-Modell BAAI/bge-m3
+ Chunk-Größe 2000 (Overlap 400)
+ Loader docling, Kopfzeilen an
+ Query-Zusatztext aus
+ Suche hybrid, Reranker BAAI/bge-reranker-v2-m3
+ Seitentoleranz ±1
+ Fragen 30
+
+Ergebnis
+ Recall@5 0.70 (21 von 30)
+ Recall@10 0.70 (21 von 30)
+ Recall@20 0.77 (23 von 30)
+ MRR 0.58
+
+Nach Korpus
+ primär Recall@5 0.00 MRR 0.02 (4 Fragen)
+ sekundär Recall@5 0.81 MRR 0.67 (26 Fragen)
+
+Einzelne Fragen (Rang = Position des ersten korrekten Treffers)
+ Rang 1 sekundär Wie stand Kafkas Familie seiner literarischen Tätigkeit nach Kafkas Tod gegenüber?
+ Rang 1 sekundär In welchem Band von Jacob Burckhardts Griechischer Kulturgeschichte gibt es ein eigenes Kapitel über Metamorphosen?
+ Rang 1 sekundär In welchem Zusammenhang stehen körperlicher Ekel und Selbstdemütigung in "Die Verwandlung"?
+ Rang 1 sekundär Wie kann das Bild der eleganten Dame in Gregors Zimmer gedeutet werden?
+ Rang 1 sekundär Was kann als "letzte Sohnespflicht" Gregors gedeutet werden?
+ Rang 1 sekundär Wie erklärt Binder die Etymologie des Familiennamens Kafka?
+ Rang 1 sekundär Wie heißen die beiden Nichten von Kafka?
+ Rang 1 sekundär Welche Sprache spricht Kafka mit seinen Nichten?
+ Rang 1 sekundär Was bedeutet das tschechische Wort "Kafka" auf Deutsch?
+ Rang 1 sekundär Welche Namen vergleicht Ingeborg Bachmann in ihrem Essay hinsichtlich der Namensgebung?
+ Rang 1 sekundär Wie interpretiert Emrich das Besondere an der Kafkaschen Form?
+ Rang 1 sekundär In welchem Band der Reihe "Der jüngste Tag" wurde "Die Verwandlung" veröffentlicht?
+ Rang 1 sekundär Seit wann lag "Die Verwandlung" abgeschlossen vor, ohne veröffentlicht zu sein?
+ Rang 1 sekundär Wie könnte man Kafkas ethischen Rigorismus korrigieren?
+ Rang 1 sekundär Welche Erzählung von Franz Kafka ist der Gattung der Großstadterzählung beziehungsweise Großstadtnovelle zuzuordnen?
+ Rang 2 sekundär Was kann man zu Bildformen in Kafkas Werken sagen?
+ Rang 2 sekundär Wo erfahren die Eltern die Nachricht von Gregors Tod?
+ Rang 2 sekundär Welche Art von Laden führte Kafkas Vater?
+ Rang 3 sekundär Inwiefern sind die Namen Kafka und Samsa aufeinander abgestimmt?
+ Rang 3 sekundär Aus welchem sozialen Milieu stammte Kafkas Vater genau?
+ Rang 5 sekundär Was kann man zu Formen der Gestik und Mimik in Kafkas Werken sagen?
+ Rang 14 primär In welche Art von Tier verwandelt sich Gregor Samsa?
+ Rang 18 sekundär Sprach Kafka Tschechisch?
+ Rang – sekundär Was sagen die Aussagen seines Vorgesetzten über Gregors berufliche Leistung aus?
+ Rang – sekundär Inwiefern steht Gregors Selbstwahrnehmung seiner beruflichen Leistung im Widerspruch zu den Aussagen seines Vorgesetzten?
+ Rang – sekundär Wie können die drei Untermieter der Familie Kafka aus einer biblischen Perspektive gedeutet werden?
+ Rang – sekundär Welche Art von Helden in einer Gesellschaft zeichnet Kafka in seinen Geschichten?
+ Rang – primär Wer ist der Protagonist von "Die Verwandlung"?
+ Rang – primär Unter welchen Umständen wird Gregor am Ende der Erzählung von seiner Familie aufgefunden?
+ Rang – primär Wie verändert sich Gregors Verhältnis zu seiner Familie im Verlauf der Erzählung?
+
+7 Frage(n) ohne Treffer unter den ersten 20.
+Prüfen: Steht die Fundstelle wirklich dort? Stimmt der Dateiname?
+Ist das Dokument überhaupt im Index (rag.list_documents())?
+
+Antwort im Kontext (Prüfung durch gpt-6-luna, erste 5 Treffer)
+ Antwort@5 0.93 (28 von 30)
+ MRR (Antwort) 0.92
+ Abgleich mit Seitenprüfung: beide ja 21, nur Modell ja 7, nur Seite ja 0
+
+ Einzelne Fragen (Treffer = erster Auszug, der die Frage beantwortet; Seite = Rang laut Fundstelle)
+ Treffer 1 | Seite 1 | Wie stand Kafkas Familie seiner literarischen Tätigkeit nach Kafkas Tod gegenüber?
+ Auszug 1 sagt ausdrücklich, dass Kafkas Familie seiner literarischen Produktion auch nach seinem Tod gleichgültig gegenüberstand.
+ Treffer 1 | Seite – | Was sagen die Aussagen seines Vorgesetzten über Gregors berufliche Leistung aus?
+ Auszug 1 sagt ausdrücklich, dass die Beurteilung des Vorgesetzten Gregors Selbstbild widerspricht und Zweifel an seinen Verkaufserfolgen weckt.
+ Treffer 1 | Seite – | Inwiefern steht Gregors Selbstwahrnehmung seiner beruflichen Leistung im Widerspruch zu den Aussagen seines Vorgesetzten?
+ Beide Auszüge benennen den Widerspruch zwischen Gregors Selbstbild und der Einschätzung des Prokuristen, der Gregors wenige Abschlüsse kritisiert und dessen fachliche Kompetenz von Gregor selbst als maßgeblich anerkannt wird.
+ Treffer 1 | Seite 1 | In welchem Band von Jacob Burckhardts Griechischer Kulturgeschichte gibt es ein eigenes Kapitel über Metamorphosen?
+ Auszug 1 nennt den zweiten Band ausdrücklich, und Auszug 2 bestätigt Band 2 mit dem Anhang „Die Verwandlungen“.
+ Treffer 1 | Seite 5 | Was kann man zu Formen der Gestik und Mimik in Kafkas Werken sagen?
+ Alle Auszüge beschreiben konkrete Formen oder Funktionen von Gestik und Mimik bei Kafka, etwa ihre erzählerische Ökonomie, Deutung aus der Perspektive der Figuren, szenische Wirkung und Vieldeutigkeit.
+ Treffer 1 | Seite 2 | Was kann man zu Bildformen in Kafkas Werken sagen?
+ Diese Auszüge beschreiben konkrete Merkmale und Funktionen von Kafkas Bildformen, etwa ihr Verhältnis zu realistischer Darstellung, ihre symbolische Bedeutung, ein erweitertes Bildverständnis und werkübergreifende Bildgeflechte; Auszug 4 bleibt allgemein.
+ Treffer 1 | Seite 1 | In welchem Zusammenhang stehen körperlicher Ekel und Selbstdemütigung in "Die Verwandlung"?
+ Auszug 1 verknüpft ausdrücklich körperlichen Ekel mit Demütigung und Selbstdemütigung und erläutert den Zusammenhang am Kontrast zwischen der Dame im Pelz und Gregors entstelltem Körper.
+ Treffer 1 | Seite 1 | Wie kann das Bild der eleganten Dame in Gregors Zimmer gedeutet werden?
+ [1] deutet die Dame als unerreichbare Verkörperung eleganter Weltläufigkeit im Kontrast zu Gregor, [5] als Sinnbild libidinöser Verlockung.
+ Treffer 1 | Seite 1 | Was kann als "letzte Sohnespflicht" Gregors gedeutet werden?
+ Auszug 1 sagt ausdrücklich, Gregors Tod könne als seine „letzte Sohnespflicht“ gelten.
+ Treffer 1 | Seite 1 | Wie erklärt Binder die Etymologie des Familiennamens Kafka?
+ Beide Auszüge nennen Binders Erklärung des Familiennamens Kafka aus „kajke“, einer niederdeutschen Diminutivform des Namens Jakob.
+ Treffer 1 | Seite – | Sprach Kafka Tschechisch?
+ [1] sagt ausdrücklich, Kafka habe fast fehlerlos Tschechisch gesprochen, und [5] beschreibt seine Kommunikation auf Tschechisch im häuslichen Umfeld.
+ Treffer 1 | Seite 1 | Wie heißen die beiden Nichten von Kafka?
+ Auszug 1 nennt Kafkas Nichten ausdrücklich Marianne und Vera.
+ Treffer 1 | Seite 1 | Welche Sprache spricht Kafka mit seinen Nichten?
+ Die Auszüge 1 und 2 sagen ausdrücklich, dass Kafka mit seinen Nichten Tschechisch sprach; Auszug 5 bestätigt dies für die Kinder der Familien Valli und Ottla.
+ Treffer 1 | Seite 3 | Inwiefern sind die Namen Kafka und Samsa aufeinander abgestimmt?
+ Diese Auszüge beschreiben eine formale Abstimmung der Namen durch gleiche Buchstabenzahl sowie entsprechende Buchstabenpositionen, Vokalgleichklang oder Konsonantentausch.
+ Treffer 1 | Seite 1 | Was bedeutet das tschechische Wort "Kafka" auf Deutsch?
+ Auszug 1 sagt ausdrücklich, dass „Kafka“ ein tschechisches Wort ist und auf Deutsch „Dohle“ bedeutet.
+ Treffer 1 | Seite 2 | Welche Art von Laden führte Kafkas Vater?
+ Die Auszüge 1 und 2 nennen ausdrücklich ein Galanteriewarengeschäft beziehungsweise einen Galanteriewarenladen, und Auszug 3 bezeichnet den Vater als Galanteriewarenhändler.
+ Treffer 1 | Seite 3 | Aus welchem sozialen Milieu stammte Kafkas Vater genau?
+ Die Auszüge 1–4 verorten Hermann Kafka in ärmlichen tschechisch-jüdischen Verhältnissen beziehungsweise im Provinzproletariat und nennen ihn als Sohn eines Fleischhauers oder wandernden Hausierer, während Auszug 5 nur seinen späteren Status als jüdischer Mittelständler beschreibt.
+ Treffer 1 | Seite 1 | Welche Namen vergleicht Ingeborg Bachmann in ihrem Essay hinsichtlich der Namensgebung?
+ Auszug 1 nennt ausdrücklich Thomas Mann, Franz Kafka und James Joyce als die Schriftsteller, deren Namengebung Bachmann vergleicht.
+ Treffer 1 | Seite 1 | Wie interpretiert Emrich das Besondere an der Kafkaschen Form?
+ Auszug 1 erläutert unmittelbar, dass die Form durch das ständige Korrigieren begrenzter Sprach- und Bildformen auf das Universelle ein Schweben und eine Entgrenzung erzeugt; Auszug 4 nennt dazu Summierung und Verfremdung als notwendige Voraussetzungen von Kafkas künstlerischer Methode.
+ Treffer 1 | Seite 1 | In welchem Band der Reihe "Der jüngste Tag" wurde "Die Verwandlung" veröffentlicht?
+ Diese Auszüge nennen ausdrücklich Band 22/23 beziehungsweise Nr. 22/23 der Reihe „Der jüngste Tag“.
+ Treffer 1 | Seite 1 | Seit wann lag "Die Verwandlung" abgeschlossen vor, ohne veröffentlicht zu sein?
+ Auszug 1 sagt ausdrücklich, dass „Die Verwandlung“ seit Anfang 1913 abgeschlossen vorlag und erst 1915 veröffentlicht wurde.
+ Treffer 1 | Seite – | Welche Art von Helden in einer Gesellschaft zeichnet Kafka in seinen Geschichten?
+ Alle Auszüge charakterisieren Kafkas Helden als Menschen, die sich in einer entfremdeten bürgerlichen Gesellschaft einsam, hilflos oder unterworfen erleben und an deren Lebensbedingungen scheitern.
+ Treffer 1 | Seite 1 | Wie könnte man Kafkas ethischen Rigorismus korrigieren?
+ Auszug 1 nennt ausdrücklich einen Ansatz zur Korrektur: Bei der Beurteilung von Schuld auch die Umwelt zu berücksichtigen und eine Besserung sowie Wiedereingliederung zu ermöglichen.
+ Treffer 1 | Seite 1 | Welche Erzählung von Franz Kafka ist der Gattung der Großstadterzählung beziehungsweise Großstadtnovelle zuzuordnen?
+ Auszug 1 ordnet „Die Verwandlung“ ausdrücklich der Gattung der Großstadterzählung beziehungsweise Großstadtnovelle zu.
+ Treffer 1 | Seite – | Wer ist der Protagonist von "Die Verwandlung"?
+ Die Auszüge 1, 2 und 5 nennen Gregor Samsa ausdrücklich als Protagonisten beziehungsweise Helden, und Auszug 3 bezeichnet den Helden als Samsa; Auszug 4 nennt keinen konkreten Protagonisten.
+ Treffer 1 | Seite – | In welche Art von Tier verwandelt sich Gregor Samsa?
+ Alle Auszüge nennen Gregors Verwandlung in Ungeziefer; Auszug 1 bezeichnet ihn außerdem als Käfer.
+ Treffer 1 | Seite – | Wie verändert sich Gregors Verhältnis zu seiner Familie im Verlauf der Erzählung?
+ Diese Auszüge beschreiben die zunehmende Entfremdung und Umkehrung der Beziehungen: Gregor wird zunächst rücksichtsloser und gleichgültiger, während seine Familie ihn zunehmend ausgrenzt und einschließt.
+ Treffer 2 | Seite 2 | Wo erfahren die Eltern die Nachricht von Gregors Tod?
+ Nur Auszug 2 nennt ausdrücklich den Ort: Die Eltern erfahren die Nachricht im aufrecht sitzenden Zustand im Ehebett.
+ Treffer – | Seite – | Wie können die drei Untermieter der Familie Kafka aus einer biblischen Perspektive gedeutet werden?
+ Keiner der Auszüge deutet die drei Untermieter ausdrücklich aus einer biblischen Perspektive; ihre Dreizahl allein reicht für eine zutreffende Antwort nicht aus.
+ Treffer – | Seite – | Unter welchen Umständen wird Gregor am Ende der Erzählung von seiner Familie aufgefunden?
+ Keiner der Auszüge schildert, in welchem Zustand oder unter welchen Umständen die Familie Gregor am Ende auffindet; Auszug 5 erwähnt nur, dass die Bedienstete seinen Tod meldet.
diff --git a/eval/kafka_human_judge_pypdf_2000.txt b/eval/kafka_human_judge_pypdf_2000.txt
new file mode 100644
index 0000000..c177f7d
--- /dev/null
+++ b/eval/kafka_human_judge_pypdf_2000.txt
@@ -0,0 +1,126 @@
+====================================================================
+Retrieval-Auswertung — 2026-10-08 08:44
+====================================================================
+
+Konfiguration
+ Vektorspeicher ./vectorstore_pypdf_2000
+ Embedding-Modell BAAI/bge-m3
+ Chunk-Größe 2000 (Overlap 400)
+ Loader pypdf, Kopfzeilen aus
+ Query-Zusatztext aus
+ Suche hybrid, Reranker BAAI/bge-reranker-v2-m3
+ Seitentoleranz ±1
+ Fragen 30
+
+Ergebnis
+ Recall@5 0.70 (21 von 30)
+ Recall@10 0.73 (22 von 30)
+ Recall@20 0.83 (25 von 30)
+ MRR 0.69
+
+Nach Korpus
+ primär Recall@5 0.00 MRR 0.02 (4 Fragen)
+ sekundär Recall@5 0.81 MRR 0.79 (26 Fragen)
+
+Einzelne Fragen (Rang = Position des ersten korrekten Treffers)
+ Rang 1 sekundär Wie stand Kafkas Familie seiner literarischen Tätigkeit nach Kafkas Tod gegenüber?
+ Rang 1 sekundär In welchem Band von Jacob Burckhardts Griechischer Kulturgeschichte gibt es ein eigenes Kapitel über Metamorphosen?
+ Rang 1 sekundär Was kann man zu Formen der Gestik und Mimik in Kafkas Werken sagen?
+ Rang 1 sekundär In welchem Zusammenhang stehen körperlicher Ekel und Selbstdemütigung in "Die Verwandlung"?
+ Rang 1 sekundär Wie kann das Bild der eleganten Dame in Gregors Zimmer gedeutet werden?
+ Rang 1 sekundär Was kann als "letzte Sohnespflicht" Gregors gedeutet werden?
+ Rang 1 sekundär Wo erfahren die Eltern die Nachricht von Gregors Tod?
+ Rang 1 sekundär Wie erklärt Binder die Etymologie des Familiennamens Kafka?
+ Rang 1 sekundär Wie heißen die beiden Nichten von Kafka?
+ Rang 1 sekundär Welche Sprache spricht Kafka mit seinen Nichten?
+ Rang 1 sekundär Inwiefern sind die Namen Kafka und Samsa aufeinander abgestimmt?
+ Rang 1 sekundär Was bedeutet das tschechische Wort "Kafka" auf Deutsch?
+ Rang 1 sekundär Welche Art von Laden führte Kafkas Vater?
+ Rang 1 sekundär Aus welchem sozialen Milieu stammte Kafkas Vater genau?
+ Rang 1 sekundär Welche Namen vergleicht Ingeborg Bachmann in ihrem Essay hinsichtlich der Namensgebung?
+ Rang 1 sekundär Wie interpretiert Emrich das Besondere an der Kafkaschen Form?
+ Rang 1 sekundär In welchem Band der Reihe "Der jüngste Tag" wurde "Die Verwandlung" veröffentlicht?
+ Rang 1 sekundär Seit wann lag "Die Verwandlung" abgeschlossen vor, ohne veröffentlicht zu sein?
+ Rang 1 sekundär Wie könnte man Kafkas ethischen Rigorismus korrigieren?
+ Rang 1 sekundär Welche Erzählung von Franz Kafka ist der Gattung der Großstadterzählung beziehungsweise Großstadtnovelle zuzuordnen?
+ Rang 5 sekundär Welche Art von Helden in einer Gesellschaft zeichnet Kafka in seinen Geschichten?
+ Rang 7 sekundär Wie können die drei Untermieter der Familie Kafka aus einer biblischen Perspektive gedeutet werden?
+ Rang 11 primär In welche Art von Tier verwandelt sich Gregor Samsa?
+ Rang 15 sekundär Sprach Kafka Tschechisch?
+ Rang 16 sekundär Was kann man zu Bildformen in Kafkas Werken sagen?
+ Rang – sekundär Was sagen die Aussagen seines Vorgesetzten über Gregors berufliche Leistung aus?
+ Rang – sekundär Inwiefern steht Gregors Selbstwahrnehmung seiner beruflichen Leistung im Widerspruch zu den Aussagen seines Vorgesetzten?
+ Rang – primär Wer ist der Protagonist von "Die Verwandlung"?
+ Rang – primär Unter welchen Umständen wird Gregor am Ende der Erzählung von seiner Familie aufgefunden?
+ Rang – primär Wie verändert sich Gregors Verhältnis zu seiner Familie im Verlauf der Erzählung?
+
+5 Frage(n) ohne Treffer unter den ersten 20.
+Prüfen: Steht die Fundstelle wirklich dort? Stimmt der Dateiname?
+Ist das Dokument überhaupt im Index (rag.list_documents())?
+
+Antwort im Kontext (Prüfung durch gpt-6-luna, erste 5 Treffer)
+ Antwort@5 0.93 (28 von 30)
+ MRR (Antwort) 0.90
+ Abgleich mit Seitenprüfung: beide ja 21, nur Modell ja 7, nur Seite ja 0
+
+ Einzelne Fragen (Treffer = erster Auszug, der die Frage beantwortet; Seite = Rang laut Fundstelle)
+ Treffer 1 | Seite 1 | Wie stand Kafkas Familie seiner literarischen Tätigkeit nach Kafkas Tod gegenüber?
+ Auszug 1 sagt ausdrücklich, dass Kafkas Familie seiner literarischen Produktion auch nach seinem Tod gleichgültig gegenüberstand.
+ Treffer 1 | Seite – | Was sagen die Aussagen seines Vorgesetzten über Gregors berufliche Leistung aus?
+ Auszug 1 sagt ausdrücklich, dass die Aussagen des Prokuristen Gregors Selbstbild widersprechen und Zweifel an seinen Verkaufserfolgen wecken.
+ Treffer 1 | Seite – | Inwiefern steht Gregors Selbstwahrnehmung seiner beruflichen Leistung im Widerspruch zu den Aussagen seines Vorgesetzten?
+ Auszug 1 benennt ausdrücklich den Widerspruch zwischen Gregors Selbstbild und der Beurteilung seiner beruflichen Leistungen durch den Prokuristen, der Gregors Verkaufserfolge infrage stellt.
+ Treffer 1 | Seite 1 | In welchem Band von Jacob Burckhardts Griechischer Kulturgeschichte gibt es ein eigenes Kapitel über Metamorphosen?
+ Auszug 1 nennt ausdrücklich Band 2 der Griechischen Kulturgeschichte und führt dort den Abschnitt „Die Verwandlungen“ auf.
+ Treffer 1 | Seite 1 | Was kann man zu Formen der Gestik und Mimik in Kafkas Werken sagen?
+ Die Auszüge beschreiben Gestik und Mimik als vieldeutige Ausdrucksformen, die innere Zustände knapp verkörpern und von Figuren beobachtet und gedeutet werden.
+ Treffer 1 | Seite – | Was kann man zu Bildformen in Kafkas Werken sagen?
+ Die Auszüge beschreiben Bildgestaltung bei Kafka sowohl als erzählerische Bilder und Bildkontraste beziehungsweise übertragene Rede als auch als realitätsnah oder abstrakt verselbständigte Bilder.
+ Treffer 1 | Seite 1 | In welchem Zusammenhang stehen körperlicher Ekel und Selbstdemütigung in "Die Verwandlung"?
+ Die Auszüge 1, 2, 3 und 5 verknüpfen Gregors körperlichen Ekel beziehungsweise seine abstoßende Gestalt ausdrücklich mit Demütigung und Selbsterniedrigung; Auszug 4 behandelt Ekel, stellt diesen Zusammenhang aber nicht her.
+ Treffer 1 | Seite 1 | Wie kann das Bild der eleganten Dame in Gregors Zimmer gedeutet werden?
+ Die Auszüge 1 und 2 deuten die Dame als unerreichbares Ideal und als demütigenden Kontrast zu Gregors Gestalt; Auszug 3 beschreibt das Bild als menschliches Kulturgut und deutet seine Verbindung von Mensch und Tier.
+ Treffer 1 | Seite 1 | Was kann als "letzte Sohnespflicht" Gregors gedeutet werden?
+ Auszug 1 sagt ausdrücklich, dass Gregors Tod ihm als „letzte Sohnespflicht“ bleibt.
+ Treffer 1 | Seite 1 | Wo erfahren die Eltern die Nachricht von Gregors Tod?
+ Nur Auszug 1 nennt ausdrücklich den Ort: Die Eltern erfahren die Nachricht aufrecht sitzend im Ehebett.
+ Treffer 1 | Seite 1 | Wie erklärt Binder die Etymologie des Familiennamens Kafka?
+ Auszug 1 gibt Binders Erklärung ausdrücklich wieder: Kafka leite sich von „kajke“, einer niederdeutschen Koseform von Jakob, ab.
+ Treffer 1 | Seite 1 | Wie heißen die beiden Nichten von Kafka?
+ Auszug 1 nennt Kafkas Nichten ausdrücklich Marianne und Vera.
+ Treffer 1 | Seite 1 | Welche Sprache spricht Kafka mit seinen Nichten?
+ [1] und [2] sagen ausdrücklich, dass Kafka mit seinen Nichten Tschechisch sprach; [4] stützt dies mit einem tschechischen Beispiel an seine Nichte Vera.
+ Treffer 1 | Seite 1 | Inwiefern sind die Namen Kafka und Samsa aufeinander abgestimmt?
+ Die Auszüge beschreiben die lautliche und buchstabenmäßige Entsprechung von Kafka und Samsa, insbesondere gleiche Vokalfolge beziehungsweise Buchstabenpositionen und einen Konsonantentausch; [4] ergänzt Kafkas Vorbehalt, Samsa sei kein vollständiges Kryptogramm für Kafka.
+ Treffer 1 | Seite 1 | Was bedeutet das tschechische Wort "Kafka" auf Deutsch?
+ Auszug 1 sagt ausdrücklich, dass das tschechische Wort „Kafka“ auf Deutsch „Dohle“ bedeutet.
+ Treffer 1 | Seite 1 | Welche Art von Laden führte Kafkas Vater?
+ Die Auszüge 1 bis 4 bezeichnen das Geschäft des Vaters als Galanteriewaren- beziehungsweise Kurzwarenhandlung, während Auszug 5 das Thema nicht beantwortet.
+ Treffer 1 | Seite 1 | Aus welchem sozialen Milieu stammte Kafkas Vater genau?
+ Alle Auszüge verorten Hermann Kafka in einem ärmlichen tschechisch-jüdischen ländlichen Milieu und nennen seine Herkunft als Sohn eines Fleischhauers beziehungsweise als wandernder Hausierer.
+ Treffer 1 | Seite 1 | Welche Namen vergleicht Ingeborg Bachmann in ihrem Essay hinsichtlich der Namensgebung?
+ Auszug 1 sagt ausdrücklich, dass Bachmann die Namengebung von Thomas Mann, Franz Kafka und James Joyce vergleicht.
+ Treffer 1 | Seite 1 | Wie interpretiert Emrich das Besondere an der Kafkaschen Form?
+ [1] erläutert unmittelbar das ständige Schweben und Zurücknehmen von Aussagen, [2] nennt ergänzend Summierung und Verfremdung als notwendige Verfahren zur Darstellung der Totalität.
+ Treffer 1 | Seite 1 | In welchem Band der Reihe "Der jüngste Tag" wurde "Die Verwandlung" veröffentlicht?
+ Die Auszüge 1, 2 und 5 nennen ausdrücklich den Band 22/23 der Reihe „Der jüngste Tag“.
+ Treffer 1 | Seite 1 | Seit wann lag "Die Verwandlung" abgeschlossen vor, ohne veröffentlicht zu sein?
+ Beide Auszüge sagen ausdrücklich, dass „Die Verwandlung“ seit Anfang 1913 abgeschlossen vorlag und erst 1915 veröffentlicht wurde.
+ Treffer 1 | Seite 5 | Welche Art von Helden in einer Gesellschaft zeichnet Kafka in seinen Geschichten?
+ Die Auszüge 1, 3 und 5 beschreiben Kafkas Helden als kleinbürgerlich geprägte, machtlose oder schwache Menschen, die an ihrem konflikthaften Verhältnis zur Gesellschaft scheitern.
+ Treffer 1 | Seite 1 | Welche Erzählung von Franz Kafka ist der Gattung der Großstadterzählung beziehungsweise Großstadtnovelle zuzuordnen?
+ Auszug 1 ordnet ausdrücklich Kafkas Erzählung „Die Verwandlung“ der Gattung der Großstadterzählung beziehungsweise -novelle zu.
+ Treffer 1 | Seite – | Wer ist der Protagonist von "Die Verwandlung"?
+ Diese Auszüge nennen Gregor Samsa ausdrücklich als Protagonisten oder Helden der Erzählung.
+ Treffer 1 | Seite – | In welche Art von Tier verwandelt sich Gregor Samsa?
+ Alle Auszüge bezeichnen Gregors Gestalt ausdrücklich als Insekt beziehungsweise ungeheueres Ungeziefer; keiner legt eine eindeutige Tierart fest.
+ Treffer 1 | Seite – | Wie verändert sich Gregors Verhältnis zu seiner Familie im Verlauf der Erzählung?
+ [1] schildert die Umkehr vom versorgenden Familienmitglied zum Ausgeschlossenen, [2] Gregors Wandel von Rücksichtnahme zu Gleichgültigkeit und Angriffslust gegenüber seiner Familie.
+ Treffer 2 | Seite – | Sprach Kafka Tschechisch?
+ Diese Auszüge belegen Tschechisch als Kafkas Umgangssprache und nennen konkrete mündliche Kommunikation, wobei Auszug 5 seine aktive Verwendung vorsichtiger formuliert.
+ Treffer 2 | Seite 1 | Wie könnte man Kafkas ethischen Rigorismus korrigieren?
+ Beide Auszüge legen nahe, den Rigorismus zu korrigieren, indem man gesellschaftliche Lebensumstände und ihren Einfluss auf individuelles Versagen berücksichtigt, statt allein den Einzelnen zu verurteilen.
+ Treffer – | Seite – | Wie können die drei Untermieter der Familie Kafka aus einer biblischen Perspektive gedeutet werden?
+ Keiner der Auszüge deutet die drei Untermieter ausdrücklich aus biblischer Perspektive; der biblische Apfelbezug in [2] betrifft eine andere Szene.
+ Treffer – | Seite – | Unter welchen Umständen wird Gregor am Ende der Erzählung von seiner Familie aufgefunden?
+ Keiner der Auszüge schildert, wie Gregor von seiner Familie aufgefunden wird; Auszug 3 erwähnt nur seinen Tod und das Verhalten der Familie danach.
diff --git a/eval_retrieval.py b/eval_retrieval.py
index fc32478..83e0e23 100644
--- a/eval_retrieval.py
+++ b/eval_retrieval.py
@@ -1,10 +1,16 @@
#!/usr/bin/env python3
-"""Bewertet die Retrieval-Qualität gegen einen Satz Referenzfragen. Kein LLM beteiligt.
+"""Bewertet die Retrieval-Qualität gegen einen Satz Referenzfragen.
Das Skript stellt jede Frage aus eval/goldset.csv an den Vektorspeicher und prüft,
ob die erwartete Fundstelle unter den ersten k Treffern auftaucht. Ergebnis sind
Recall@k und MRR, ausgegeben auf dem Bildschirm und in eval/baseline.txt.
+Optional (--judge MODELL) beurteilt zusätzlich ein Sprachmodell über die OpenAI-API,
+ob die Antwort in den ersten JUDGE_K Treffern steht — gleich in welchem Buch und auf
+welcher Seite. Das misst, was für den Chat zählt, und wertet gleichwertige Stellen
+aus anderen Quellen nicht als Fehler. Braucht OPENAI_API_KEY; die Urteile werden in
+eval/judge_cache.json zwischengespeichert, damit Wiederholungen nichts kosten.
+
Aus dem Projektordner starten: python eval_retrieval.py
Fragen, Index und Bericht lassen sich auf der Kommandozeile überschreiben, z. B.
@@ -34,7 +40,7 @@ GOLDSET_PATH = Path("eval/goldset.csv")
REPORT_PATH = Path("eval/baseline.txt")
# Muss mit server.py übereinstimmen, sonst wird ein anderer Index gemessen.
-VECTORSTORE_PATH = "./vectorstore_docling_hdr"
+VECTORSTORE_PATH = "./vectorstore_pypdf_2000"
# Für diese k-Werte wird Recall@k berechnet.
K_VALUES = [5, 10, 20]
@@ -51,8 +57,27 @@ PAGE_OFFSET = 1
# gelten noch als Treffer. 0 verlangt die exakte Seite.
PAGE_TOLERANCE = 1
+# Wie viele Treffer das Sprachmodell bei --judge zu sehen bekommt (wie RETRIEVAL_K im Chat).
+JUDGE_K = 5
+JUDGE_CACHE = Path("eval/judge_cache.json")
+
+JUDGE_PROMPT = """Du prüfst eine Literatursuche zu Franz Kafka. Unten stehen eine Frage und \
+{n} nummerierte Textauszüge aus Primär- und Sekundärliteratur (teils mit OCR-Fehlern).
+
+Entscheide für jeden Auszug, ob er die Frage beantwortet: ganz oder in ihrem wesentlichen \
+Kern, so dass man allein mit diesem Auszug eine zutreffende Antwort geben könnte. Ein Auszug, \
+der nur das Thema berührt, zählt nicht. Nutze kein eigenes Wissen über Kafka, nur die Auszüge.
+
+Antworte ausschließlich mit JSON in dieser Form:
+{{"auszuege": [Nummern der Auszüge, die die Frage beantworten], "begruendung": "ein Satz"}}
+
+Frage: {frage}
+
+{auszuege}"""
+
RETRIEVAL_SETUP = "" # wird in main() gesetzt und im Bericht vermerkt
INDEX_INFO = {} # Einstellungen, mit denen der Index gebaut wurde (index_info.json)
+JUDGE_MODEL = None # wird in main() aus --judge gesetzt
# -----------------------------------------------------------------------------
@@ -141,13 +166,74 @@ def evaluate(rag, goldset, max_k):
rank = position
break
- results.append({**item, "rank": rank})
+ results.append({**item, "rank": rank, "docs": docs})
marker = f"Rang {rank}" if rank else "nicht gefunden"
print(f" [{i}/{len(goldset)}] {marker:<15} {item['question'][:60]}")
return results
+def judge(results, model):
+ """Lässt ein Sprachmodell prüfen, welche der ersten JUDGE_K Treffer die Frage
+ beantworten. Ergänzt je Frage judge_rank (erster passender Treffer) und judge_note."""
+ import hashlib
+ import json
+ import re
+ from langchain_openai import ChatOpenAI
+
+ cache = json.loads(JUDGE_CACHE.read_text(encoding="utf-8")) if JUDGE_CACHE.exists() else {}
+ llm = ChatOpenAI(model=model)
+ for i, r in enumerate(results, start=1):
+ docs = r["docs"][:JUDGE_K]
+ excerpts = "\n\n".join(
+ f"[{n}] ({Path(d.metadata.get('source', '')).name}, Seite {d.metadata.get('page')})\n"
+ f"{' '.join(d.page_content.split())}" for n, d in enumerate(docs, start=1))
+ prompt = JUDGE_PROMPT.format(n=len(docs), frage=r["question"], auszuege=excerpts)
+ key = hashlib.sha256(f"{model}\n{prompt}".encode()).hexdigest()
+ if key not in cache:
+ reply = llm.invoke(prompt)
+ text = reply.content if hasattr(reply, "content") else str(reply)
+ if isinstance(text, list): # manche Modelle liefern Inhaltsblöcke
+ text = " ".join(part.get("text", "") if isinstance(part, dict) else str(part) for part in text)
+ match = re.search(r"\{.*\}", text, re.S)
+ try:
+ verdict = json.loads(match.group(0)) if match else {}
+ except json.JSONDecodeError:
+ verdict = {}
+ cache[key] = {"auszuege": sorted(int(n) for n in verdict.get("auszuege", []) if str(n).isdigit()),
+ "begruendung": verdict.get("begruendung", text[:200])}
+ JUDGE_CACHE.write_text(json.dumps(cache, ensure_ascii=False, indent=1), encoding="utf-8")
+ hits = [n for n in cache[key]["auszuege"] if 1 <= n <= len(docs)]
+ r["judge_rank"] = hits[0] if hits else None
+ r["judge_note"] = cache[key]["begruendung"]
+ marker = f"Treffer {r['judge_rank']}" if hits else "keine Antwort"
+ print(f" [{i}/{len(results)}] {marker:<15} {r['question'][:60]}")
+
+
+def judge_report(results, model):
+ """Berichtsteil für die Prüfung durch das Sprachmodell."""
+ n = len(results)
+ found = [r for r in results if r.get("judge_rank")]
+ page_hits = {id(r) for r in results if r["rank"] is not None and r["rank"] <= JUDGE_K}
+ both = sum(1 for r in found if id(r) in page_hits)
+ out = [
+ "",
+ f"Antwort im Kontext (Prüfung durch {model}, erste {JUDGE_K} Treffer)",
+ f" Antwort@{JUDGE_K:<11} {len(found) / n:.2f} ({len(found)} von {n})",
+ f" MRR (Antwort){'':<6} {sum(1 / r['judge_rank'] for r in found) / n:.2f}",
+ f" Abgleich mit Seitenprüfung: beide ja {both}, nur Modell ja {len(found) - both}, "
+ f"nur Seite ja {len(page_hits) - both}",
+ "",
+ " Einzelne Fragen (Treffer = erster Auszug, der die Frage beantwortet; Seite = Rang laut Fundstelle)",
+ ]
+ for r in sorted(results, key=lambda r: (r.get("judge_rank") is None, r.get("judge_rank") or 0)):
+ jr = r.get("judge_rank")
+ pr = r["rank"] if r["rank"] is not None and r["rank"] <= JUDGE_K else None
+ out.append(f" Treffer {jr if jr else '–':>2} | Seite {pr if pr else '–':>2} | {r['question']}")
+ out.append(f" {r.get('judge_note', '')}")
+ return out
+
+
def recall_at(results, k):
"""Anteil der Fragen, deren Fundstelle unter den ersten k Treffern liegt."""
if not results:
@@ -216,19 +302,24 @@ def build_report(results, embedding_model):
"Ist das Dokument überhaupt im Index (rag.list_documents())?",
]
+ if any("judge_rank" in r for r in results):
+ out += judge_report(results, JUDGE_MODEL)
+
out.append("")
return "\n".join(out)
def main():
global GOLDSET_PATH, VECTORSTORE_PATH, REPORT_PATH, USE_QUERY_INSTRUCTIONS
- parser = argparse.ArgumentParser(description="Retrieval-Auswertung ohne LLM")
+ parser = argparse.ArgumentParser(description="Retrieval-Auswertung")
parser.add_argument("--goldset", type=Path, default=GOLDSET_PATH)
parser.add_argument("--index", default=VECTORSTORE_PATH)
parser.add_argument("--report", type=Path, default=REPORT_PATH)
parser.add_argument("--mode", choices=["dense", "hybrid", "union"], default=None,
help="Suchmodus, Standard aus local_rag.RETRIEVAL_MODE")
parser.add_argument("--no-rerank", action="store_true", help="Cross-Encoder abschalten")
+ parser.add_argument("--judge", metavar="MODELL", default=None,
+ help="zusätzlich prüfen lassen, ob die Antwort in den ersten Treffern steht")
parser.add_argument("--query-instructions", action="store_true", default=USE_QUERY_INSTRUCTIONS,
help="Zusatztext aus local_rag.QUERY_ADDITIONAL_INSTRUCTIONS anhängen")
args = parser.parse_args()
@@ -240,8 +331,8 @@ def main():
print(f"{len(goldset)} Frage(n) geladen.\n")
# Lädt Embeddings und Vektorspeicher genau wie die Chat-Anwendung, damit
- # gemessen wird, was dort auch tatsächlich passiert. Es wird kein LLM
- # aufgerufen — nur die Ähnlichkeitssuche im Vektorspeicher.
+ # gemessen wird, was dort auch tatsächlich passiert. Ein LLM wird nur mit
+ # --judge aufgerufen, zur Beurteilung der Treffer, nicht zum Antworten.
options = {}
if args.mode:
options["retrieval_mode"] = args.mode
@@ -262,6 +353,11 @@ def main():
INDEX_INFO = json.loads(info_file.read_text(encoding="utf-8"))
RETRIEVAL_SETUP = f"{rag.retrieval_mode}, Reranker {rag.reranker_model or 'aus'}"
results = evaluate(rag, goldset, max_k=max(K_VALUES))
+ if args.judge:
+ global JUDGE_MODEL
+ JUDGE_MODEL = args.judge
+ print(f"\nLasse {args.judge} prüfen, ob die Antwort in den ersten {JUDGE_K} Treffern steht ...")
+ judge(results, args.judge)
report = build_report(results, rag.embeddings.model_name)
print("\n" + report)
diff --git a/local_rag.py b/local_rag.py
index 4219d3b..f40195b 100644
--- a/local_rag.py
+++ b/local_rag.py
@@ -19,9 +19,10 @@ from langchain_text_splitters import RecursiveCharacterTextSplitter
import docling_loader
# Pipeline tuning: used when adding documents (rebuild index after changing).
-# Characters, not tokens: 1500 characters of German prose are roughly 400 tokens.
-CHUNK_SIZE = 1500
-CHUNK_OVERLAP = 300
+# Characters, not tokens: 2000 characters of German prose are roughly 550 tokens.
+# With the reranker, 2000/400 beat 1500/300 on both Kafka goldsets (eval/matrix_2000.out).
+CHUNK_SIZE = 2000
+CHUNK_OVERLAP = 400
# Multilingual embedding model with a long input window (8192 tokens), so chunks
# are never truncated. Changing it requires rebuilding the index.
@@ -34,7 +35,9 @@ PDF_LOADER = "pypdf"
PROCESSED_DIR = "corpus_processed/data_split"
# Prefix every chunk with author and title from the file name (Docling: plus section),
# so questions like "according to Lehmann ..." can match. See docling_loader.chunk_header.
-CHUNK_HEADERS = True
+# Needed for Docling (which drops running heads); neutral to slightly harmful for pypdf,
+# whose pages carry the author in the running head anyway.
+CHUNK_HEADERS = False
# Retrieval / query tuning
RETRIEVAL_K = 5
@@ -75,7 +78,7 @@ class LocalRAG:
vectorstore_path="./vectorstore",
llm_provider="ollama",
ollama_model="gpt-oss:20b",
- openai_model="gpt-5-mini",
+ openai_model="gpt-6-luna",
ollama_base_url="http://localhost:11434",
pdf_loader=PDF_LOADER,
processed_dir=PROCESSED_DIR,
diff --git a/server.py b/server.py
index acd5abe..48f5845 100644
--- a/server.py
+++ b/server.py
@@ -12,10 +12,11 @@ from pydantic import BaseModel
from local_rag import LocalRAG
OLLAMA_MODEL = "gpt-oss:20b"
-OPENAI_MODEL = "gpt-5-mini"
-# Kafka corpus: Docling pipeline (split double pages) + chunk headers, bge-m3, hybrid search + reranker
-# built with: add_pdfs.py --data data --index ./vectorstore_docling_hdr --loader docling
-VECTORSTORE_PATH = "./vectorstore_docling_hdr"
+OPENAI_MODEL = "gpt-6-luna"
+# Kafka corpus: PyPDFLoader, chunks 2000/400 without headers, bge-m3, hybrid search + reranker.
+# Docling was not better at retrieval (eval/kafka_human_judge_*.txt), so pypdf stays for now.
+# built with: add_pdfs.py --data data --index ./vectorstore_pypdf_2000 --loader pypdf --no-headers
+VECTORSTORE_PATH = "./vectorstore_pypdf_2000"
# Dual RAG instances for on-the-fly provider switching
rag_ollama = LocalRAG(