Infinity与Dart:Flutter应用中的向量服务集成实践

【免费下载链接】infinity Infinity is a high-throughput, low-latency REST API for serving vector embeddings, supporting a wide range of sentence-transformer models and frameworks. 【免费下载链接】infinity 项目地址: https://gitcode.com/gh_mirrors/infi/infinity

Infinity是一个高吞吐量、低延迟的REST API,专为提供向量嵌入服务而设计,支持多种sentence-transformer模型和框架。本指南将展示如何在Flutter应用中集成Infinity向量服务,帮助开发者轻松实现文本嵌入、图像识别等AI功能。

为什么选择Infinity作为Flutter的向量服务?

Infinity作为向量服务解决方案,具有三大核心优势:

  • 高性能:采用FastAPI构建,支持高并发请求处理,完美适配移动应用的实时响应需求
  • API兼容性:遵循OpenAI API规范,降低开发学习成本,便于快速集成
  • 多模态支持:不仅支持文本嵌入,还提供图像、音频等多模态嵌入能力,满足Flutter应用的多样化需求

Infinity服务部署界面 图:Infinity向量服务在GPU实例上的运行状态,显示RTX 4090显卡的资源使用情况

准备工作:搭建Infinity服务环境

1. 安装Infinity服务

首先需要在服务器或本地环境部署Infinity服务:

git clone https://gitcode.com/gh_mirrors/infi/infinity
cd infinity
# 按照官方文档安装依赖并启动服务

2. 验证服务可用性

服务启动后,可以通过访问API端点验证是否正常运行:

# 检查健康状态
curl http://localhost:7997/health

Flutter应用中的Dart客户端实现

虽然Infinity官方提供了Python客户端,但我们可以通过Dart的HTTP客户端库来实现API调用。

1. 添加依赖

pubspec.yaml中添加HTTP客户端依赖:

dependencies:
  http: ^0.13.5
  json_annotation: ^4.8.1

dev_dependencies:
  build_runner: ^2.4.4
  json_serializable: ^6.7.0

2. 创建API模型类

定义与Infinity API交互的数据模型:

import 'package:json_annotation/json_annotation.dart';

part 'embedding_request.g.dart';

@JsonSerializable()
class EmbeddingRequest {
  final String model;
  final List<String> input;
  
  EmbeddingRequest({required this.model, required this.input});
  
  factory EmbeddingRequest.fromJson(Map<String, dynamic> json) =>
      _$EmbeddingRequestFromJson(json);
      
  Map<String, dynamic> toJson() => _$EmbeddingRequestToJson(this);
}

3. 实现向量服务客户端

创建一个Infinity服务客户端类:

import 'dart:convert';
import 'package:http/http.dart' as http;
import 'embedding_request.dart';

class InfinityClient {
  final String baseUrl;
  final String? apiKey;
  
  InfinityClient({required this.baseUrl, this.apiKey});
  
  Future<List<List<double>>> getEmbeddings({
    required String model,
    required List<String> texts
  }) async {
    final headers = {
      'Content-Type': 'application/json',
      if (apiKey != null) 'Authorization': 'Bearer $apiKey'
    };
    
    final request = EmbeddingRequest(model: model, input: texts);
    final response = await http.post(
      Uri.parse('$baseUrl/embeddings'),
      headers: headers,
      body: jsonEncode(request.toJson()),
    );
    
    if (response.statusCode == 200) {
      final data = jsonDecode(response.body);
      return (data['data'] as List)
          .map((item) => (item['embedding'] as List).cast<double>())
          .toList();
    } else {
      throw Exception('Failed to get embeddings: ${response.reasonPhrase}');
    }
  }
}

实际应用场景:图像相似度匹配

Infinity不仅支持文本嵌入,还提供图像嵌入能力。以下是在Flutter应用中实现图像相似度匹配的流程:

1. 准备图像数据

将图像转换为base64格式,以便通过API发送:

import 'dart:convert';
import 'dart:io';

Future<String> imageToBase64(File imageFile) async {
  List<int> imageBytes = await imageFile.readAsBytes();
  return base64Encode(imageBytes);
}

2. 调用图像嵌入API

扩展InfinityClient以支持图像嵌入:

Future<List<List<double>>> getImageEmbeddings({
  required String model,
  required List<String> imageBase64List
}) async {
  // 实现图像嵌入API调用
}

3. 计算图像相似度

使用余弦相似度算法比较两个图像的嵌入向量:

double cosineSimilarity(List<double> a, List<double> b) {
  double dotProduct = 0.0;
  double normA = 0.0;
  double normB = 0.0;
  
  for (int i = 0; i < a.length; i++) {
    dotProduct += a[i] * b[i];
    normA += a[i] * a[i];
    normB += b[i] * b[i];
  }
  
  return dotProduct / (sqrt(normA) * sqrt(normB));
}

图像嵌入示例 图:用于图像相似度匹配的示例图片,Infinity可以生成该图像的向量表示

性能优化建议

1. 请求批处理

将多个文本或图像请求合并为一个批处理请求,减少网络往返:

// 批处理多个文本嵌入请求
List<String> texts = ["text1", "text2", "text3"];
var embeddings = await client.getEmbeddings(model: "all-MiniLM-L6-v2", texts: texts);

2. 结果缓存策略

实现本地缓存机制,避免重复计算相同内容的嵌入:

// 简单的内存缓存实现
Map<String, List<double>> _embeddingCache = {};

Future<List<double>> getCachedEmbedding(String text) async {
  if (_embeddingCache.containsKey(text)) {
    return _embeddingCache[text]!;
  }
  
  var embedding = await client.getEmbeddings(model: "model", texts: [text]);
  _embeddingCache[text] = embedding[0];
  return embedding[0];
}

常见问题解决

跨域请求问题

如果Flutter应用与Infinity服务不在同一域名下,需要在Infinity服务端配置CORS:

# 在Infinity启动时添加CORS配置
uvicorn infinity_emb.infinity_server:app --host 0.0.0.0 --port 7997 --cors-allow-origins "*"

模型选择建议

根据应用需求选择合适的模型:

  • 轻量级:all-MiniLM-L6-v2(适合移动应用)
  • 高精度:all-mpnet-base-v2(适合对精度要求高的场景)
  • 图像嵌入:clip-ViT-B-32(支持图像-文本跨模态检索)

总结

通过本文介绍的方法,你可以轻松在Flutter应用中集成Infinity向量服务,为你的应用添加强大的AI功能。无论是文本相似度计算、图像识别还是多模态检索,Infinity都能提供高性能的向量服务支持。

要了解更多关于Infinity的详细信息,可以参考官方文档:docs/index.md。开始探索向量服务在Flutter应用中的无限可能吧!🚀

【免费下载链接】infinity Infinity is a high-throughput, low-latency REST API for serving vector embeddings, supporting a wide range of sentence-transformer models and frameworks. 【免费下载链接】infinity 项目地址: https://gitcode.com/gh_mirrors/infi/infinity

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐