discord kommunikation

This commit is contained in:
Christoph K.
2026-03-12 19:16:29 +01:00
parent 92f520101a
commit 5337e7af6f
7 changed files with 249 additions and 16 deletions

View File

@@ -21,27 +21,21 @@ type KnowledgeChunk struct {
Source string
}
// Ask sucht relevante Chunks und generiert eine LLM-Antwort per Streaming.
func Ask(question string) {
// AskQuery sucht relevante Chunks und generiert eine LLM-Antwort.
// Gibt die Antwort als String und die verwendeten Quellen zurück.
func AskQuery(question string) (string, []KnowledgeChunk, error) {
ctx := context.Background()
ctx = metadata.AppendToOutgoingContext(ctx, "api-key", config.Cfg.Qdrant.APIKey)
fmt.Printf("🤔 Frage: \"%s\"\n\n", question)
embClient := config.NewEmbeddingClient()
chatClient := config.NewChatClient()
fmt.Println("🔍 Durchsuche lokale Wissensdatenbank...")
chunks := searchKnowledge(ctx, embClient, question)
if len(chunks) == 0 {
fmt.Println("\n❌ Keine relevanten Informationen in der Datenbank gefunden.")
fmt.Println(" Füge mehr Daten mit './bin/ingest' hinzu.")
return
return "", nil, nil
}
contextText := buildContext(chunks)
fmt.Printf("✅ %d relevante Informationen gefunden\n\n", len(chunks))
systemPrompt := `Du bist ein hilfreicher persönlicher Assistent.
Deine Aufgabe ist es, Fragen basierend auf den bereitgestellten Informationen zu beantworten.
@@ -60,9 +54,6 @@ WICHTIGE REGELN:
Basierend auf diesen Informationen, beantworte bitte folgende Frage:
%s`, contextText, question)
fmt.Println("🧠 Generiere Antwort mit lokalem Modell...")
fmt.Println(strings.Repeat("═", 80))
stream, err := chatClient.CreateChatCompletionStream(ctx, openai.ChatCompletionRequest{
Model: config.Cfg.Chat.Model,
Messages: []openai.ChatCompletionMessage{
@@ -73,21 +64,45 @@ Basierend auf diesen Informationen, beantworte bitte folgende Frage:
MaxTokens: 500,
})
if err != nil {
log.Fatalf("LLM Fehler: %v", err)
return "", nil, fmt.Errorf("LLM Fehler: %w", err)
}
defer stream.Close()
fmt.Print("\n💬 Antwort:\n\n")
var answer strings.Builder
for {
response, err := stream.Recv()
if err != nil {
break
}
if len(response.Choices) > 0 {
fmt.Print(response.Choices[0].Delta.Content)
answer.WriteString(response.Choices[0].Delta.Content)
}
}
return answer.String(), chunks, nil
}
// Ask sucht relevante Chunks und gibt Antwort + Quellen auf stdout aus.
func Ask(question string) {
fmt.Printf("🤔 Frage: \"%s\"\n\n", question)
fmt.Println("🔍 Durchsuche lokale Wissensdatenbank...")
answer, chunks, err := AskQuery(question)
if err != nil {
log.Fatalf("❌ %v", err)
}
if len(chunks) == 0 {
fmt.Println("\n❌ Keine relevanten Informationen in der Datenbank gefunden.")
fmt.Println(" Füge mehr Daten mit './bin/ingest' hinzu.")
return
}
fmt.Printf("✅ %d relevante Informationen gefunden\n\n", len(chunks))
fmt.Println("🧠 Generiere Antwort mit lokalem Modell...")
fmt.Println(strings.Repeat("═", 80))
fmt.Print("\n💬 Antwort:\n\n")
fmt.Print(answer)
fmt.Print("\n\n")
fmt.Println(strings.Repeat("═", 80))
fmt.Print("\n📚 Verwendete Quellen:\n")

View File

@@ -31,6 +31,11 @@ type Config struct {
Model string `yaml:"model"`
} `yaml:"chat"`
Discord struct {
Token string `yaml:"token"`
GuildID string `yaml:"guild_id"`
} `yaml:"discord"`
BrainRoot string `yaml:"brain_root"`
TopK uint64 `yaml:"top_k"`
ScoreThreshold float32 `yaml:"score_threshold"`