后端: 1. 阶段 1.5/1.6 收口 llm-service / rag-service,统一模型出口与检索基础设施入口,清退 backend/infra/llm 与 backend/infra/rag 旧实现; 2. 同步更新相关调用链与微服务迁移计划文档
74 lines
2.0 KiB
Go
74 lines
2.0 KiB
Go
package llm
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"strings"
|
|
|
|
"github.com/cloudwego/eino-ext/components/model/ark"
|
|
einoModel "github.com/cloudwego/eino/components/model"
|
|
"github.com/cloudwego/eino/schema"
|
|
arkModel "github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
|
|
)
|
|
|
|
// ArkCallOptions 是直接调用 ark.ChatModel 时使用的通用入参。
|
|
type ArkCallOptions struct {
|
|
Temperature float64
|
|
MaxTokens int
|
|
Thinking ThinkingMode
|
|
}
|
|
|
|
// CallArkText 调用 ark 模型并返回纯文本。
|
|
func CallArkText(ctx context.Context, chatModel *ark.ChatModel, systemPrompt, userPrompt string, options ArkCallOptions) (string, error) {
|
|
if chatModel == nil {
|
|
return "", errors.New("ark model is nil")
|
|
}
|
|
|
|
messages := []*schema.Message{
|
|
schema.SystemMessage(systemPrompt),
|
|
schema.UserMessage(userPrompt),
|
|
}
|
|
resp, err := chatModel.Generate(ctx, messages, buildArkOptions(options)...)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if resp == nil {
|
|
return "", errors.New("模型返回为空")
|
|
}
|
|
|
|
text := strings.TrimSpace(resp.Content)
|
|
if text == "" {
|
|
return "", errors.New("模型返回内容为空")
|
|
}
|
|
return text, nil
|
|
}
|
|
|
|
// CallArkJSON 调用 ark 模型并直接解析 JSON。
|
|
func CallArkJSON[T any](ctx context.Context, chatModel *ark.ChatModel, systemPrompt, userPrompt string, options ArkCallOptions) (*T, string, error) {
|
|
raw, err := CallArkText(ctx, chatModel, systemPrompt, userPrompt, options)
|
|
if err != nil {
|
|
return nil, "", err
|
|
}
|
|
parsed, err := ParseJSONObject[T](raw)
|
|
if err != nil {
|
|
return nil, raw, err
|
|
}
|
|
return parsed, raw, nil
|
|
}
|
|
|
|
func buildArkOptions(options ArkCallOptions) []einoModel.Option {
|
|
thinkingType := arkModel.ThinkingTypeDisabled
|
|
if options.Thinking == ThinkingModeEnabled {
|
|
thinkingType = arkModel.ThinkingTypeEnabled
|
|
}
|
|
|
|
opts := []einoModel.Option{
|
|
ark.WithThinking(&arkModel.Thinking{Type: thinkingType}),
|
|
einoModel.WithTemperature(float32(options.Temperature)),
|
|
}
|
|
if options.MaxTokens > 0 {
|
|
opts = append(opts, einoModel.WithMaxTokens(options.MaxTokens))
|
|
}
|
|
return opts
|
|
}
|