Flutter向量搜索与嵌入插件langchain_pinecone的使用
Flutter向量搜索与嵌入插件langchain_pinecone的使用
特性
- 向量存储:
Pinecone
向量存储使用完全托管的向量数据库。
许可证
LangChain.dart 使用 MIT 许可证。
示例代码
以下是一个完整的示例代码,展示了如何在 Flutter 中使用 langchain_pinecone
插件进行向量搜索与嵌入。
// ignore_for_file: avoid_print
import 'dart:io';
import 'package:langchain_core/documents.dart';
import 'package:langchain_openai/langchain_openai.dart';
import 'package:langchain_pinecone/langchain_pinecone.dart';
void main() async {
// 获取环境变量中的 API 密钥
final openaiApiKey = Platform.environment['OPENAI_API_KEY']!;
final pineconeApiKey = Platform.environment['PINECONE_API_KEY']!;
// 初始化 OpenAI 嵌入模型
final embeddings = OpenAIEmbeddings(apiKey: openaiApiKey);
// 初始化 Pinecone 向量存储
final vectorStore = Pinecone(
apiKey: pineconeApiKey,
indexName: 'langchain-dart',
embeddings: embeddings,
);
// 添加文档到向量存储
await vectorStore.addDocuments(
documents: const [
Document(
id: '1',
pageContent: 'The cat sat on the mat',
metadata: {'cat': 'animal'},
),
Document(
id: '2',
pageContent: 'The dog chased the ball.',
metadata: {'cat': 'animal'},
),
Document(
id: '3',
pageContent: 'The boy ate the apple.',
metadata: {'cat': 'person'},
),
Document(
id: '4',
pageContent: 'The girl drank the milk.',
metadata: {'cat': 'person'},
),
Document(
id: '5',
pageContent: 'The sun is shining.',
metadata: {'cat': 'natural'},
),
],
);
// 查询向量存储
final res = await vectorStore.similaritySearch(
query: 'What are they eating?',
config: const PineconeSimilaritySearch(
k: 2, // 返回最相似的两个结果
scoreThreshold: 0.4, // 设置相似度阈值
filter: {'cat': 'person'}, // 过滤条件
),
);
// 打印查询结果
print(res);
}
更多关于Flutter向量搜索与嵌入插件langchain_pinecone的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter向量搜索与嵌入插件langchain_pinecone的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter应用中使用langchain_pinecone
插件进行向量搜索与嵌入的示例代码。请注意,langchain_pinecone
本身可能不是一个直接用于Flutter的插件,但你可以通过Flutter调用后端服务或者使用相应的Dart/Flutter封装库(如果存在)来实现功能。这里我们假设你有一个后端服务来处理向量搜索与嵌入,并且你需要从Flutter应用与这个后端服务进行交互。
后端服务(使用Python和Pinecone)
首先,确保你的后端服务已经设置好,可以使用Pinecone进行向量搜索。以下是一个简单的Python示例,使用Pinecone库:
# 安装pinecone库
# pip install pinecone-client
import pinecone
# 初始化Pinecone客户端
client = pinecone.init(api_key='YOUR_PINECONE_API_KEY', environment='YOUR_PINECONE_ENVIRONMENT')
# 创建一个向量索引
index_name = 'my_vector_index'
index = client.create_or_load_index(index_name=index_name, dimension=128)
# 添加一些向量到索引中
vectors_to_add = [
{'id': 'vector_1', 'vector': [0.1, 0.2, ..., 0.128]}, # 示例向量,需要替换为实际的128维向量
{'id': 'vector_2', 'vector': [0.2, 0.1, ..., 0.127]},
# 添加更多向量...
]
index.upsert(vectors_to_add)
# 定义搜索函数
def search_vectors(query_vector, top_k=5):
results = index.query(query_vector, top_k=top_k)
return results
# Flask应用示例,用于接收Flutter的HTTP请求
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/search', methods=['POST'])
def search():
data = request.json
query_vector = data['query_vector']
top_k = data.get('top_k', 5)
results = search_vectors(query_vector, top_k)
return jsonify(results)
if __name__ == '__main__':
app.run(debug=True)
Flutter前端
接下来,我们在Flutter应用中调用这个后端服务。你需要使用http
包来发送HTTP请求。
首先,在pubspec.yaml
中添加http
依赖:
dependencies:
flutter:
sdk: flutter
http: ^0.13.3 # 确保使用最新版本
然后,在Flutter代码中调用后端服务:
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Pinecone Search'),
),
body: Center(
child: SearchVectorWidget(),
),
),
);
}
}
class SearchVectorWidget extends StatefulWidget {
@override
_SearchVectorWidgetState createState() => _SearchVectorWidgetState();
}
class _SearchVectorWidgetState extends State<SearchVectorWidget> {
final String apiUrl = 'http://your-backend-server.com/search';
List<dynamic> searchResults = [];
void searchVector() async {
// 示例查询向量
var queryVector = [0.1, 0.2, ..., 0.128]; // 需要替换为实际的128维向量
var body = jsonEncode({'query_vector': queryVector, 'top_k': 5});
var response = await http.post(
Uri.parse(apiUrl),
body: body,
headers: {
'Content-Type': 'application/json',
},
);
if (response.statusCode == 200) {
var data = jsonDecode(response.body);
setState(() {
searchResults = data;
});
} else {
throw Exception('Failed to search vectors');
}
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: searchVector,
child: Text('Search Vectors'),
),
if (searchResults.isNotEmpty)
Text('Search Results:'),
if (searchResults.isNotEmpty)
ListView.builder(
shrinkWrap: true,
itemCount: searchResults.length,
itemBuilder: (context, index) {
return ListTile(
title: Text('ID: ${searchResults[index]['id']}'),
// 根据需要展示更多信息
);
},
),
],
);
}
}
总结
这个示例展示了如何在Flutter应用中通过调用后端服务来进行向量搜索与嵌入。后端服务使用Pinecone库来处理向量索引和搜索,而Flutter应用则通过HTTP请求与后端服务进行交互。请确保替换示例代码中的API密钥、环境变量和向量数据为实际值。