📚 使用 Pyserini 进行 DSPy 的入门指南

在数据驱动的时代,如何有效地检索和处理信息变得愈发重要。Pyserini 是由滑铁卢大学数据系统组维护的工具,可以帮助用户将自己的数据整合到 dspy.Retrieve 中。本文将介绍 Pyserini 的基本使用方法,重点是如何将其与 DSPy 框架结合使用,以实现高效的检索和信息处理。

🚀 1. 安装和设置

在开始使用 dspy.Pyserini 之前,我们需要安装 Pyserini、Pytorch 和 Faiss。可以通过以下命令安装 Pyserini:

pip install pyserini

如果您在自己的设备上运行,请根据需要选择合适版本的 Pytorch 和 Faiss。在 Colab 上,请确保选择 GPU 作为硬件加速器。可以在 “编辑 > 笔记本设置 > 硬件加速器” 中进行选择。

以下是完整的安装和设置代码:

📖 2. 使用 Pyserini 的预构建索引

Pyserini 提供了一些预构建的索引,可以直接使用。以下是一个示例,展示如何初始化和使用 Pyserini 的预构建索引:

pys_ret_prebuilt = dspy.Pyserini(index='beir-v1.0.0-nfcorpus.contriever-msmarco', query_encoder='facebook/contriever-msmarco', id_field='_id', text_fields=['title', 'text'])

dspy.settings.configure(rm=pys_ret_prebuilt)

example_question = "How Curry Can Kill Cancer Cells"

retrieve = dspy.Retrieve(k=3)
topK_passages = retrieve(example_question).passages

print(f"Top {retrieve.k} passages for question: {example_question} \\n", '-' * 30, '\\n')

for idx, passage in enumerate(topK_passages):
    print(f'{idx+1}]', passage, '\\n')

运行以上代码后,您将获得与输入问题相关的前 3 个段落的检索结果。这些段落来自于预构建的 Wikipedia 索引,内容涉及如何利用咖喱成分(如姜黄素)治疗癌细胞等信息。

📊 3. 使用您自己的数据

接下来,我们将使用 NFCorpus,这是一个用于医学信息检索的全文本学习排名数据集。首先,下载数据集并解压:

!wget https://public.ukp.informatik.tu-darmstadt.de/thakur/BEIR/datasets/nfcorpus.zip -P collections
!unzip collections/nfcorpus.zip -d collections

接下来,使用 Pyserini 对数据进行编码并打包到 Faiss 索引中:

!python -m pyserini.encode \
  --corpus collections/nfcorpus/corpus.jsonl \
  --fields title text \
  --embeddings indexes/faiss.nfcorpus.contriever-msmarco \
  --to-faiss \
  --encoder facebook/contriever-msmarco \
  --device cuda:0 \
  --pooling mean

完成数据编码后,您可以使用 dspy.Pyserini 读取本地 Faiss 索引并进行检索。需要注意的是,使用本地索引时,需要传入 Huggingface 的 Dataset 以便进行文档查找。

from datasets import load_dataset

dataset = load_dataset(path='json', data_files='collections/nfcorpus/corpus.jsonl', split='train')

pys_ret_local = dspy.Pyserini(index='indexes/faiss.nfcorpus.contriever-msmarco', query_encoder='facebook/contriever-msmarco', dataset=dataset, id_field='_id', text_fields=['title', 'text'])

dspy.settings.configure(rm=pys_ret_local)

dev_example = "How Curry Can Kill Cancer Cells"

retrieve = dspy.Retrieve(k=3)
topK_passages = retrieve(dev_example).passages

print(f"Top {retrieve.k} passages for question: {dev_example} \\n", '-' * 30, '\\n')

for idx, passage in enumerate(topK_passages):
    print(f'{idx+1}]', passage, '\\n')

运行以上代码,您将获得与输入问题相关的段落,这些段落来自于您自己的数据集。

🔍 结论

通过本文,您了解了如何使用 Pyserini 和 DSPy 进行数据检索与处理。无论是使用预构建索引还是您自己的数据集,DSPy 都提供了一种灵活的方式来实现高效的信息检索。未来,您可以进一步探索 DSPy 的更多功能,通过优化检索和回答生成流程,提升您的应用性能。

发表评论