

รูปแบบการสกัดข้อมูลที่รวดเร็วและมีน้ำหนักเบาสำหรับ การเชื่อมโยงเอนทิตี และ การสกัดความสัมพันธ์
การติดตั้งจาก PYPI
pip install relikติดตั้งด้วยการพึ่งพาตัวเลือกทั้งหมด
pip install relik[all]ติดตั้งด้วยอุปกรณ์เสริมสำหรับการฝึกอบรมและการประเมินผล
pip install relik[train]ติดตั้งด้วยอุปกรณ์เสริมสำหรับ FAISS
แพ็คเกจ FAISS PYPI มีให้เฉพาะสำหรับ CPU สำหรับ GPU ติดตั้งจากแหล่งที่มาหรือใช้แพ็คเกจ Conda
สำหรับ CPU:
pip install relik[faiss]สำหรับ 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 relikติดตั้งด้วยการพึ่งพาอุปกรณ์เสริมสำหรับการให้บริการรุ่นด้วย fastapi และ ray
pip install relik[serve]git clone https://github.com/SapienzaNLP/relik.git
cd relik
pip install -e .[all] relik ขนาดใหญ่สำหรับการสกัดสัมพันธ์ (? ขนาดใหญ่ RE V2, colab ✅) : relik-ie/relik-relation-extraction-large
relik ขนาดใหญ่สำหรับการสกัดข้อมูลปิด (? El + RE ขนาดใหญ่, colab ✅) : https://huggingface.co/relik-ie/relik-cie-large
relik ขนาดใหญ่พิเศษสำหรับการสกัดข้อมูลปิด (? thicc boi ของเราสำหรับ el + re) : relik-ie/relik-cie-xl
relik เล็กสำหรับการเชื่อมโยงเอนทิตี ( sapienzanlp/relik-entity-linking-small
relik ขนาดเล็กสำหรับการเชื่อมโยงเอนทิตี (⚡ EL ขนาดเล็กและเร็ว) : sapienzanlp/relik-entity-linking-small
Relik Small สำหรับการสกัดข้อมูลปิด (El + RE) : relik-ie/relik-cie-small
relik ขนาดใหญ่สำหรับการเชื่อมโยงเอนทิตี (El for the wild) : relik-ie/relik-entity-linking-large-robust
relik เล็กสำหรับการเชื่อมโยงเอนทิตี (re + ner) : relik-ie/relik-relation-extraction-small-wikipedia-ner
รุ่นจากกระดาษ:
sapienzanlp/relik-entity-linking-largesapienzanlp/relik-entity-linking-basesapienzanlp/relik-relation-extraction-nyt-largeสามารถพบรายการแบบจำลองทั้งหมดได้หรือไม่? กอดใบหน้า
ขนาดรุ่นอื่น ๆ จะมีให้ในอนาคต?
Relik เป็นแบบจำลองที่มีน้ำหนักเบาและรวดเร็วสำหรับ การเชื่อมโยงเอนทิตี และ การสกัดความสัมพันธ์ มันประกอบด้วยสององค์ประกอบหลัก: รีทรีฟเวอร์และผู้อ่าน Retriever รับผิดชอบในการดึงเอกสารที่เกี่ยวข้องจากคอลเลกชันขนาดใหญ่ในขณะที่ผู้อ่านมีหน้าที่รับผิดชอบในการแยกเอนทิตีและความสัมพันธ์จากเอกสารที่ดึงมา Relik สามารถใช้กับวิธี from_pretrained เพื่อโหลดไปป์ไลน์ที่ผ่านการฝึกอบรมมาแล้ว
นี่คือตัวอย่างของวิธีการใช้ Relik สำหรับการเชื่อมโยงเอนทิตี:
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." )เอาท์พุท:
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},
...
]
]
]
),
)
และสำหรับการสกัดความสัมพันธ์:
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." )เอาท์พุท:
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 only output จะมีผู้สมัครสำหรับข้อความอินพุต
ตัวอย่าง Retriever เท่านั้น:
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." )เอาท์พุท:
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=[],
),
)
ตัวอย่างผู้อ่านเท่านั้น:
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 )เอาท์พุท:
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 จัดเตรียม CLI เพื่อให้บริการเซิร์ฟเวอร์ fastapi สำหรับรุ่นหรือเพื่อทำการอนุมานในชุดข้อมูล
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. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────╯
ตัวอย่างเช่น:
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. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ตัวอย่างเช่น:
relik inference sapienzanlp/relik-entity-linking-large data.txt output.jsonlDocker Images for Relik มีอยู่ใน Docker Hub คุณสามารถดึงภาพล่าสุดด้วย:
docker pull sapienzanlp/relik:latestและเรียกใช้ภาพด้วย:
docker run -p 12345:8000 sapienzanlp/relik:latest -c relik-ie/relik-cie-small API จะมีให้ที่ http://localhost:12345 มันเปิดเผยจุดสิ้นสุด /relik เดียวที่มีพารามิเตอร์หลายตัวที่สามารถส่งผ่านไปยังโมเดล เอกสารฉบับย่อของ API สามารถดูได้ที่ http://localhost:12345/docs นี่คือตัวอย่างง่ายๆของวิธีการสอบถาม 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 'นี่คือรายการพารามิเตอร์ทั้งหมดที่สามารถส่งผ่านไปยังภาพนักเทียบท่า:
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.ในส่วนต่อไปนี้เราให้คำแนะนำทีละขั้นตอนเกี่ยวกับวิธีการเตรียมข้อมูลฝึกอบรมรีทรีฟเวอร์และผู้อ่านและประเมินโมเดล
ข้อมูลทั้งหมดของคุณควรมีโครงสร้างดังต่อไปนี้:
{
"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 ],
...
]
}เราใช้ Blink (Wu et al., 2019) และ AIDA (Hoffart et al, 2011) ชุดข้อมูลสำหรับการฝึกอบรมและการประเมินผล โดยเฉพาะอย่างยิ่งเราใช้ชุดข้อมูล Blink สำหรับการฝึกอบรมก่อนการรีทรีฟเวอร์และชุดข้อมูล AIDA สำหรับการปรับจูนรีทรีฟเวอร์และฝึกอบรมผู้อ่าน
ชุดข้อมูล Blink สามารถดาวน์โหลดได้จากประเภท repo โดยใช้สคริปต์นี้ เราใช้ blink-train-kilt.jsonl และ blink-dev-kilt.jsonl เป็นชุดข้อมูลการฝึกอบรมและการตรวจสอบความถูกต้อง สมมติว่าเราได้ดาวน์โหลดไฟล์สองไฟล์ในโฟลเดอร์ data/blink เราแปลงชุดข้อมูล Blink เป็นรูปแบบ relik โดยใช้สคริปต์ต่อไปนี้:
# 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 ชุดข้อมูล AIDA ไม่เปิดเผยต่อสาธารณะ แต่เราให้ไฟล์ที่เราใช้โดยไม่มีฟิลด์ text คุณสามารถค้นหาไฟล์ในรูปแบบ Relik ในโฟลเดอร์ data/aida/processed
ดัชนี Wikipedia ที่เราใช้สามารถดาวน์โหลดได้จากที่นี่
ข้อมูลทั้งหมดของคุณควรมีโครงสร้างดังต่อไปนี้:
{
"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
},
]
}สำหรับการแยกความสัมพันธ์เราให้ตัวอย่างของวิธีประมวลผลชุดข้อมูล NYT ล่วงหน้าจาก RAW_NYT ที่นำมาจาก Copyre ดาวน์โหลดชุดข้อมูลไปยัง Data/RAW_NYT จากนั้นเรียกใช้:
python scripts/data/nyt/preprocess_nyt.py data/raw_nyt data/nyt/processed/โปรดทราบว่าสำหรับการเปรียบเทียบที่เป็นธรรมเราทำซ้ำการประมวลผลล่วงหน้าจากงานก่อนหน้านี้ซึ่งนำไปสู่การทำซ้ำสามครั้งเนื่องจากการจัดการที่ไม่ถูกต้องของรูปแบบพื้นผิวซ้ำสำหรับช่วงเอนทิตี หากคุณต้องการแยกวิเคราะห์ข้อมูลต้นฉบับเป็นรูปแบบ relik อย่างถูกต้องคุณสามารถตั้งค่าการตั้งค่าสถานะ-legacy-format false เพิ่งทราบว่าโมเดล NYT ที่ได้รับการฝึกฝนในรูปแบบมรดก
เราดำเนินการฝึกอบรมสองขั้นตอนสำหรับ Retriever ก่อนอื่นเรา "รถไฟก่อน" รีทรีฟเวอร์โดยใช้ชุดข้อมูล Blink (Wu et al., 2019) และจากนั้นเรา "ปรับแต่ง" โดยใช้ Aida (Hoffart et al, 2011)
Retriever ต้องการชุดข้อมูลในรูปแบบที่คล้ายกับ DPR: ไฟล์ jsonl ที่แต่ละบรรทัดเป็นพจนานุกรมที่มีคีย์ต่อไปนี้:
{
"question" : " .... " ,
"positive_ctxs" : [{
"title" : " ... " ,
"text" : " .... "
}],
"negative_ctxs" : [{
"title" : " ... " ,
"text" : " .... "
}],
"hard_negative_ctxs" : [{
"title" : " ... " ,
"text" : " .... "
}]
}Retriever ยังต้องการดัชนีเพื่อค้นหาเอกสาร เอกสารในการจัดทำดัชนีอาจเป็นไฟล์ JSONL หรือไฟล์ TSV ที่คล้ายกับ DPR:
jsonl : แต่ละบรรทัดเป็นวัตถุ JSON ที่มีคีย์ต่อไปนี้: id , text , metadatatsv : แต่ละบรรทัดเป็นสตริงที่คั่นด้วยแท็บพร้อมคอลัมน์ id และ text ตามด้วยคอลัมน์อื่น ๆ ที่จะเก็บไว้ในฟิลด์ metadata ตัวอย่าง jsonl :
{
"id" : " ... " ,
"text" : " ... " ,
"metadata" : [ " {...} " ]
},
... ตัวอย่าง tsv :
id t text t any other column
... เมื่อคุณมีชุดข้อมูล Blink ในรูปแบบ relik คุณสามารถสร้าง windows ด้วยสคริปต์ต่อไปนี้:
# 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.jsonlจากนั้นแปลงเป็นรูปแบบ 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 เนื่องจากชุดข้อมูล AIDA ไม่เปิดเผยต่อสาธารณะเราจึงสามารถให้คำอธิบายประกอบสำหรับชุดข้อมูล AIDA ในรูปแบบ Relik เป็นตัวอย่าง สมมติว่าคุณมีชุดข้อมูล AIDA เต็มรูปแบบใน data/aida คุณสามารถแปลงเป็นรูปแบบ Relik จากนั้นสร้าง Windows ด้วยสคริปต์ต่อไปนี้:
relik data create-windows
data/aida/processed/aida-train-relik.jsonl
data/aida/processed/aida-train-relik-windowed.jsonlจากนั้นแปลงเป็นรูปแบบ 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 จากนั้นแปลงเป็นรูปแบบ DPR:
relik data convert-to-dpr
data/data/processed/nyt/train-windowed.jsonl
data/data/processed/nyt/train-windowed-dpr.jsonl สามารถใช้คำสั่ง relik retriever train เพื่อฝึกอบรม Retriever ได้ ต้องใช้อาร์กิวเมนต์ต่อไปนี้:
config_path : พา ธ ไปยังไฟล์การกำหนดค่าoverrides : รายการของการแทนที่ไปยังไฟล์การกำหนดค่าใน key=value ตัวอย่างของไฟล์การกำหนดค่าสามารถพบได้ในโฟลเดอร์ relik/retriever/conf
ไฟล์การกำหนดค่าใน relik/retriever/conf นั้นเป็น pretrain_iterable_in_batch.yaml และ finetune_iterable_in_batch.yaml ซึ่งเราใช้ในการฝึกอบรมล่วงหน้า
ตัวอย่างเช่นในการฝึกอบรม Retriever ในชุดข้อมูล AIDA คุณสามารถเรียกใช้คำสั่งต่อไปนี้:
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 ไฟล์การกำหนดค่าใน relik/retriever/conf คือ finetune_nyt_iterable_in_batch.yaml ซึ่งเราใช้เพื่อปรับแต่งรีทรีฟเวอร์สำหรับชุดข้อมูล NYT สำหรับ CIE เราเปลี่ยนสิ่งที่ได้รับการปรับแต่งจาก Blink ในขั้นตอนก่อนหน้า
ตัวอย่างเช่นในการฝึกอบรม Retriever ในชุดข้อมูล NYT คุณสามารถเรียกใช้คำสั่งต่อไปนี้:
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 โดยการผ่าน train.only_test=True กับคำสั่ง relik retriever train คุณสามารถข้ามการฝึกอบรมและประเมินแบบจำลองเท่านั้น มันต้องการเส้นทางไปยังจุดตรวจ Lightning Pytorch และชุดข้อมูลเพื่อประเมิน
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/checkpointตัวเข้ารหัส Retriever สามารถบันทึกได้จากจุดตรวจสอบด้วยคำสั่งต่อไปนี้:
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 ) ด้วย push_to_hub=True โมเดลจะถูกผลักไปที่? Hugging Face Hub ด้วย repo_id เป็น ID ที่เก็บที่จะผลักโมเดล
Retriever ต้องการดัชนีเพื่อค้นหาเอกสาร ดัชนีสามารถสร้างได้โดยใช้คำสั่ง relik retriever create-index
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. │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ด้วย encoder และดัชนี retriever สามารถโหลดได้จาก repo id หรือเส้นทางท้องถิ่น:
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"
)จากนั้นก็สามารถใช้ในการดึงเอกสาร:
retriever . retrieve ( "Michael Jordan was one of the best players in the NBA." , top_k = 100 ) ผู้อ่านมีหน้าที่รับผิดชอบในการแยกหน่วยงานและความสัมพันธ์จากเอกสารจากชุดผู้สมัคร (เช่นหน่วยงานหรือความสัมพันธ์ที่เป็นไปได้) ผู้อ่านสามารถได้รับการฝึกฝนสำหรับการสกัดแบบสปักหรือการสกัด triplet RelikReaderForSpanExtraction ใช้สำหรับการสกัดแบบขยายเช่นการเชื่อมโยงเอนทิตีในขณะที่ RelikReaderForTripletExtraction ใช้สำหรับการสกัด triplet, IE Relation Extraction
ผู้อ่านต้องการชุดข้อมูลที่เราสร้างขึ้นในส่วนก่อนที่คุณจะเริ่มเพิ่มกับผู้สมัครจาก Retriever ผู้สมัครสามารถเพิ่มลงในชุดข้อมูลโดยใช้คำสั่ง 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. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯เราจำเป็นต้องเพิ่มผู้สมัครในแต่ละหน้าต่างที่ผู้อ่านจะใช้โดยใช้รีทรีฟเวอร์ที่ผ่านการฝึกอบรมมาก่อน นี่คือตัวอย่างที่ใช้ Retriever ที่ผ่านการฝึกอบรมแล้วของเราเกี่ยวกับ AIDA สำหรับการแยกรถไฟ:
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.jsonlสิ่งเดียวกันนี้เกิดขึ้นสำหรับการสกัดความสัมพันธ์ หากคุณต้องการใช้ Retriever ที่ผ่านการฝึกอบรมของเรา:
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 เช่นเดียวกับ Retriever คำสั่ง relik reader train สามารถใช้ในการฝึกอบรม Retriever ต้องใช้อาร์กิวเมนต์ต่อไปนี้:
config_path : พา ธ ไปยังไฟล์การกำหนดค่าoverrides : รายการของการแทนที่ไปยังไฟล์การกำหนดค่าใน key=value ตัวอย่างของไฟล์การกำหนดค่าสามารถพบได้ในโฟลเดอร์ relik/reader/conf
ไฟล์การกำหนดค่าใน relik/reader/conf มี large.yaml และ base.yaml ซึ่งเราใช้ในการฝึกอบรมเครื่องอ่านขนาดใหญ่และฐานตามลำดับ ตัวอย่างเช่นการฝึกอบรมผู้อ่านขนาดใหญ่ในชุดข้อมูล AIDA:
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 ไฟล์การกำหนดค่าใน relik/reader/conf คือ large_nyt.yaml , base_nyt.yaml และ small_nyt.yaml ซึ่งเราใช้ฝึกอบรมขนาดใหญ่ฐานและตัวอ่านขนาดเล็กตามลำดับ ตัวอย่างเช่นการฝึกอบรมผู้อ่านขนาดใหญ่ในชุดข้อมูล AIDA:
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.jsonlผู้อ่านสามารถบันทึกได้จากจุดตรวจด้วยคำสั่งต่อไปนี้:
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 ) ด้วย push_to_hub=True โมเดลจะถูกผลักไปที่? Hugging Face Hub ด้วย repo_id เป็น ID ที่เก็บซึ่งจะอัปโหลดโมเดล
ผู้อ่านสามารถโหลดได้จาก repo id หรือเส้นทางท้องถิ่น:
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"
)และใช้ในการแยกเอนทิตีและความสัมพันธ์:
# 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 )เราประเมินประสิทธิภาพของ Relik ในการเชื่อมโยงเอนทิตีโดยใช้ Gerbil ตารางต่อไปนี้แสดงผลลัพธ์ (Inkb Micro F1) ของ Relik ขนาดใหญ่และฐาน:
| แบบอย่าง | ไอด้า | MSNBC | เดอร์ | K50 | R128 | R500 | O15 | O16 | เป็นจำนวนมาก | อู๊ด | AIT (M: S) |
|---|---|---|---|---|---|---|---|---|---|---|---|
| ประเภท | 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 Small | 82.2 | 72.7 | 55.6 | 68.3 | 48.0 | 42.3 | 62.7 | 53.6 | 60.7 | 57.6 | 00:29 |
| ฐาน Relik | 85.3 | 72.3 | 55.6 | 68.0 | 48.1 | 41.6 | 62.5 | 52.3 | 60.7 | 57.2 | 00:29 |
| relik ใหญ่ | 86.4 | 75.0 | 56.3 | 72.8 | 51.7 | 43.0 | 65.1 | 57.2 | 63.4 | 60.2 | 01:46 |
การประเมินผลของระบบเปรียบเทียบ (Inkb Micro F1) ในชุดทดสอบ AIDA ในโดเมน และ นอกโดเมน MSNBC (MSN), Derczynski (DER), KORE50 (K50), N3-Reuter-128 (R128), N3-RS-500 (R500), OKE-15 (O15) ตัวหนา แสดงถึงรุ่นที่ดีที่สุด ประเภทการใช้พจนานุกรมกล่าวถึง คอลัมน์ AIT แสดงเวลาเป็นนาทีและวินาที (M: S) ที่ระบบจำเป็นต้องประมวลผลชุดทดสอบ AIDA ทั้งหมดโดยใช้ NVIDIA RTX 4090 ยกเว้น ENTQA ซึ่งไม่พอดีกับ RAM 24GB และใช้ A100
เพื่อประเมิน Relik เราใช้ขั้นตอนต่อไปนี้:
ดาวน์โหลดเซิร์ฟเวอร์ Gerbil จากที่นี่
เริ่มเซิร์ฟเวอร์ 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-largeตารางต่อไปนี้แสดงผลลัพธ์ (Micro F1) ของ Relik ขนาดใหญ่ในชุดข้อมูล NYT:
| แบบอย่าง | NYT | NYT (pretr) | AIT (M: S) |
|---|---|---|---|
| กบฏ | 93.1 | 93.4 | 01:45 |
| UIE | 93.5 | - | - |
| USM | 94.0 | 94.1 | - |
| relik ใหญ่ | 95.0 | 94.9 | 00:30 น |
ในการประเมินการแยกความสัมพันธ์เราสามารถใช้ตัวอ่านโดยตรงกับสคริปต์ relik/reader/trainer/predict_re.py ชี้ไปที่ไฟล์พร้อมผู้สมัครที่ดึงมาแล้ว หากคุณต้องการใช้ผู้อ่านที่ผ่านการฝึกอบรมของเรา:
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-evalโปรดทราบว่าเราคำนวณเกณฑ์สำหรับการทำนายความสัมพันธ์ตามชุดการพัฒนา ในการคำนวณในขณะที่ประเมินคุณสามารถเรียกใช้สิ่งต่อไปนี้:
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-thresholdหากคุณใช้ส่วนใดส่วนหนึ่งของงานนี้โปรดพิจารณาอ้างถึงบทความดังนี้:
@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 " ,
}ข้อมูลและซอฟต์แวร์ได้รับใบอนุญาตภายใต้ Creative Commons Attribution-Noncommercial-Sharealike 4.0