Go SiliconFlow API 语言实现多模态图像描述服务

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

技术亮点

  1. 使用 Go 协程实现高性能异步处理
  2. 支持流式 API 响应
  3. 环境变量安全管理
  4. 模块化设计,易于扩展

注意事项

  • 确保正确配置 API 密钥
  • 处理网络异常和超时
  • 遵守 API 使用限制

立即体验

快来体验 Go 语言多模态 AI:https://go.dev/play/

快来体验 Go 语言多模态 AI:https://go.dev/play/

快来体验 Go 语言多模态 AI:https://go.dev/play/

相关推荐
kfaino7 小时前
码农的AI翻身(三)你好,我叫 Embedding
后端·ai编程
葫芦和十三8 小时前
图解 MongoDB 18|复制集拓扑:Primary、Secondary 和 Arbiter 的分工
后端·mongodb·面试
爱勇宝8 小时前
大多数人不是在使用 AI 赚钱,而是在帮 AI 公司赚钱
前端·后端·程序员
程序员cxuan11 小时前
虽迟但到!GPT-5.6 终于来了!
人工智能·后端·程序员
IT_陈寒13 小时前
React的这个渲染问题连官方文档都没说清楚
前端·人工智能·后端
葫芦和十三14 小时前
图解 MongoDB 15|journal 与持久化:写入怎么不丢,崩溃怎么恢复
后端·mongodb·面试
葫芦和十三14 小时前
图解 MongoDB 16|压缩:snappy、zstd 和 zlib 的取舍
后端·mongodb·面试
苍何14 小时前
终于找到免费开源TTS模型,克隆声音不要钱,本地电脑也能跑
后端
用户5936087414014 小时前
Spring AI 集成 DeepSeek 原生供应商并实现think模式
后端
追逐时光者14 小时前
别再满网找零散工具了,腾讯 QQ 浏览器这个“帮小忙”工具箱真能省时间
前端·后端