diff --git a/backend/internal/llm/client.go b/backend/internal/llm/client.go index 6cce1fc..ef92e16 100644 --- a/backend/internal/llm/client.go +++ b/backend/internal/llm/client.go @@ -1,8 +1,10 @@ package llm import ( + "context" "fmt" "knowledge-graph-backend/internal/config" + "log" "github.com/tmc/langchaingo/llms" "github.com/tmc/langchaingo/llms/openai" @@ -26,4 +28,21 @@ func NewClient(cfg config.LLMConfig) (*Client, error) { } return &Client{config: cfg, llm: model}, nil +} + +// Client简单对话调用 +func (c *Client) Chat(ctx context.Context, messages []llms.MessageContent) (string, error) { + resp, err := c.llm.GenerateContent(ctx, messages) + + if err != nil { + log.Printf("[ERROR] GenerateContent failed: %v", err) + return "", fmt.Errorf("generate content error: %w", err) + } + if resp == nil || len(resp.Choices) == 0 { + log.Printf("[WARN] Response is empty or has no choices") + return "", fmt.Errorf("no content choices returned") + } + log.Printf("[INFO] Chat 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 6472b23..185118a 100644 --- a/backend/internal/llm/client_test.go +++ b/backend/internal/llm/client_test.go @@ -1,9 +1,12 @@ package llm import ( + "context" "knowledge-graph-backend/internal/config" "log" "testing" + + "github.com/tmc/langchaingo/llms" ) func TestNewClient(t *testing.T) { @@ -34,4 +37,58 @@ func TestNewClient(t *testing.T) { } log.Printf("[INFO] TestNewClient completed successfully") +} + +func TestClient_Chat(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") + + messages := []llms.MessageContent{ + { + Role: "human", + Parts: []llms.ContentPart{ + llms.TextContent{Text: "你好,请介绍一下你自己"}, + }, + }, + } + log.Printf("[INFO] preparing chat request, messages count: %d, content: %q", len(messages), messages[0].Parts[0].(llms.TextContent).Text) + + // 3. 调用被测方法 + log.Printf("[INFO] calling client.Chat()...") + got, err := client.Chat(context.Background(), messages) + + // 4. 校验结果 + if err != nil { + log.Printf("[ERROR] Chat() returned error: %v", err) + t.Errorf("Chat() error = %v, want nil", err) + return + } + log.Printf("[INFO] client.Chat() call completed without error") + + if len(got) == 0 { + log.Printf("[ERROR] Chat() returned empty response, got: %v", got) + t.Errorf("Chat() returned empty response, want non-empty") + } else { + // 截取前100个字符打印,防止LLM返回内容过长刷屏,同时方便调试确认内容 + preview := got + if len(preview) > 100 { + preview = preview[:100] + "..." + } + log.Printf("[INFO] Chat() response validation passed, response preview: %q", preview) + } + + log.Printf("[INFO] TestClient_Chat completed successfully") } \ No newline at end of file