

Model ekstraksi informasi yang cepat dan ringan menyala untuk menghubungkan entitas dan ekstraksi hubungan .
Instalasi dari PYPI
pip install relikInstal dengan semua dependensi opsional.
pip install relik[all]Instal dengan dependensi opsional untuk pelatihan dan evaluasi.
pip install relik[train]Instal dengan dependensi opsional untuk FAISS
Paket FAISS PYPI hanya tersedia untuk CPU. Untuk GPU, instal dari sumber atau gunakan paket Conda.
Untuk CPU:
pip install relik[faiss]Untuk GPU:
conda create -n relik python=3.10
conda activate relik
# install pytorch
conda install -y pytorch=2.1.0 pytorch-cuda=12.1 -c pytorch -c nvidia
# GPU
conda install -y -c pytorch -c nvidia faiss-gpu=1.8.0
# or GPU with NVIDIA RAFT
conda install -y -c pytorch -c nvidia -c rapidsai -c conda-forge faiss-gpu-raft=1.8.0
pip install relikInstal dengan dependensi opsional untuk menyajikan model dengan FastAPI dan Ray.
pip install relik[serve]git clone https://github.com/SapienzaNLP/relik.git
cd relik
pip install -e .[all] Relik besar untuk ekstraksi hubungan (? RE V2 Besar, Colab ✅) : relik-ie/relik-relation-extraction-large
Relik Besar Untuk Ekstraksi Informasi Tertutup (? EL + RE BESAR, COLAB ✅) : https://huggingface.co/relik-ie/relik-cie-large
Relik Extra Besar untuk Ekstraksi Informasi Tertutup (? THICC BOI kami untuk El + Re) : relik-ie/relik-cie-xl
Relik kecil untuk entitas Linking (?? ⚡ Tiny dan Fast El, Colab ✅) : sapienzanlp/relik-entity-linking-small
Relik Small for Entity Linking (⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ ⚡ s SmALL-SMALL SMALL-ELSTIF-ENTITY Link/Small) : sapienzanlp/relik-entity-linking-small /
Relik Small Untuk Ekstraksi Informasi Tertutup (El + Re) : relik-ie/relik-cie-small
Relik Besar untuk Entitas Linking (El for the Wild) : relik-ie/relik-entity-linking-large-robust
Relik Small for Entity Linking (re + ner) : relik-ie/relik-relation-extraction-small-wikipedia-ner
Model dari kertas:
sapienzanlp/relik-entity-linking-largesapienzanlp/relik-entity-linking-basesapienzanlp/relik-relation-extraction-nyt-largeDaftar lengkap model dapat ditemukan? Wajah memeluk.
Ukuran model lain akan tersedia di masa depan?
Relik adalah model yang ringan dan cepat untuk penghubung entitas dan ekstraksi hubungan . Ini terdiri dari dua komponen utama: retriever dan pembaca. Retriever bertanggung jawab untuk mengambil dokumen yang relevan dari koleksi besar, sementara pembaca bertanggung jawab untuk mengekstraksi entitas dan hubungan dari dokumen yang diambil. Relik dapat digunakan dengan metode from_pretrained untuk memuat pipa pra-terlatih.
Berikut adalah contoh cara menggunakan Relik untuk entitas yang menghubungkan:
from relik import Relik
from relik . inference . data . objects import RelikOutput
relik = Relik . from_pretrained ( "sapienzanlp/relik-entity-linking-large" )
relik_out : RelikOutput = relik ( "Michael Jordan was one of the best players in the NBA." )Keluaran:
RelikOutput(
text="Michael Jordan was one of the best players in the NBA.",
tokens=['Michael', 'Jordan', 'was', 'one', 'of', 'the', 'best', 'players', 'in', 'the', 'NBA', '.'],
id=0,
spans=[
Span(start=0, end=14, label="Michael Jordan", text="Michael Jordan"),
Span(start=50, end=53, label="National Basketball Association", text="NBA"),
],
triples=[],
candidates=Candidates(
span=[
[
[
{"text": "Michael Jordan", "id": 4484083},
{"text": "National Basketball Association", "id": 5209815},
{"text": "Walter Jordan", "id": 2340190},
{"text": "Jordan", "id": 3486773},
{"text": "50 Greatest Players in NBA History", "id": 1742909},
...
]
]
]
),
)
dan untuk ekstraksi hubungan:
from relik import Relik
from relik . inference . data . objects import RelikOutput
relik = Relik . from_pretrained ( "sapienzanlp/relik-relation-extraction-nyt-large" )
relik_out : RelikOutput = relik ( "Michael Jordan was one of the best players in the NBA." )Keluaran:
RelikOutput(
text='Michael Jordan was one of the best players in the NBA.',
tokens=Michael Jordan was one of the best players in the NBA.,
id=0,
spans=[
Span(start=0, end=14, label='--NME--', text='Michael Jordan'),
Span(start=50, end=53, label='--NME--', text='NBA')
],
triplets=[
Triplets(
subject=Span(start=0, end=14, label='--NME--', text='Michael Jordan'),
label='company',
object=Span(start=50, end=53, label='--NME--', text='NBA'),
confidence=1.0
)
],
candidates=Candidates(
span=[],
triplet=[
[
[
{"text": "company", "id": 4, "metadata": {"definition": "company of this person"}},
{"text": "nationality", "id": 10, "metadata": {"definition": "nationality of this person or entity"}},
{"text": "child", "id": 17, "metadata": {"definition": "child of this person"}},
{"text": "founded by", "id": 0, "metadata": {"definition": "founder or co-founder of this organization, religion or place"}},
{"text": "residence", "id": 18, "metadata": {"definition": "place where this person has lived"}},
...
]
]
]
),
)
Retriever dan pembaca dapat digunakan secara terpisah. Dalam hal Relik Retriever saja, output akan berisi kandidat untuk teks input.
Contoh Retriever saja:
from relik import Relik
from relik . inference . data . objects import RelikOutput
# If you want to use only the retriever
retriever = Relik . from_pretrained ( "sapienzanlp/relik-entity-linking-large" , reader = None )
relik_out : RelikOutput = retriever ( "Michael Jordan was one of the best players in the NBA." )Keluaran:
RelikOutput(
text="Michael Jordan was one of the best players in the NBA.",
tokens=['Michael', 'Jordan', 'was', 'one', 'of', 'the', 'best', 'players', 'in', 'the', 'NBA', '.'],
id=0,
spans=[],
triples=[],
candidates=Candidates(
span=[
[
{"text": "Michael Jordan", "id": 4484083},
{"text": "National Basketball Association", "id": 5209815},
{"text": "Walter Jordan", "id": 2340190},
{"text": "Jordan", "id": 3486773},
{"text": "50 Greatest Players in NBA History", "id": 1742909},
...
]
],
triplet=[],
),
)
Contoh khusus pembaca:
from relik import Relik
from relik . inference . data . objects import RelikOutput
# If you want to use only the reader
reader = Relik . from_pretrained ( "sapienzanlp/relik-entity-linking-large" , retriever = None )
candidates = [
"Michael Jordan" ,
"National Basketball Association" ,
"Walter Jordan" ,
"Jordan" ,
"50 Greatest Players in NBA History" ,
]
text = "Michael Jordan was one of the best players in the NBA."
relik_out : RelikOutput = reader ( text , candidates = candidates )Keluaran:
RelikOutput(
text="Michael Jordan was one of the best players in the NBA.",
tokens=['Michael', 'Jordan', 'was', 'one', 'of', 'the', 'best', 'players', 'in', 'the', 'NBA', '.'],
id=0,
spans=[
Span(start=0, end=14, label="Michael Jordan", text="Michael Jordan"),
Span(start=50, end=53, label="National Basketball Association", text="NBA"),
],
triples=[],
candidates=Candidates(
span=[
[
[
{
"text": "Michael Jordan",
"id": -731245042436891448,
},
{
"text": "National Basketball Association",
"id": 8135443493867772328,
},
{
"text": "Walter Jordan",
"id": -5873847607270755146,
"metadata": {},
},
{"text": "Jordan", "id": 6387058293887192208, "metadata": {}},
{
"text": "50 Greatest Players in NBA History",
"id": 2173802663468652889,
},
]
]
],
),
)
Relik menyediakan CLI untuk melayani server FASTAPI untuk model atau untuk melakukan inferensi pada dataset.
relik serverelik serve --help
Usage: relik serve [OPTIONS] RELIK_PRETRAINED [DEVICE] [RETRIEVER_DEVICE]
[DOCUMENT_INDEX_DEVICE] [READER_DEVICE] [PRECISION]
[RETRIEVER_PRECISION] [DOCUMENT_INDEX_PRECISION]
[READER_PRECISION] [ANNOTATION_TYPE]
╭─ Arguments ─────────────────────────────────────────────────────────────────────────────────────────╮
│ * relik_pretrained TEXT [default: None] [required] │
│ device [DEVICE] The device to use for relik (e.g., │
│ ' cuda ' , ' cpu ' ). │
│ [default: None] │
│ retriever_device [RETRIEVER_DEVICE] The device to use for the retriever │
│ (e.g., ' cuda ' , ' cpu ' ). │
│ [default: None] │
│ document_index_device [DOCUMENT_INDEX_DEVICE] The device to use for the index │
│ (e.g., ' cuda ' , ' cpu ' ). │
│ [default: None] │
│ reader_device [READER_DEVICE] The device to use for the reader │
│ (e.g., ' cuda ' , ' cpu ' ). │
│ [default: None] │
│ precision [PRECISION] The precision to use for relik │
│ (e.g., ' 32 ' , ' 16 ' ). │
│ [default: 32] │
│ retriever_precision [RETRIEVER_PRECISION] The precision to use for the │
│ retriever (e.g., ' 32 ' , ' 16 ' ). │
│ [default: None] │
│ document_index_precision [DOCUMENT_INDEX_PRECISION] The precision to use for the index │
│ (e.g., ' 32 ' , ' 16 ' ). │
│ [default: None] │
│ reader_precision [READER_PRECISION] The precision to use for the reader │
│ (e.g., ' 32 ' , ' 16 ' ). │
│ [default: None] │
│ annotation_type [ANNOTATION_TYPE] The type of annotation to use (e.g., │
│ ' CHAR ' , ' WORD ' ). │
│ [default: char] │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────╮
│ --host TEXT [default: 0.0.0.0] │
│ --port INTEGER [default: 8000] │
│ --frontend --no-frontend [default: no-frontend] │
│ --help Show this message and exit. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────╯
Misalnya:
relik serve sapienzanlp/relik-entity-linking-largerelik inferencerelik inference --help
Usage: relik inference [OPTIONS] MODEL_NAME_OR_PATH INPUT_PATH OUTPUT_PATH
╭─ Arguments ─────────────────────────────────────────────────────────────────────────────────────────────╮
│ * model_name_or_path TEXT [default: None] [required] │
│ * input_path TEXT [default: None] [required] │
│ * output_path TEXT [default: None] [required] │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────╮
│ --batch-size INTEGER [default: 8] │
│ --num-workers INTEGER [default: 4] │
│ --device TEXT [default: cuda] │
│ --precision TEXT [default: fp16] │
│ --top-k INTEGER [default: 100] │
│ --window-size INTEGER [default: None] │
│ --window-stride INTEGER [default: None] │
│ --annotation-type TEXT [default: char] │
│ --progress-bar --no-progress-bar [default: progress-bar] │
│ --model-kwargs TEXT [default: None] │
│ --inference-kwargs TEXT [default: None] │
│ --help Show this message and exit. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯Misalnya:
relik inference sapienzanlp/relik-entity-linking-large data.txt output.jsonlGambar Docker untuk Relik tersedia di Docker Hub. Anda dapat menarik gambar terbaru dengan:
docker pull sapienzanlp/relik:latestdan jalankan gambar dengan:
docker run -p 12345:8000 sapienzanlp/relik:latest -c relik-ie/relik-cie-small API akan tersedia di http://localhost:12345 . Ini memperlihatkan titik akhir tunggal /relik dengan beberapa parameter yang dapat diteruskan ke model. Dokumentasi cepat API dapat ditemukan di http://localhost:12345/docs . Berikut adalah contoh sederhana tentang cara menanyakan API:
curl -X ' GET '
' http://127.0.0.1:12345/api/relik?text=Michael%20Jordan%20was%20one%20of%20the%20best%20players%20in%20the%20NBA.&is_split_into_words=false&retriever_batch_size=32&reader_batch_size=32&return_windows=false&use_doc_topic=false&annotation_type=char&relation_threshold=0.5 '
-H ' accept: application/json 'Di sini daftar lengkap parameter yang dapat diteruskan ke gambar Docker:
docker run sapienzanlp/relik:latest -h
Usage: relik [-h --help] [-c --config] [-p --precision] [-d --device] [--retriever] [--retriever-device]
[--retriever-precision] [--index-device] [--index-precision] [--reader] [--reader-device] [--reader-precision]
[--annotation-type] [--frontend] [--workers] -- start the FastAPI server for the RElik model
where:
-h --help Show this help text
-c --config Pretrained ReLiK config name (from HuggingFace) or path
-p --precision Precision, default ' 32 ' .
-d --device Device to use, default ' cpu ' .
--retriever Override retriever model name.
--retriever-device Override retriever device.
--retriever-precision Override retriever precision.
--index-device Override index device.
--index-precision Override index precision.
--reader Override reader model name.
--reader-device Override reader device.
--reader-precision Override reader precision.
--annotation-type Annotation type ( ' char ' , ' word ' ), default ' char ' .
--frontend Whether to start the frontend server.
--workers Number of workers to use.Pada bagian berikut, kami menyediakan panduan langkah demi langkah tentang cara menyiapkan data, melatih Retriever dan pembaca, dan mengevaluasi model.
Semua data Anda harus memiliki struktur berikut:
{
"doc_id" : int, # Unique identifier for the document
"doc_text" : txt, # Text of the document
"doc_span_annotations" : # Char level annotations
[
[ start, end, label ],
[ start, end, label ],
...
]
}Kami menggunakan Blink (Wu et al., 2019) dan dataset AIDA (Hoffart et al, 2011) untuk pelatihan dan evaluasi. Lebih khusus lagi, kami menggunakan dataset Blink untuk pra-pelatihan Retriever dan dataset AIDA untuk menyempurnakan penyetelan dan melatih pembaca.
Dataset Blink dapat diunduh dari repo genre menggunakan skrip ini. Kami menggunakan blink-train-kilt.jsonl dan blink-dev-kilt.jsonl sebagai dataset pelatihan dan validasi. Dengan asumsi kami telah mengunduh dua file di folder data/blink , kami mengonversi dataset blink ke format Relik menggunakan skrip berikut:
# Train
python scripts/data/blink/preprocess_genre_blink.py
data/blink/blink-train-kilt.jsonl
data/blink/processed/blink-train-kilt-relik.jsonl
# Dev
python scripts/data/blink/preprocess_genre_blink.py
data/blink/blink-dev-kilt.jsonl
data/blink/processed/blink-dev-kilt-relik.jsonl Dataset AIDA tidak tersedia untuk umum, tetapi kami menyediakan file yang kami gunakan tanpa bidang text . Anda dapat menemukan file dalam format Relik di folder data/aida/processed .
Indeks Wikipedia yang kami gunakan dapat diunduh dari sini.
Semua data Anda harus memiliki struktur berikut:
{
"doc_id" : int, # Unique identifier for the document
"doc_words: list[txt] # Tokenized text of the document
"doc_span_annotations" : # Token level annotations of mentions (label is optional)
[
[ start, end, label ],
[ start, end, label ],
...
],
"doc_triplet_annotations" : # Triplet annotations
[
{
"subject" : [ start, end, label ], # label is optional
"relation" : name, # type is optional
"object" : [ start, end, label ], # label is optional
},
{
"subject" : [ start, end, label ], # label is optional
"relation" : name, # type is optional
"object" : [ start, end, label ], # label is optional
},
]
}Untuk ekstraksi relasi, kami memberikan contoh cara preprocess dataset NYT dari RAW_NYT yang diambil dari penyalin. Unduh dataset ke data/raw_nyt dan kemudian jalankan:
python scripts/data/nyt/preprocess_nyt.py data/raw_nyt data/nyt/processed/Perlu diketahui bahwa untuk perbandingan yang adil, kami mereproduksi preprocessing dari pekerjaan sebelumnya, yang mengarah ke triplet duplikat karena penanganan yang salah dari bentuk permukaan yang diulang untuk rentang entitas. Jika Anda ingin menguraikan data asli dengan benar untuk Relik Format, Anda dapat mengatur format bendera-legacy-format. Ketahuilah bahwa model Re NYT yang disediakan dilatih pada format warisan.
Kami melakukan proses pelatihan dua langkah untuk Retriever. Pertama, kami "pra-pelatihan" retriever menggunakan dataset Blink (Wu et al., 2019), dan kemudian kami "menyempurnakan" menggunakan Aida (Hoffart et al, 2011).
Retriever membutuhkan dataset dalam format yang mirip dengan DPR: file jsonl di mana setiap baris adalah kamus dengan tombol berikut:
{
"question" : " .... " ,
"positive_ctxs" : [{
"title" : " ... " ,
"text" : " .... "
}],
"negative_ctxs" : [{
"title" : " ... " ,
"text" : " .... "
}],
"hard_negative_ctxs" : [{
"title" : " ... " ,
"text" : " .... "
}]
}Retriever juga membutuhkan indeks untuk mencari dokumen. Dokumen untuk indeks dapat berupa file JSONL atau file TSV yang mirip dengan DPR:
jsonl : Setiap baris adalah objek JSON dengan tombol berikut: id , text , metadatatsv : Setiap baris adalah string yang dipisahkan tab dengan kolom id dan text , diikuti oleh kolom lain yang akan disimpan di bidang metadata Contoh jsonl :
{
"id" : " ... " ,
"text" : " ... " ,
"metadata" : [ " {...} " ]
},
... Contoh tsv :
id t text t any other column
... Setelah Anda memiliki dataset blink dalam format Relik, Anda dapat membuat windows dengan skrip berikut:
# train
relik data create-windows
data/blink/processed/blink-train-kilt-relik.jsonl
data/blink/processed/blink-train-kilt-relik-windowed.jsonl
# dev
relik data create-windows
data/blink/processed/blink-dev-kilt-relik.jsonl
data/blink/processed/blink-dev-kilt-relik-windowed.jsonldan kemudian mengonversinya ke format DPR:
# train
relik data convert-to-dpr
data/blink/processed/blink-train-kilt-relik-windowed.jsonl
data/blink/processed/blink-train-kilt-relik-windowed-dpr.jsonl
data/kb/wikipedia/documents.jsonl
--title-map data/kb/wikipedia/title_map.json
# dev
relik data convert-to-dpr
data/blink/processed/blink-dev-kilt-relik-windowed.jsonl
data/blink/processed/blink-dev-kilt-relik-windowed-dpr.jsonl
data/kb/wikipedia/documents.jsonl
--title-map data/kb/wikipedia/title_map.json Karena dataset AIDA tidak tersedia untuk umum, kami dapat memberikan anotasi untuk dataset AIDA dalam format Relik sebagai contoh. Dengan asumsi Anda memiliki dataset AIDA lengkap di data/aida , Anda dapat mengonversinya ke format Relik dan kemudian membuat windows dengan skrip berikut:
relik data create-windows
data/aida/processed/aida-train-relik.jsonl
data/aida/processed/aida-train-relik-windowed.jsonldan kemudian mengonversinya ke format DPR:
relik data convert-to-dpr
data/aida/processed/aida-train-relik-windowed.jsonl
data/aida/processed/aida-train-relik-windowed-dpr.jsonl
data/kb/wikipedia/documents.jsonl
--title-map data/kb/wikipedia/title_map.jsonrelik data create-windows
data/data/processed/nyt/train.jsonl
data/data/processed/nyt/train-windowed.jsonl
--is-split-into-words
--window-size none dan kemudian mengonversinya ke format DPR:
relik data convert-to-dpr
data/data/processed/nyt/train-windowed.jsonl
data/data/processed/nyt/train-windowed-dpr.jsonl Perintah relik retriever train dapat digunakan untuk melatih retriever. Itu membutuhkan argumen berikut:
config_path : Jalur ke file konfigurasi.overrides : Daftar overrides ke file konfigurasi, di key=value . Contoh file konfigurasi dapat ditemukan di folder relik/retriever/conf .
File konfigurasi di relik/retriever/conf pretrain_iterable_in_batch.yaml dan finetune_iterable_in_batch.yaml , yang kami gunakan untuk masing-masing pra-pelatihan dan menyempurnakan retriever.
Misalnya, untuk melatih retriever pada dataset AIDA, Anda dapat menjalankan perintah berikut:
relik retriever train relik/retriever/conf/finetune_iterable_in_batch.yaml
model.language_model=intfloat/e5-base-v2
data.train_dataset_path=data/aida/processed/aida-train-relik-windowed-dpr.jsonl
data.val_dataset_path=data/aida/processed/aida-dev-relik-windowed-dpr.jsonl
data.test_dataset_path=data/aida/processed/aida-test-relik-windowed-dpr.jsonl
data.shared_params.documents_path=data/kb/wikipedia/documents.jsonl File konfigurasi di relik/retriever/conf adalah finetune_nyt_iterable_in_batch.yaml , yang kami gunakan untuk menyempurnakan retriever untuk dataset NYT. Untuk CIE kami menggunakan kembali yang pretrained dari Blink pada langkah sebelumnya.
Misalnya, untuk melatih retriever pada dataset NYT, Anda dapat menjalankan perintah berikut:
relik retriever train relik/retriever/conf/finetune_nyt_iterable_in_batch.yaml
model.language_model=intfloat/e5-base-v2
data.train_dataset_path=data/nyt/processed/nyt-train-relik-windowed-dpr.jsonl
data.val_dataset_path=data/nyt/processed/nyt-dev-relik-windowed-dpr.jsonl
data.test_dataset_path=data/nyt/processed/nyt-test-relik-windowed-dpr.jsonl Dengan melewati train.only_test=True dengan perintah relik retriever train , Anda dapat melewatkan pelatihan dan hanya mengevaluasi model. Dibutuhkan juga jalur ke pos pemeriksaan Pytorch Lightning dan dataset untuk dievaluasi.
relik retriever train relik/retriever/conf/finetune_iterable_in_batch.yaml
train.only_test=True
test_dataset_path=data/aida/processed/aida-test-relik-windowed-dpr.jsonl
model.checkpoint_path=path/to/checkpointEncoder retriever dapat disimpan dari pos pemeriksaan dengan perintah berikut:
from relik . retriever . lightning_modules . pl_modules import GoldenRetrieverPLModule
checkpoint_path = "path/to/checkpoint"
retriever_folder = "path/to/retriever"
# If you want to push the model to the Hugging Face Hub set push_to_hub=True
push_to_hub = False
# If you want to push the model to the Hugging Face Hub set the repo_id
repo_id = "sapienzanlp/relik-retriever-e5-base-v2-aida-blink-encoder"
pl_module = GoldenRetrieverPLModule . load_from_checkpoint ( checkpoint_path )
pl_module . model . save_pretrained ( retriever_folder , push_to_hub = push_to_hub , repo_id = repo_id ) Dengan push_to_hub=True model akan didorong ke? Memeluk hub wajah dengan repo_id sebagai id repositori di mana model akan didorong.
Retriever membutuhkan indeks untuk mencari dokumen. Indeks dapat dibuat menggunakan relik retriever create-index Command
relik retriever create-index --help
Usage: relik retriever build-index [OPTIONS] QUESTION_ENCODER_NAME_OR_PATH
DOCUMENT_PATH OUTPUT_FOLDER
╭─ Arguments ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * question_encoder_name_or_path TEXT [default: None] [required] │
│ * document_path TEXT [default: None] [required] │
│ * output_folder TEXT [default: None] [required] │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --document-file-type TEXT [default: jsonl] │
│ --passage-encoder-name-or-path TEXT [default: None] │
│ --indexer-class TEXT [default: relik.retriever.indexers.inmemory.InMemoryDocumentIndex] │
│ --batch-size INTEGER [default: 512] │
│ --num-workers INTEGER [default: 4] │
│ --passage-max-length INTEGER [default: 64] │
│ --device TEXT [default: cuda] │
│ --index-device TEXT [default: cpu] │
│ --precision TEXT [default: fp32] │
│ --push-to-hub --no-push-to-hub [default: no-push-to-hub] │
│ --repo-id TEXT [default: None] │
│ --help Show this message and exit. │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯Dengan encoder dan indeks, retriever dapat dimuat dari ID repo atau jalur lokal:
from relik . retriever import GoldenRetriever
encoder_name_or_path = "sapienzanlp/relik-retriever-e5-base-v2-aida-blink-encoder"
index_name_or_path = "sapienzanlp/relik-retriever-e5-base-v2-aida-blink-wikipedia-index"
retriever = GoldenRetriever (
question_encoder = encoder_name_or_path ,
document_index = index_name_or_path ,
device = "cuda" , # or "cpu"
precision = "16" , # or "32", "bf16"
index_device = "cuda" , # or "cpu"
index_precision = "16" , # or "32", "bf16"
)Dan kemudian dapat digunakan untuk mengambil dokumen:
retriever . retrieve ( "Michael Jordan was one of the best players in the NBA." , top_k = 100 ) Pembaca bertanggung jawab untuk mengekstraksi entitas dan hubungan dari dokumen dari satu set kandidat (misalnya, kemungkinan entitas atau hubungan). Pembaca dapat dilatih untuk ekstraksi rentang atau ekstraksi triplet. RelikReaderForSpanExtraction digunakan untuk ekstraksi rentang, yaitu entitas yang menghubungkan, sedangkan RelikReaderForTripletExtraction digunakan untuk ekstraksi triplet, yaitu ekstraksi relasi.
Pembaca membutuhkan dataset jendela yang kami buat di bagian sebelum Anda mulai ditambah dengan kandidat dari retriever. Kandidat dapat ditambahkan ke dataset menggunakan perintah relik retriever add-candidates .
relik retriever add-candidates --help
Usage: relik retriever add-candidates [OPTIONS] QUESTION_ENCODER_NAME_OR_PATH
DOCUMENT_NAME_OR_PATH INPUT_PATH
OUTPUT_PATH
╭─ Arguments ─────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * question_encoder_name_or_path TEXT [default: None] [required] │
│ * document_name_or_path TEXT [default: None] [required] │
│ * input_path TEXT [default: None] [required] │
│ * output_path TEXT [default: None] [required] │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --passage-encoder-name-or-path TEXT [default: None] │
│ --relations BOOLEAN [default: False] │
│ --top-k INTEGER [default: 100] │
│ --batch-size INTEGER [default: 128] │
│ --num-workers INTEGER [default: 4] │
│ --device TEXT [default: cuda] │
│ --index-device TEXT [default: cpu] │
│ --precision TEXT [default: fp32] │
│ --use-doc-topics --no-use-doc-topics [default: no-use-doc-topics] │
│ --help Show this message and exit. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯Kita perlu menambahkan kandidat ke setiap jendela yang akan digunakan oleh pembaca, menggunakan retriever kami yang sebelumnya terlatih. Berikut adalah contoh menggunakan retriever kami yang sudah terlatih di Aida untuk split kereta:
relik retriever add-candidates sapienzanlp/relik-retriever-e5-base-v2-aida-blink-encoder sapienzanlp/relik-retriever-e5-base-v2-aida-blink-wikipedia-index data/aida/processed/aida-train-relik-windowed.jsonl data/aida/processed/aida-train-relik-windowed-candidates.jsonlHal yang sama terjadi untuk ekstraksi hubungan. Jika Anda ingin menggunakan retriever terlatih kami:
relik retriever add-candidates sapienzanlp/relik-retriever-small-nyt-question-encoder sapienzanlp/relik-retriever-small-nyt-document-index data/nyt/processed/nyt-train-relik-windowed.jsonl data/nyt/processed/nyt-train-relik-windowed-candidates.jsonl Mirip dengan retriever, perintah relik reader train dapat digunakan untuk melatih retriever. Itu membutuhkan argumen berikut:
config_path : Jalur ke file konfigurasi.overrides : Daftar overrides ke file konfigurasi, di key=value . Contoh file konfigurasi dapat ditemukan di folder relik/reader/conf .
File konfigurasi di base.yaml relik/reader/conf adalah large.yaml . Misalnya, untuk melatih pembaca besar di Dataset Aida Run:
relik reader train relik/reader/conf/large.yaml
train_dataset_path=data/aida/processed/aida-train-relik-windowed-candidates.jsonl
val_dataset_path=data/aida/processed/aida-dev-relik-windowed-candidates.jsonl
test_dataset_path=data/aida/processed/aida-dev-relik-windowed-candidates.jsonl File konfigurasi di relik/reader/conf adalah large_nyt.yaml , base_nyt.yaml , dan small_nyt.yaml , yang kami gunakan untuk melatih masing -masing, base, dan pembaca kecil. Misalnya, untuk melatih pembaca besar di Dataset Aida Run:
relik reader train relik/reader/conf/large_nyt.yaml
train_dataset_path=data/nyt/processed/nyt-train-relik-windowed-candidates.jsonl
val_dataset_path=data/nyt/processed/nyt-dev-relik-windowed-candidates.jsonl
test_dataset_path=data/nyt/processed/nyt-test-relik-windowed-candidates.jsonlPembaca dapat disimpan dari pos pemeriksaan dengan perintah berikut:
from relik . reader . lightning_modules . relik_reader_pl_module import RelikReaderPLModule
checkpoint_path = "path/to/checkpoint"
reader_folder = "path/to/reader"
# If you want to push the model to the Hugging Face Hub set push_to_hub=True
push_to_hub = False
# If you want to push the model to the Hugging Face Hub set the repo_id
repo_id = "sapienzanlp/relik-reader-deberta-v3-large-aida"
pl_model = RelikReaderPLModule . load_from_checkpoint (
trainer . checkpoint_callback . best_model_path
)
pl_model . relik_reader_core_model . save_pretrained ( experiment_path , push_to_hub = push_to_hub , repo_id = repo_id ) dengan push_to_hub=True model akan didorong ke? Memeluk hub wajah dengan repo_id sebagai id repositori di mana model akan diunggah.
Pembaca dapat dimuat dari ID repo atau jalur lokal:
from relik . reader import RelikReaderForSpanExtraction , RelikReaderForTripletExtraction
# the reader for span extraction
reader_span = RelikReaderForSpanExtraction (
"sapienzanlp/relik-reader-deberta-v3-large-aida"
)
# the reader for triplet extraction
reader_tripltes = RelikReaderForTripletExtraction (
"sapienzanlp/relik-reader-deberta-v3-large-nyt"
)dan digunakan untuk mengekstraksi entitas dan hubungan:
# an example of candidates for the reader
candidates = [ "Michael Jordan" , "NBA" , "Chicago Bulls" , "Basketball" , "United States" ]
reader_span . read ( "Michael Jordan was one of the best players in the NBA." , candidates = candidates )Kami mengevaluasi kinerja Relik pada entitas yang menghubungkan menggunakan gerbil. Tabel berikut menunjukkan hasil (InkB mikro F1) dari Relik Besar dan Basis:
| Model | Aida | MSNBC | Der | K50 | R128 | R500 | O15 | O16 | Tot | Ood | AIT (M: S) |
|---|---|---|---|---|---|---|---|---|---|---|---|
| GENRE | 83.7 | 73.7 | 54.1 | 60.7 | 46.7 | 40.3 | 56.1 | 50.0 | 58.2 | 54.5 | 38:00 |
| Entqa | 85.8 | 72.1 | 52.9 | 64.5 | 54.1 | 41.9 | 61.1 | 51.3 | 60.5 | 56.4 | 20:00 |
| Relik kecil | 82.2 | 72.7 | 55.6 | 68.3 | 48.0 | 42.3 | 62.7 | 53.6 | 60.7 | 57.6 | 00:29 |
| Basis relik | 85.3 | 72.3 | 55.6 | 68.0 | 48.1 | 41.6 | 62.5 | 52.3 | 60.7 | 57.2 | 00:29 |
| Relik besar | 86.4 | 75.0 | 56.3 | 72.8 | 51.7 | 43.0 | 65.1 | 57.2 | 63.4 | 60.2 | 01:46 |
Evaluasi Sistem Perbandingan (InkB Micro F1) pada set uji AIDA dalam domain dan MSNBC (MSN) di luar domain (MSN), Derczynski (Der), Kore50 (K50), Test N3-Reuters-128 (R128), N3-RSS-500 (R500), Oke-158 (OKE. Bold menunjukkan model terbaik. Genre menggunakan kamus yang disebutkan. Kolom AIT menunjukkan waktu dalam menit dan detik (m: s) bahwa sistem perlu memproses seluruh set uji AIDA menggunakan NVIDIA RTX 4090, kecuali untuk ENTQA yang tidak sesuai dengan RAM 24GB dan yang digunakan A100.
Untuk mengevaluasi Relik, kami menggunakan langkah -langkah berikut:
Unduh server gerbil dari sini.
Mulai server gerbil:
cd gerbil && ./start.sh cd gerbil-SpotWrapNifWS4Test && mvn clean -Dmaven.tomcat.port=1235 tomcat:runsapienzanlp/relik-entity-linking-large ): python relik/reader/utils/gerbil.py --relik-model-name sapienzanlp/relik-entity-linking-largeTabel berikut menunjukkan hasil (mikro F1) dari Relik besar pada dataset NYT:
| Model | NYT | NYT (pretr) | AIT (M: S) |
|---|---|---|---|
| PEMBERONTAK | 93.1 | 93.4 | 01:45 |
| Uie | 93.5 | - | - |
| USM | 94.0 | 94.1 | - |
| Relik besar | 95.0 | 94.9 | 00:30 |
Untuk mengevaluasi ekstraksi relasi, kami dapat secara langsung menggunakan pembaca dengan skrip Relik/pembaca/pelatih/prediksi_re.py, menunjuk pada file dengan kandidat yang sudah diambil. Jika Anda ingin menggunakan pembaca terlatih kami:
python relik/reader/trainer/predict_re.py --model_path sapienzanlp/relik-reader-deberta-v3-large-nyt --data_path /Users/perelluis/Documents/relik/data/debug/test.window.candidates.jsonl --is-evalKetahuilah bahwa kami menghitung ambang batas untuk memprediksi hubungan berdasarkan set pengembangan. Untuk menghitungnya saat mengevaluasi Anda dapat menjalankan yang berikut:
python relik/reader/trainer/predict_re.py --model_path sapienzanlp/relik-reader-deberta-v3-large-nyt --data_path /Users/perelluis/Documents/relik/data/debug/dev.window.candidates.jsonl --is-eval --compute-thresholdJika Anda menggunakan bagian mana pun dari pekerjaan ini, silakan pertimbangkan mengutip kertas sebagai berikut:
@inproceedings { orlando-etal-2024-relik ,
title = " Retrieve, Read and LinK: Fast and Accurate Entity Linking and Relation Extraction on an Academic Budget " ,
author = " Orlando, Riccardo and Huguet Cabot, Pere-Llu{'i}s and Barba, Edoardo and Navigli, Roberto " ,
booktitle = " Findings of the Association for Computational Linguistics: ACL 2024 " ,
month = aug,
year = " 2024 " ,
address = " Bangkok, Thailand " ,
publisher = " Association for Computational Linguistics " ,
}Data dan perangkat lunak dilisensikan di bawah Creative Commons Attribution-NonCommercial-Sharealike 4.0.