feat: LLM-based fact extraction + robust entity parsing
CI / CI (pull_request) Successful in 11m41s

Entity extraction fixes:
- clean_llm_response() strips <think> tags, markdown fences, extracts JSON
- Handle array responses (wrap in {"entities": [...]})
- EntityType custom Deserialize: unknown variants map to Unknown (not crash)
- Increase timeout to 90s for reasoning models
- Increase max_tokens to 1500 for reasoning model overhead

Fact extraction (new):
- LlmFactExtractor: LLM-based relationship extraction between entities
- Validates source/target against known entity list (no hallucinated edges)
- Same clean_llm_response() for reasoning model + Ollama compatibility
- Graceful fallback: returns empty on LLM error (no pipeline crash)
- IngestWorker uses LlmFactExtractor when LLM_ENDPOINT set

K8s deployment:
- Add LLM_ENDPOINT, LLM_API_BASE, LLM_MODEL env vars
- Points to in-cluster reasoning-predictor service

Tested E2E with local Ollama (qwen2.5:3b):
- 12 entities extracted (person, tool, concept, organization)
- 5 edges with meaningful relationships and facts
- 781 tests pass
This commit is contained in:
2026-09-09 17:53:44 +09:00
parent 3184c39b79
commit 721589d251
5 changed files with 269 additions and 40 deletions
+7
View File
@@ -66,6 +66,13 @@ spec:
secretKeyRef:
name: poimen-memory-secrets
key: llm-api-key
# LLM config (in-cluster, no auth needed)
- name: LLM_ENDPOINT
value: "http://reasoning-predictor.llm-serving.svc.cluster.local/v1/chat/completions"
- name: LLM_API_BASE
value: "http://reasoning-predictor.llm-serving.svc.cluster.local/v1"
- name: LLM_MODEL
value: "reasoning"
# Server config (from ConfigMap)
- name: MEM_PORT
value: "8080"