Commit 3d666534 authored by Kantz's avatar Kantz
Browse files

weitere anpassungen des Retrivals

parent 5d1db923
...@@ -7,6 +7,8 @@ from datetime import datetime ...@@ -7,6 +7,8 @@ from datetime import datetime
from threading import Lock from threading import Lock
from typing import Any from typing import Any
from app.deterministic_services import Source
_CACHE: dict[str, dict[str, Any]] = {} _CACHE: dict[str, dict[str, Any]] = {}
_LOCK = Lock() _LOCK = Lock()
...@@ -74,10 +76,9 @@ def update_history(sheet: dict[str, Any], messages: list[dict]) -> None: ...@@ -74,10 +76,9 @@ def update_history(sheet: dict[str, Any], messages: list[dict]) -> None:
def add_retrieval_context( def add_retrieval_context(
sheet: dict[str, Any], sheet: dict[str, Any],
query: str, query: str,
context: str, sources: list[Source],
sources: list[dict],
) -> None: ) -> None:
retrieval_entry = {"query": query, "context": context, "sources": sources} retrieval_entry = {"query": query, "sources": [source.to_string() for source in sources]}
sheet["retrieval_contexts"].append(retrieval_entry) sheet["retrieval_contexts"].append(retrieval_entry)
sheet["updated_at"] = _utc_now() sheet["updated_at"] = _utc_now()
...@@ -85,14 +86,12 @@ def add_retrieval_context( ...@@ -85,14 +86,12 @@ def add_retrieval_context(
def update_retrieval_context( def update_retrieval_context(
sheet: dict[str, Any], sheet: dict[str, Any],
query: str, query: str,
context: str, sources: list[Source],
sources: list[dict],
) -> None: ) -> None:
retrievals = sheet.get("retrieval_contexts", []) retrievals = sheet.get("retrieval_contexts", [])
if retrievals: if retrievals:
latest_retrieval = retrievals[-1] latest_retrieval = retrievals[-1]
latest_retrieval["context"] = context latest_retrieval["sources"] = [source.to_string() for source in sources]
latest_retrieval["sources"] = sources
latest_retrieval["query"] = query latest_retrieval["query"] = query
sheet["updated_at"] = _utc_now() sheet["updated_at"] = _utc_now()
......
...@@ -13,15 +13,15 @@ def _append_tool_log(tool_log: list[dict], name: str, args: dict, response: obje ...@@ -13,15 +13,15 @@ def _append_tool_log(tool_log: list[dict], name: str, args: dict, response: obje
def _bootstrap_context(sheet: dict, query_text: str, tool_log: list[dict]) -> None: def _bootstrap_context(sheet: dict, query_text: str, tool_log: list[dict]) -> None:
# Erstelle einen neuen Retrieval-Block oder aktualisiere den bestehenden # Erstelle einen neuen Retrieval-Block oder aktualisiere den bestehenden
context, sources = retrieval_service.retrieve_context(query_text=query_text) sources = retrieval_service.retrieve_context(query_text=query_text)
retrievals = sheet.get("retrieval_contexts", []) retrievals = sheet.get("retrieval_contexts", [])
if retrievals: if retrievals:
context_store.update_retrieval_context(sheet, query_text, context, sources) context_store.update_retrieval_context(sheet, query_text, sources)
_append_tool_log(tool_log, "update_retrieve_context", {"query": query_text}, {"context": context, "sources": sources}) _append_tool_log(tool_log, "update_retrieve_context", {"query": query_text}, {"sources": [source.to_string() for source in sources]})
else: else:
context_store.add_retrieval_context(sheet, query_text, context, sources) context_store.add_retrieval_context(sheet, query_text, sources)
_append_tool_log(tool_log, "retrieve_context", {"query": query_text}, {"context": context, "sources": sources}) _append_tool_log(tool_log, "retrieve_context", {"query": query_text}, {"sources": [source.to_string() for source in sources]})
math_request = math_intent_LLM.extract_math_request(query_text) math_request = math_intent_LLM.extract_math_request(query_text)
if math_request: if math_request:
......
from __future__ import annotations from __future__ import annotations
from typing import List from collections import defaultdict
from typing import Dict, List
from app.deterministic_services import Source
from app import config from app import config
from app.deterministic_services.embeddings import OpenAILikeEmbeddings from app.deterministic_services.embeddings import OpenAILikeEmbeddings
from app.deterministic_services import vector_store from app.deterministic_services import vector_store
CONTEXT_LIMITS = {
"direct": 4,
"indirect": 6,
"subsection": 2,
"section": 1,
}
def _get_embedder() -> OpenAILikeEmbeddings: def _get_embedder() -> OpenAILikeEmbeddings:
settings = config.get_embedding_settings() settings = config.get_embedding_settings()
return OpenAILikeEmbeddings( return OpenAILikeEmbeddings(
...@@ -24,73 +18,14 @@ def _get_embedder() -> OpenAILikeEmbeddings: ...@@ -24,73 +18,14 @@ def _get_embedder() -> OpenAILikeEmbeddings:
) )
def _format_ref(doc: vector_store.Retrieved) -> str: def retrieve_context(query_text: str, pg_url: str | None = None) -> List[Source]:
meta = doc.metadata
sec = meta.get("section_index")
sub = meta.get("subsection_index")
child = meta.get("child_index")
ref = []
if sec is not None:
ref.append(f"s{sec}")
if sub is not None:
ref.append(f"ss{sub}")
if child is not None:
ref.append(f"c{child}")
ref_id = "/".join(ref) if ref else "unknown"
doc_type = meta.get("type") or doc.doc_type
title = (
meta.get("title")
or meta.get("subsection_title")
or meta.get("section_title")
or meta.get("path")
or "Untitled"
)
return f"[{ref_id} | {doc_type} | {title}]"
def _append_group(
label: str,
items: List[vector_store.Retrieved],
limit: int,
blocks: List[str],
sources: List[dict],
) -> None:
if not items:
return
for doc in items[:limit]:
ref = _format_ref(doc)
blocks.append(f"{label} {ref}\n{doc.markdown}")
sources.append({
"ref": ref,
"context": doc.markdown,
"score": doc.score,
"label": label
})
def build_context(result: dict) -> tuple[str, List[dict]]:
blocks: List[str] = []
sources: List[dict] = []
_append_group("DIRECT", result.get("children_direct", []), CONTEXT_LIMITS["direct"], blocks, sources)
_append_group("INDIRECT", result.get("children_expanded", []), CONTEXT_LIMITS["indirect"], blocks, sources)
_append_group("SUBSECTION", result.get("subsections", []), CONTEXT_LIMITS["subsection"], blocks, sources)
_append_group("SECTION", result.get("sections", []), CONTEXT_LIMITS["section"], blocks, sources)
if not blocks:
return "KONTEXT: (leer)", sources
return "KONTEXT:\n" + "\n\n".join(blocks), sources
def retrieve_context(query_text: str, pg_url: str | None = None) -> tuple[str, List[dict]]:
url = pg_url or config.get_postgres_url() url = pg_url or config.get_postgres_url()
embedder = _get_embedder() embedder = _get_embedder()
retrieval = vector_store.retrieve( sources = vector_store.retrieve(
pg_url=url, pg_url=url,
embedder=embedder, embedder=embedder,
query=query_text, query=query_text,
k=8, k=8,
expand_links=True, expand_links=True,
) )
return build_context(retrieval) return sources
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment