feat(rag): lite-model document summaries — non-markdown docs summarized at import, summary chunk retrieves and resolves to the full source doc
This commit is contained in:
+17
-1
@@ -2,6 +2,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from app.config import Settings
|
||||
from app.rag.llm import LLMError
|
||||
|
||||
|
||||
class FakeEmbedder:
|
||||
@@ -9,7 +10,11 @@ class FakeEmbedder:
|
||||
``Embedder`` protocol in :mod:`app.rag.importer`).
|
||||
|
||||
Returns deterministic vectors of *dim* dimensions; records every call
|
||||
so tests can assert batching behaviour.
|
||||
so tests can assert batching behaviour. ``chat`` is the deterministic
|
||||
``lite``-model stand-in (phase 30): it returns
|
||||
``"Summary of <first token of the user content>"`` and raises
|
||||
:class:`LLMError` when the content contains the sentinel word
|
||||
``SUMMARY-BLOWUP`` (drives the importer's fail-soft summary path).
|
||||
"""
|
||||
|
||||
def __init__(self, dim: int = 768) -> None:
|
||||
@@ -17,8 +22,19 @@ class FakeEmbedder:
|
||||
self.settings = Settings(_env_file=None) # pyright: ignore[reportCallIssue]
|
||||
self.embed_batches = 0
|
||||
self.calls: list[list[str]] = []
|
||||
self.chat_calls: list[list[dict[str, str]]] = []
|
||||
|
||||
async def embed(self, texts: list[str]) -> list[list[float]]:
|
||||
self.calls.append(list(texts))
|
||||
self.embed_batches += 1
|
||||
return [[0.01 * (i % 97) for i in range(self.dim)] for _ in texts]
|
||||
|
||||
async def chat(
|
||||
self, messages: list[dict[str, str]], model: str | None = None
|
||||
) -> str:
|
||||
self.chat_calls.append(list(messages))
|
||||
user = next((m["content"] for m in messages if m.get("role") == "user"), "")
|
||||
if "SUMMARY-BLOWUP" in user:
|
||||
raise LLMError("simulated lite-model failure (SUMMARY-BLOWUP sentinel)")
|
||||
first = user.split()
|
||||
return "Summary of " + (first[0] if first else "<empty>")
|
||||
|
||||
Reference in New Issue
Block a user