Go SiliconFlow API 语言实现多模态图像描述服务
项目背景
本项目使用 Go 语言实现一个基于 SiliconFlow API 的图像描述微服务,展示 Go 在多模态 AI 应用中的强大能力。
项目依赖
bash
# 初始化项目
go mod init image-description-service
# 添加依赖
go get github.com/joho/godotenv
go get github.com/sashabaranov/go-openai
环境配置 (.env)
shell
# SiliconFlow API 配置
SILICONFLOW_API_KEY=sk-*******************************************
SILICONFLOW_BASE_URL=https://api.siliconflow.cn/v1
核心实现
1. 项目结构
image-description-service/
├── main.go
├── .env
└── go.mod
2. 代码实现
main.go
:
go
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/joho/godotenv"
openai "github.com/sashabaranov/go-openai"
)
// ImageDescriber 图像描述服务
type ImageDescriber struct {
client *openai.Client
}
// NewImageDescriber 创建新的图像描述服务实例
func NewImageDescriber() (*ImageDescriber, error) {
// 加载环境变量
err := godotenv.Load()
if err != nil {
return nil, fmt.Errorf("加载 .env 文件失败: %v", err)
}
// 获取 API 配置
apiKey := os.Getenv("SILICONFLOW_API_KEY")
baseURL := os.Getenv("SILICONFLOW_BASE_URL")
// 配置 OpenAI 客户端
config := openai.DefaultAzureConfig(apiKey, baseURL)
config.BaseURL = baseURL
return &ImageDescriber{
client: openai.NewClientWithConfig(config),
}, nil
}
// DescribeImage 描述图像
func (d *ImageDescriber) DescribeImage(imageURL string) (string, error) {
// 准备多模态请求
req := openai.ChatCompletionRequest{
Model: "Qwen/Qwen2-VL-72B-Instruct",
Messages: []openai.ChatCompletionMessage{
{
Role: "user",
MultimodalContent: []openai.ChatMessagePart{
{
Type: openai.ChatMessagePartTypeImageURL,
ImageURL: &openai.ChatMessageImageURL{
URL: imageURL,
},
},
{
Type: openai.ChatMessagePartTypeText,
Text: "用中文详细描述这张图片的内容",
},
},
},
},
Stream: true,
}
// 创建流式响应
stream, err := d.client.CreateChatCompletionStream(context.Background(), req)
if err != nil {
return "", fmt.Errorf("创建流式响应失败: %v", err)
}
defer stream.Close()
// 收集响应
var description string
for {
response, err := stream.Recv()
if err != nil {
break
}
description += response.Choices[0].Delta.Content
}
return description, nil
}
func main() {
// 创建图像描述服务
describer, err := NewImageDescriber()
if err != nil {
log.Fatalf("初始化服务失败: %v", err)
}
// 示例图像
imageURL := "https://sf-maas-uat-prod.oss-cn-shanghai.aliyuncs.com/dog.png"
// 生成图像描述
description, err := describer.DescribeImage(imageURL)
if err != nil {
log.Fatalf("图像描述生成失败: %v", err)
}
// 输出描述
fmt.Println("图像描述:", description)
}
运行方法
bash
# 设置环境变量
export SILICONFLOW_API_KEY=your_api_key
export SILICONFLOW_BASE_URL=https://api.siliconflow.cn/v1
# 运行程序
go run main.go
技术亮点
- 使用 Go 协程实现高性能异步处理
- 支持流式 API 响应
- 环境变量安全管理
- 模块化设计,易于扩展
注意事项
- 确保正确配置 API 密钥
- 处理网络异常和超时
- 遵守 API 使用限制
立即体验
快来体验 Go 语言多模态 AI:https://go.dev/play/
快来体验 Go 语言多模态 AI:https://go.dev/play/
快来体验 Go 语言多模态 AI:https://go.dev/play/