Flutter向量搜索与嵌入插件langchain_pinecone的使用

发布于 1周前 作者 songsunli 来自 Flutter

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

1 回复

更多关于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密钥、环境变量和向量数据为实际值。

回到顶部