Infinity与Dart:Flutter应用中的向量服务集成实践
Infinity是一个高吞吐量、低延迟的REST API,专为提供向量嵌入服务而设计,支持多种sentence-transformer模型和框架。本指南将展示如何在Flutter应用中集成Infinity向量服务,帮助开发者轻松实现文本嵌入、图像识别等AI功能。## 为什么选择Infinity作为Flutter的向量服务?Infinity作为向量服务解决方案,具有三大核心优势:- **
Infinity与Dart:Flutter应用中的向量服务集成实践
Infinity是一个高吞吐量、低延迟的REST API,专为提供向量嵌入服务而设计,支持多种sentence-transformer模型和框架。本指南将展示如何在Flutter应用中集成Infinity向量服务,帮助开发者轻松实现文本嵌入、图像识别等AI功能。
为什么选择Infinity作为Flutter的向量服务?
Infinity作为向量服务解决方案,具有三大核心优势:
- 高性能:采用FastAPI构建,支持高并发请求处理,完美适配移动应用的实时响应需求
- API兼容性:遵循OpenAI API规范,降低开发学习成本,便于快速集成
- 多模态支持:不仅支持文本嵌入,还提供图像、音频等多模态嵌入能力,满足Flutter应用的多样化需求
图: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应用中的无限可能吧!🚀
更多推荐
所有评论(0)