feat: 添加配置文件支持并重构聊天模块
- 新增config.yaml和config.go用于管理配置 - 重构chatmodel.go使用配置初始化模型 - 修改GenerateChatMessage和ChatStream函数签名添加context参数 - 更新main.go加载配置并初始化聊天模型 - 优化错误处理和日志输出
This commit is contained in:
40
chat/chat.go
40
chat/chat.go
@@ -3,52 +3,56 @@ package chat
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
|
||||
"github.com/cloudwego/eino-ext/components/model/openai"
|
||||
"github.com/cloudwego/eino/schema"
|
||||
)
|
||||
|
||||
func Chat(chatModel *openai.ChatModel, ctx context.Context, question string) {
|
||||
role := "心理咨询师"
|
||||
style := "温柔可爱"
|
||||
func Chat(chatModel *openai.ChatModel, ctx context.Context, role, style, question string) error {
|
||||
history := []*schema.Message{}
|
||||
messages, err := GenerateChatMessage(role, style, question, history)
|
||||
messages, err := GenerateChatMessage(ctx, role, style, question, history)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return err
|
||||
}
|
||||
response, err := chatModel.Generate(ctx, messages)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return err
|
||||
}
|
||||
// 获取 Token 使用情况
|
||||
if usage := response.ResponseMeta.Usage; usage != nil {
|
||||
println("提示 Tokens:", usage.PromptTokens)
|
||||
println("生成 Tokens:", usage.CompletionTokens)
|
||||
println("总 Tokens:", usage.TotalTokens)
|
||||
fmt.Printf("提示 Tokens: %d\n", usage.PromptTokens)
|
||||
fmt.Printf("生成 Tokens: %d\n", usage.CompletionTokens)
|
||||
fmt.Printf("总 Tokens: %d\n", usage.TotalTokens)
|
||||
}
|
||||
fmt.Println(response)
|
||||
fmt.Println(response.Content)
|
||||
return nil
|
||||
}
|
||||
func ChatStream(chatModel *openai.ChatModel, ctx context.Context, question string) {
|
||||
role := "心理咨询师"
|
||||
style := "温柔可爱"
|
||||
|
||||
func ChatStream(chatModel *openai.ChatModel, ctx context.Context, role, style, question string) error {
|
||||
history := []*schema.Message{}
|
||||
messages, err := GenerateChatMessage(role, style, question, history)
|
||||
messages, err := GenerateChatMessage(ctx, role, style, question, history)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return err
|
||||
}
|
||||
// 获取流式回复
|
||||
reader, err := chatModel.Stream(ctx, messages)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return err
|
||||
}
|
||||
defer reader.Close() // 注意要关闭
|
||||
|
||||
// 处理流式内容
|
||||
for {
|
||||
chunk, err := reader.Recv()
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
print(chunk.Content)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Print(chunk.Content)
|
||||
}
|
||||
fmt.Println()
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -2,23 +2,21 @@ package chat
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
"enio_meowrain/config"
|
||||
|
||||
"github.com/cloudwego/eino-ext/components/model/openai"
|
||||
)
|
||||
|
||||
func CreateChatModel() (*openai.ChatModel, context.Context) {
|
||||
ctx := context.Background()
|
||||
timeout := 30 * time.Second
|
||||
func CreateChatModel(ctx context.Context, cfg *config.Config) (*openai.ChatModel, error) {
|
||||
chatModel, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{
|
||||
BaseURL: "https://api-proxy.meowrain.cn/ai/v1",
|
||||
Model: "deepseek-v3.2",
|
||||
APIKey: "meowrain",
|
||||
Timeout: timeout,
|
||||
BaseURL: cfg.OpenAI.BaseURL,
|
||||
Model: cfg.OpenAI.Model,
|
||||
APIKey: cfg.OpenAI.APIKey,
|
||||
Timeout: cfg.OpenAI.Timeout,
|
||||
})
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return nil, err
|
||||
}
|
||||
return chatModel, ctx
|
||||
return chatModel, nil
|
||||
|
||||
}
|
||||
|
||||
@@ -14,9 +14,9 @@ var template = prompt.FromMessages(schema.FString,
|
||||
schema.MessagesPlaceholder("chat_history", true),
|
||||
schema.UserMessage("问题: {question}"))
|
||||
|
||||
func GenerateChatMessage(role, style, question string, history []*schema.Message) ([]*schema.Message, error) {
|
||||
func GenerateChatMessage(ctx context.Context, role, style, question string, history []*schema.Message) ([]*schema.Message, error) {
|
||||
// 在这里调用模板
|
||||
messages, err := template.Format(context.Background(), map[string]any{
|
||||
messages, err := template.Format(ctx, map[string]any{
|
||||
"role": role,
|
||||
"style": style,
|
||||
"question": question,
|
||||
|
||||
Reference in New Issue
Block a user