From b3e4ec4f4c8162b036f7bf6576517d35ea8464cc Mon Sep 17 00:00:00 2001 From: wonder Date: Mon, 20 Apr 2026 14:23:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=A2=84=E8=AE=BE=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E8=AF=8D=E7=9A=84=E5=AF=B9=E8=AF=9D=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/internal/llm/client.go | 22 ++++++++++++ backend/internal/llm/client_test.go | 56 +++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/backend/internal/llm/client.go b/backend/internal/llm/client.go index ef92e16..48d3ebb 100644 --- a/backend/internal/llm/client.go +++ b/backend/internal/llm/client.go @@ -44,5 +44,27 @@ func (c *Client) Chat(ctx context.Context, messages []llms.MessageContent) (stri } log.Printf("[INFO] Chat completed successfully, choice length: %d", len(resp.Choices[0].Content)) + return resp.Choices[0].Content, nil +} + +// Client包含系统提示词的调用 +func (c *Client) ChatWithSystemPrompt(ctx context.Context, systemPrompt string, messages []llms.MessageContent) (string, error) { + // 构造系统提示词消息 + systemMessage := llms.TextParts(llms.ChatMessageTypeSystem, systemPrompt) + + // 将系统提示词插入到消息列表头部 + allMessages := append([]llms.MessageContent{systemMessage}, messages...) + + resp, err := c.llm.GenerateContent(ctx, allMessages) + if err != nil { + log.Printf("[ERROR] GenerateContent with system prompt failed: %v", err) + return "", fmt.Errorf("generate content error: %w", err) + } + if resp == nil || len(resp.Choices) == 0 { + log.Printf("[WARN] Response with system prompt is empty or has no choices") + return "", fmt.Errorf("no content choices returned") + } + log.Printf("[INFO] Chat with system prompt completed successfully, choice length: %d", len(resp.Choices[0].Content)) + return resp.Choices[0].Content, nil } \ No newline at end of file diff --git a/backend/internal/llm/client_test.go b/backend/internal/llm/client_test.go index 185118a..f20e8df 100644 --- a/backend/internal/llm/client_test.go +++ b/backend/internal/llm/client_test.go @@ -91,4 +91,60 @@ func TestClient_Chat(t *testing.T) { } log.Printf("[INFO] TestClient_Chat completed successfully") +} + +func TestClient_ChatWithSystemPrompt(t *testing.T) { + // 1. 加载配置 + cfg, err := config.Load() + if err != nil { + log.Printf("[WARN] config.Load() returned error: %v, using default config", err) + } else { + log.Printf("[INFO] config loaded successfully, LLM config: %+v", cfg.LLM) + } + + // 2. 创建客户端 + client, err := NewClient(cfg.LLM) + if err != nil { + log.Printf("[ERROR] NewClient() returned unexpected error: %v", err) + t.Fatalf("NewClient() returned unexpected error: %v", err) + } + log.Printf("[INFO] NewClient() succeeded, client created") + + // 3. 构造系统提示词与消息列表 + systemPrompt := "你是一个专业的知识图谱助手,请用简洁的中文回答问题。" + messages := []llms.MessageContent{ + { + Role: "human", + Parts: []llms.ContentPart{ + llms.TextContent{Text: "请简要介绍一下知识图谱的概念"}, + }, + }, + } + log.Printf("[INFO] preparing chat with system prompt request, system prompt: %q, messages count: %d, content: %q", systemPrompt, len(messages), messages[0].Parts[0].(llms.TextContent).Text) + + // 4. 调用被测方法 + log.Printf("[INFO] calling client.ChatWithSystemPrompt()...") + got, err := client.ChatWithSystemPrompt(context.Background(), systemPrompt, messages) + + // 5. 校验结果 + if err != nil { + log.Printf("[ERROR] ChatWithSystemPrompt() returned error: %v", err) + t.Errorf("ChatWithSystemPrompt() error = %v, want nil", err) + return + } + log.Printf("[INFO] client.ChatWithSystemPrompt() call completed without error") + + if len(got) == 0 { + log.Printf("[ERROR] ChatWithSystemPrompt() returned empty response, got: %v", got) + t.Errorf("ChatWithSystemPrompt() returned empty response, want non-empty") + } else { + // 截取前100个字符打印,防止LLM返回内容过长刷屏,同时方便调试确认内容 + preview := got + if len(preview) > 100 { + preview = preview[:100] + "..." + } + log.Printf("[INFO] ChatWithSystemPrompt() response validation passed, response preview: %q", preview) + } + + log.Printf("[INFO] TestClient_ChatWithSystemPrompt completed successfully") } \ No newline at end of file