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

server/2025/2/13 17:49:11/

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

项目背景

本项目使用 Go 语言实现一个基于 SiliconFlow API 的图像描述微服务,展示 Go 在多模态 AI 应用中的强大能力。

项目依赖

# 初始化项目
go mod init image-description-service# 添加依赖
go get github.com/joho/godotenv
go get github.com/sashabaranov/go-openai

环境配置 (.env)

# 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:

package mainimport ("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 = baseURLreturn &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 stringfor {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)
}

运行方法

# 设置环境变量
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/


http://www.ppmy.cn/server/167385.html

相关文章

【uniapp-小程序】实现方法调用的全局tips弹窗

【uniapp-小程序】实现方法调用的全局tips弹窗 开发背景弹窗组件全局调用封装配置项入参全局注入使用 附带:如何在uniapp-H5项目中实现全局自定义弹窗组件定义定义vue插件引入 笑死,只有在想找工作的时候才会想更新博客。 开发背景 本来是个uniapp开发…

SAP-ABAP:SAP中REPORT程序和online程序的区别对比

在SAP中,REPORT程序和Online程序(通常指Dialog程序)是两种常见的ABAP程序类型,它们在用途、结构和用户交互方式上有显著区别。以下是它们的详细对比: 1. 用途 REPORT程序Online程序主要用于数据查询、报表生成和批量数…

基于脚本的modelsim自动化仿真笔记

一、基本介绍 这里介绍一下如何利用脚本调用modelsim进行自动化仿真,随笔前面先介绍一下前仿真,随笔结尾处介绍后仿真。前仿真的基本介绍如下所示,由于我的笔记是写在.do文件中,因此我这里也给代码的格式,如下所示&am…

Python 鼠标轨迹 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…

【STM32】通过L496的HAL库Flash建立FatFS文件系统(CubeMX自动配置R0.12C版本)

【STM32】通过L496的HAL库Flash建立FatFS文件系统(CubeMX自动配置R0.12C版本) 文章目录 FlashFlash地址写Flash地址读 FatFS文件系统配置FatFS移植驱动函数时间戳函数 文件操作函数工作区缓存文件挂载和格式化测试文件读写测试其他文件操作函数 测试附录…

网络安全架构分层 网络安全组织架构

1.1.4 网络安全系统的基本组成 上节介绍到了,网络安全系统是一个相对完整的安全保障体系。那么这些安全保障措施具体包括哪些,又如何体现呢?这可以从OSI/RM的7层网络结构来一一分析。因为计算机的网络通信,都离不开OSIR/RM的这7层…

Spring Boot应用开发

Spring Boot 是一个用于简化 Spring 应用程序开发的框架,它提供了一种快速、方便的方式来创建独立的、生产级的 Spring 应用。以下是 Spring Boot 应用开发的基本步骤和一些重要概念。 1. 环境准备 JDK: 确保安装了 JDK 8 或更高版本。 IDE: 推荐使用 IntelliJ IDEA、Eclips…

【Android开发】Android Studio汉化

前言 该插件是官方支持插件,未对任何软件进行修改和破解 Android Studio 是基于 IntelliJ IDEA 社区版开发的集成开发环境(IDE),专门用于Android应用程序的开发。以下是为什么 Android Studio 能使用 IntelliJ IDEA 插件的原因&am…