Some checks failed
CI/CD Pipeline / Go Tests (push) Has been cancelled
CI/CD Pipeline / Python Tests (push) Has been cancelled
CI/CD Pipeline / Website Tests (push) Has been cancelled
CI/CD Pipeline / Linting (push) Has been cancelled
CI/CD Pipeline / Security Scan (push) Has been cancelled
CI/CD Pipeline / Docker Build & Push (push) Has been cancelled
CI/CD Pipeline / Integration Tests (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / CI Summary (push) Has been cancelled
Security Scanning / Go Security Scan (push) Has been cancelled
Security Scanning / Python Security Scan (push) Has been cancelled
Security Scanning / Node.js Security Scan (push) Has been cancelled
ci/woodpecker/push/integration Pipeline failed
ci/woodpecker/push/main Pipeline failed
Security Scanning / Secret Scanning (push) Has been cancelled
Security Scanning / Dependency Vulnerability Scan (push) Has been cancelled
Security Scanning / Docker Image Security (push) Has been cancelled
Tests / Go Lint (push) Has been cancelled
Tests / All Checks Passed (push) Has been cancelled
Security Scanning / Security Summary (push) Has been cancelled
Tests / Go Tests (push) Has been cancelled
Tests / Python Tests (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / Python Lint (push) Has been cancelled
Tests / Security Scan (push) Has been cancelled
Add complete Academy backend (Go) and frontend (Next.js) for DSGVO/IT-Security/AI-Literacy compliance training: - Go backend: Course CRUD, enrollments, quiz evaluation, PDF certificates (gofpdf), video generation pipeline (ElevenLabs + HeyGen) - In-memory data store with PostgreSQL migration for future DB support - Frontend: Course creation (AI + manual), lesson viewer, interactive quiz, certificate viewer with PDF download - Fix existing compile errors in generate.go (SearchResult type mismatch), llm/service.go (unused var), rag/service.go (Unicode chars) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
209 lines
9.5 KiB
Go
209 lines
9.5 KiB
Go
package rag
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
)
|
|
|
|
// SearchResult represents a search result from the RAG system
|
|
type SearchResult struct {
|
|
ID string `json:"id"`
|
|
Content string `json:"content"`
|
|
Source string `json:"source"`
|
|
Score float64 `json:"score"`
|
|
Metadata map[string]string `json:"metadata,omitempty"`
|
|
}
|
|
|
|
// CorpusStatus represents the status of the legal corpus
|
|
type CorpusStatus struct {
|
|
Status string `json:"status"`
|
|
Collections []string `json:"collections"`
|
|
Documents int `json:"documents"`
|
|
LastUpdated string `json:"lastUpdated,omitempty"`
|
|
}
|
|
|
|
// Service provides RAG functionality
|
|
type Service struct {
|
|
qdrantURL string
|
|
// client *qdrant.Client // Would be actual Qdrant client in production
|
|
}
|
|
|
|
// NewService creates a new RAG service
|
|
func NewService(qdrantURL string) (*Service, error) {
|
|
if qdrantURL == "" {
|
|
return nil, fmt.Errorf("qdrant URL is required")
|
|
}
|
|
|
|
// In production, this would initialize the Qdrant client
|
|
// client, err := qdrant.NewClient(qdrantURL)
|
|
// if err != nil {
|
|
// return nil, err
|
|
// }
|
|
|
|
return &Service{
|
|
qdrantURL: qdrantURL,
|
|
}, nil
|
|
}
|
|
|
|
// Search performs semantic search on the legal corpus
|
|
func (s *Service) Search(ctx context.Context, query string, topK int, collection string, filter string) ([]SearchResult, error) {
|
|
// In production, this would:
|
|
// 1. Generate embedding for the query using an embedding model (e.g., BGE-M3)
|
|
// 2. Search Qdrant for similar vectors
|
|
// 3. Return the results
|
|
|
|
// For now, return mock results that simulate a real RAG response
|
|
results := s.getMockSearchResults(query, topK)
|
|
return results, nil
|
|
}
|
|
|
|
// GetCorpusStatus returns the status of the legal corpus
|
|
func (s *Service) GetCorpusStatus(ctx context.Context) (*CorpusStatus, error) {
|
|
// In production, this would query Qdrant for collection info
|
|
return &CorpusStatus{
|
|
Status: "ready",
|
|
Collections: []string{
|
|
"legal_corpus",
|
|
"dsgvo_articles",
|
|
"ai_act_articles",
|
|
"nis2_articles",
|
|
},
|
|
Documents: 1500,
|
|
LastUpdated: "2026-02-01T00:00:00Z",
|
|
}, nil
|
|
}
|
|
|
|
// IndexDocument indexes a new document into the corpus
|
|
func (s *Service) IndexDocument(ctx context.Context, collection string, id string, content string, metadata map[string]string) error {
|
|
// In production, this would:
|
|
// 1. Generate embedding for the content
|
|
// 2. Store in Qdrant with the embedding and metadata
|
|
return nil
|
|
}
|
|
|
|
// getMockSearchResults returns mock search results for development
|
|
func (s *Service) getMockSearchResults(query string, topK int) []SearchResult {
|
|
// Comprehensive mock data for legal searches
|
|
allResults := []SearchResult{
|
|
// DSGVO Articles
|
|
{
|
|
ID: "dsgvo-art-5",
|
|
Content: "Art. 5 DSGVO - Grundsaetze fuer die Verarbeitung personenbezogener Daten\n\n(1) Personenbezogene Daten muessen:\na) auf rechtmaessige Weise, nach Treu und Glauben und in einer fuer die betroffene Person nachvollziehbaren Weise verarbeitet werden (Rechtmaessigkeit, Verarbeitung nach Treu und Glauben, Transparenz);\nb) fuer festgelegte, eindeutige und legitime Zwecke erhoben werden und duerfen nicht in einer mit diesen Zwecken nicht zu vereinbarenden Weise weiterverarbeitet werden (Zweckbindung);\nc) dem Zweck angemessen und erheblich sowie auf das fuer die Zwecke der Verarbeitung notwendige Mass beschraenkt sein (Datenminimierung);",
|
|
Source: "DSGVO",
|
|
Score: 0.95,
|
|
Metadata: map[string]string{
|
|
"article": "5",
|
|
"regulation": "DSGVO",
|
|
"category": "grundsaetze",
|
|
},
|
|
},
|
|
{
|
|
ID: "dsgvo-art-6",
|
|
Content: "Art. 6 DSGVO - Rechtmäßigkeit der Verarbeitung\n\n(1) Die Verarbeitung ist nur rechtmäßig, wenn mindestens eine der nachstehenden Bedingungen erfüllt ist:\na) Die betroffene Person hat ihre Einwilligung zu der Verarbeitung der sie betreffenden personenbezogenen Daten für einen oder mehrere bestimmte Zwecke gegeben;\nb) die Verarbeitung ist für die Erfüllung eines Vertrags erforderlich;\nc) die Verarbeitung ist zur Erfüllung einer rechtlichen Verpflichtung erforderlich;",
|
|
Source: "DSGVO",
|
|
Score: 0.92,
|
|
Metadata: map[string]string{
|
|
"article": "6",
|
|
"regulation": "DSGVO",
|
|
"category": "rechtsgrundlage",
|
|
},
|
|
},
|
|
{
|
|
ID: "dsgvo-art-30",
|
|
Content: "Art. 30 DSGVO - Verzeichnis von Verarbeitungstätigkeiten\n\n(1) Jeder Verantwortliche und gegebenenfalls sein Vertreter führen ein Verzeichnis aller Verarbeitungstätigkeiten, die ihrer Zuständigkeit unterliegen. Dieses Verzeichnis enthält sämtliche folgenden Angaben:\na) den Namen und die Kontaktdaten des Verantwortlichen;\nb) die Zwecke der Verarbeitung;\nc) eine Beschreibung der Kategorien betroffener Personen und der Kategorien personenbezogener Daten;",
|
|
Source: "DSGVO",
|
|
Score: 0.89,
|
|
Metadata: map[string]string{
|
|
"article": "30",
|
|
"regulation": "DSGVO",
|
|
"category": "dokumentation",
|
|
},
|
|
},
|
|
{
|
|
ID: "dsgvo-art-32",
|
|
Content: "Art. 32 DSGVO - Sicherheit der Verarbeitung\n\n(1) Unter Berücksichtigung des Stands der Technik, der Implementierungskosten und der Art, des Umfangs, der Umstände und der Zwecke der Verarbeitung sowie der unterschiedlichen Eintrittswahrscheinlichkeit und Schwere des Risikos für die Rechte und Freiheiten natürlicher Personen treffen der Verantwortliche und der Auftragsverarbeiter geeignete technische und organisatorische Maßnahmen, um ein dem Risiko angemessenes Schutzniveau zu gewährleisten.",
|
|
Source: "DSGVO",
|
|
Score: 0.88,
|
|
Metadata: map[string]string{
|
|
"article": "32",
|
|
"regulation": "DSGVO",
|
|
"category": "sicherheit",
|
|
},
|
|
},
|
|
{
|
|
ID: "dsgvo-art-35",
|
|
Content: "Art. 35 DSGVO - Datenschutz-Folgenabschätzung\n\n(1) Hat eine Form der Verarbeitung, insbesondere bei Verwendung neuer Technologien, aufgrund der Art, des Umfangs, der Umstände und der Zwecke der Verarbeitung voraussichtlich ein hohes Risiko für die Rechte und Freiheiten natürlicher Personen zur Folge, so führt der Verantwortliche vorab eine Abschätzung der Folgen der vorgesehenen Verarbeitungsvorgänge für den Schutz personenbezogener Daten durch.",
|
|
Source: "DSGVO",
|
|
Score: 0.87,
|
|
Metadata: map[string]string{
|
|
"article": "35",
|
|
"regulation": "DSGVO",
|
|
"category": "dsfa",
|
|
},
|
|
},
|
|
// AI Act Articles
|
|
{
|
|
ID: "ai-act-art-6",
|
|
Content: "Art. 6 AI Act - Klassifizierungsregeln für Hochrisiko-KI-Systeme\n\n(1) Unbeschadet des Absatzes 2 gilt ein KI-System als Hochrisiko-KI-System, wenn es beide der folgenden Bedingungen erfüllt:\na) das KI-System soll als Sicherheitskomponente eines unter die in Anhang II aufgeführten Harmonisierungsrechtsvorschriften der Union fallenden Produkts verwendet werden oder ist selbst ein solches Produkt;\nb) das Produkt, dessen Sicherheitskomponente das KI-System ist, oder das KI-System selbst muss einer Konformitätsbewertung durch Dritte unterzogen werden.",
|
|
Source: "AI Act",
|
|
Score: 0.91,
|
|
Metadata: map[string]string{
|
|
"article": "6",
|
|
"regulation": "AI_ACT",
|
|
"category": "klassifizierung",
|
|
},
|
|
},
|
|
{
|
|
ID: "ai-act-art-9",
|
|
Content: "Art. 9 AI Act - Risikomanagement\n\n(1) Für Hochrisiko-KI-Systeme wird ein Risikomanagementsystem eingerichtet, umgesetzt, dokumentiert und aufrechterhalten. Das Risikomanagementsystem ist ein kontinuierlicher iterativer Prozess, der während des gesamten Lebenszyklus eines Hochrisiko-KI-Systems geplant und durchgeführt wird und einer regelmäßigen systematischen Aktualisierung bedarf.",
|
|
Source: "AI Act",
|
|
Score: 0.85,
|
|
Metadata: map[string]string{
|
|
"article": "9",
|
|
"regulation": "AI_ACT",
|
|
"category": "risikomanagement",
|
|
},
|
|
},
|
|
{
|
|
ID: "ai-act-art-52",
|
|
Content: "Art. 52 AI Act - Transparenzpflichten für bestimmte KI-Systeme\n\n(1) Die Anbieter stellen sicher, dass KI-Systeme, die für die Interaktion mit natürlichen Personen bestimmt sind, so konzipiert und entwickelt werden, dass die betreffenden natürlichen Personen darüber informiert werden, dass sie mit einem KI-System interagieren, es sei denn, dies ist aus den Umständen und dem Nutzungskontext offensichtlich.",
|
|
Source: "AI Act",
|
|
Score: 0.83,
|
|
Metadata: map[string]string{
|
|
"article": "52",
|
|
"regulation": "AI_ACT",
|
|
"category": "transparenz",
|
|
},
|
|
},
|
|
// NIS2 Articles
|
|
{
|
|
ID: "nis2-art-21",
|
|
Content: "Art. 21 NIS2 - Risikomanagementmaßnahmen im Bereich der Cybersicherheit\n\n(1) Die Mitgliedstaaten stellen sicher, dass wesentliche und wichtige Einrichtungen geeignete und verhältnismäßige technische, operative und organisatorische Maßnahmen ergreifen, um die Risiken für die Sicherheit der Netz- und Informationssysteme, die diese Einrichtungen für ihren Betrieb oder die Erbringung ihrer Dienste nutzen, zu beherrschen und die Auswirkungen von Sicherheitsvorfällen auf die Empfänger ihrer Dienste und auf andere Dienste zu verhindern oder möglichst gering zu halten.",
|
|
Source: "NIS2",
|
|
Score: 0.86,
|
|
Metadata: map[string]string{
|
|
"article": "21",
|
|
"regulation": "NIS2",
|
|
"category": "risikomanagement",
|
|
},
|
|
},
|
|
{
|
|
ID: "nis2-art-23",
|
|
Content: "Art. 23 NIS2 - Meldepflichten\n\n(1) Jeder Mitgliedstaat stellt sicher, dass wesentliche und wichtige Einrichtungen jeden Sicherheitsvorfall, der erhebliche Auswirkungen auf die Erbringung ihrer Dienste hat, unverzüglich dem zuständigen CSIRT oder gegebenenfalls der zuständigen Behörde melden.",
|
|
Source: "NIS2",
|
|
Score: 0.81,
|
|
Metadata: map[string]string{
|
|
"article": "23",
|
|
"regulation": "NIS2",
|
|
"category": "meldepflicht",
|
|
},
|
|
},
|
|
}
|
|
|
|
// Return top K results
|
|
if topK > len(allResults) {
|
|
topK = len(allResults)
|
|
}
|
|
return allResults[:topK]
|
|
}
|