偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

大模型在知識(shí)圖譜問(wèn)答上的核心算法詳細(xì)思路及實(shí)踐 原創(chuàng)

發(fā)布于 2025-7-28 09:50
瀏覽
0收藏

前言

本文介紹了一個(gè)融合RAG(Retrieval-Augmented Generation)思路的KBQA(Knowledge-Based Question Answering)系統(tǒng)的核心算法及實(shí)現(xiàn)步驟。KBQA系統(tǒng)的目標(biāo)是通過(guò)自然語(yǔ)言處理技術(shù),從知識(shí)圖譜中提取和生成精確的答案。系統(tǒng)的實(shí)現(xiàn)包括多個(gè)關(guān)鍵步驟:mention識(shí)別、實(shí)體鏈接及排序、屬性選擇及排序、文本拼接以及最終的Text2SQL生成。通過(guò)這些步驟,系統(tǒng)能夠準(zhǔn)確識(shí)別用戶(hù)提出的問(wèn)題中的關(guān)鍵實(shí)體和屬性,并生成相應(yīng)的查詢(xún)語(yǔ)句,從而從知識(shí)圖譜或數(shù)據(jù)庫(kù)中檢索所需的信息。本文將詳細(xì)介紹每個(gè)步驟的實(shí)現(xiàn)思路和技術(shù)細(xì)節(jié),并提供核心算法具體的代碼示例和開(kāi)源地址供參考。

大模型在知識(shí)圖譜問(wèn)答上的核心算法詳細(xì)思路及實(shí)踐-AI.x社區(qū)

總體技術(shù)鏈路

一、mention識(shí)別

KBQA中的mention識(shí)別是指在用戶(hù)提出的問(wèn)題中,識(shí)別出與知識(shí)庫(kù)中的實(shí)體或概念相對(duì)應(yīng)的詞語(yǔ)或短語(yǔ)。mention識(shí)別是KBQA系統(tǒng)中至關(guān)重要的一步,因?yàn)闇?zhǔn)確的mention識(shí)別直接影響后續(xù)的實(shí)體鏈接、關(guān)系抽取和答案生成等步驟。KBQA中的mention識(shí)別的主要方法和技術(shù):

  1. 規(guī)則方法
    基于規(guī)則的方法通常使用手工設(shè)計(jì)的規(guī)則和模式來(lái)識(shí)別mention。這些規(guī)則可以包括命名實(shí)體識(shí)別(NER)工具、正則表達(dá)式、詞典匹配等。
  • NER工具:使用現(xiàn)有的NER工具(如Stanford NER、spaCy)來(lái)識(shí)別出問(wèn)題中的實(shí)體。
  • 正則表達(dá)式:設(shè)計(jì)特定的正則表達(dá)式模式來(lái)匹配特定類(lèi)型的mention。
  • 詞典匹配:使用預(yù)先構(gòu)建的實(shí)體詞典進(jìn)行匹配,通過(guò)查找詞典中的條目來(lái)識(shí)別mention。
  1. 統(tǒng)計(jì)方法
    基于統(tǒng)計(jì)的方法利用大規(guī)模的訓(xùn)練數(shù)據(jù),通過(guò)統(tǒng)計(jì)特征來(lái)識(shí)別mention。這些方法通常需要預(yù)處理步驟,如詞頻統(tǒng)計(jì)和n-gram分析。
  • n-gram分析:將問(wèn)題分割成n-gram(如單詞、雙詞、三詞短語(yǔ)等),并計(jì)算每個(gè)n-gram在知識(shí)庫(kù)中的匹配情況。
  • 詞頻統(tǒng)計(jì):統(tǒng)計(jì)每個(gè)詞或短語(yǔ)在知識(shí)庫(kù)中的出現(xiàn)頻率,并根據(jù)頻率高低來(lái)判斷其是否為mention。
  1. 機(jī)器學(xué)習(xí)方法
    基于機(jī)器學(xué)習(xí)的方法利用有標(biāo)簽的數(shù)據(jù),通過(guò)訓(xùn)練分類(lèi)器來(lái)識(shí)別mention。這些方法通常需要特征工程和模型訓(xùn)練。
  • 特征工程:提取文本的各種特征,如詞性、詞向量、上下文信息等。
  • 分類(lèi)模型:使用機(jī)器學(xué)習(xí)算法(如SVM、隨機(jī)森林、邏輯回歸等)訓(xùn)練分類(lèi)器,判斷一個(gè)詞或短語(yǔ)是否為mention。
  1. 深度學(xué)習(xí)方法
    基于深度學(xué)習(xí)的方法利用神經(jīng)網(wǎng)絡(luò)模型,通過(guò)端到端的方式來(lái)識(shí)別mention。這些方法可以避免復(fù)雜的特征工程,通過(guò)大量的數(shù)據(jù)訓(xùn)練模型來(lái)自動(dòng)提取特征。如:BERT-CRF、LLM等模型等。

本文結(jié)合大模型的方法進(jìn)行mention識(shí)別。主要流程如下:

mention識(shí)別SFT數(shù)據(jù)構(gòu)造

原始數(shù)據(jù)

q1:莫妮卡·貝魯奇的代表作?
select ?x where { <莫妮卡·貝魯奇> <代表作品> ?x. }
<西西里的美麗傳說(shuō)>

通過(guò)一些規(guī)則方式,構(gòu)建sft數(shù)據(jù)如下:

[
  {
    "instruction": "你是一個(gè)實(shí)體抽取的專(zhuān)家,請(qǐng)你抽取問(wèn)句:“莫妮卡·貝魯奇的代表作?”中的實(shí)體。",
    "input": "",
    "output": "莫妮卡·貝魯奇"
  },
  {
    "instruction": "你是一個(gè)實(shí)體抽取的專(zhuān)家,請(qǐng)你抽取問(wèn)句:“《湖上草》是誰(shuí)的詩(shī)?”中的實(shí)體。",
    "input": "",
    "output": "湖上草"
  },
  ...
]

LLM微調(diào)mention識(shí)別

本文以LLaMA-Factory框架進(jìn)行微調(diào),微調(diào)腳本如下:

import json
import os

model_name_or_path = "ZhipuAI/glm-4-9b-chat"
template = "glm4"
cutoff_len = 256
num_train_epochs = 8
train_dataset = "train_ner"
predict_dataset = "test_ner"
output_dir = f"saves/{train_dataset}-{predict_dataset}-ep{num_train_epochs}-{cutoff_len}-{template}"
adapter_name_or_path = output_dir


do_train = True
do_predict = True

train_args = dict(
    stage="sft",  # 進(jìn)行指令監(jiān)督微調(diào)
    do_train=do_train,
    model_name_or_path=model_name_or_path,
    dataset=train_dataset,
    template=template,  
    finetuning_type="lora",  
    cutoff_len=cutoff_len,
    lora_target="all",  
    output_dir=output_dir,  
    per_device_train_batch_size=4,  
    gradient_accumulation_steps=2,  
    lr_scheduler_type="cosine", 
    logging_steps=10,  
    warmup_ratio=0.1, 
    save_steps=1000, 
    learning_rate=1e-4,  
    num_train_epochs=num_train_epochs,  
    max_samples=7625,  
    max_grad_norm=1.0, 
    fp16=True,  
    temperature=0.1,
    ddp_timeout=180000000,
    overwrite_cache=True,
    overwrite_output_dir=True
)

predict_args = dict(
    stage="sft",
    do_predict=do_predict,
    model_name_or_path=model_name_or_path,
    adapter_name_or_path=adapter_name_or_path,
    dataset=predict_dataset,
    template=template,
    finetuning_type="lora",
    cutoff_len=cutoff_len,
    per_device_eval_batch_size=2,
    overwrite_cache=True,
    preprocessing_num_workers=16,
    output_dir=f'{output_dir}/predict',
    overwrite_output_dir=True,
    ddp_timeout=180000000,
    temperature=0.1,
    max_samples=1292,
    predict_with_generate=True
)

train_args_file = f"config/{train_dataset}-{predict_dataset}-ep{num_train_epochs}-{cutoff_len}-{template}-train.json"
predict_args_file = f"config/{train_dataset}-{predict_dataset}-ep{num_train_epochs}-{cutoff_len}-{template}-pred.json"

json.dump(train_args, open(train_args_file, "w", encoding="utf-8"), indent=2)
json.dump(predict_args, open(predict_args_file, "w", encoding="utf-8"), indent=2)


if __name__ == '__main__':
    os.system(f'llamafactory-cli train {train_args_file}')
    os.system(f'llamafactory-cli train {predict_args_file}')

輸出示例如:

question:<篝火圓舞曲>的作曲家屬于什么民族?

mention:篝火圓舞曲

二、實(shí)體鏈接及實(shí)體排序

中文短文本的實(shí)體鏈指,簡(jiǎn)稱(chēng) EL(Entity Linking),是NLP、知識(shí)圖譜領(lǐng)域的基礎(chǔ)任務(wù)之一,即對(duì)于給定的一個(gè)中文短文本(如搜索 Query、微博、對(duì)話內(nèi)容、文章/視頻/圖片的標(biāo)題等),EL將其中的實(shí)體與給定知識(shí)庫(kù)中對(duì)應(yīng)的實(shí)體進(jìn)行關(guān)聯(lián)。

針對(duì)中文短文本的實(shí)體鏈指存在很大的挑戰(zhàn),主要原因如下:

  1. 口語(yǔ)化嚴(yán)重,導(dǎo)致實(shí)體歧義消解困難;
  2. 短文本上下文語(yǔ)境不豐富,須對(duì)上下文語(yǔ)境進(jìn)行精準(zhǔn)理解;
  3. 相比英文,中文由于語(yǔ)言自身的特點(diǎn),在短文本的鏈指問(wèn)題上更有挑戰(zhàn)。

EL實(shí)現(xiàn)思路-基于“粗排-精排”的兩階段方案

思路1:

主要流程描述:

  1. 候選實(shí)體召回。通過(guò)ES知識(shí)庫(kù),召回相關(guān)實(shí)體,把知識(shí)庫(kù)實(shí)體的關(guān)系轉(zhuǎn)化為:“實(shí)體id-實(shí)體信息” 和 “實(shí)體指稱(chēng)-實(shí)體id” 的映射。從原文本的mention文本出發(fā),根據(jù)“實(shí)體指稱(chēng)-實(shí)體id”匹配實(shí)體文本召回候選實(shí)體。
  2. 候選實(shí)體特征提取。首先用指稱(chēng)項(xiàng)分類(lèi)模型,來(lái)預(yù)測(cè)輸入數(shù)據(jù)的指稱(chēng)項(xiàng)的實(shí)體類(lèi)型。根據(jù)候選實(shí)體召回結(jié)果,對(duì)于有召回的實(shí)體:用“實(shí)體id-實(shí)體信息”提取處實(shí)體信息,按順序組織實(shí)體信息的文本內(nèi)容后拼接原始文本豐富實(shí)體的語(yǔ)義信息,最后把指稱(chēng)項(xiàng)的實(shí)體類(lèi)型加入構(gòu)成完整的實(shí)體候選集合。對(duì)于無(wú)召回的實(shí)體,就無(wú)需進(jìn)行候選實(shí)體排序,直接與排序結(jié)果進(jìn)行后處理整合即可。
  3. 候選實(shí)體排序模型。輸入標(biāo)記指稱(chēng)項(xiàng)的原始文本和候選實(shí)體信息的拼接,輸出指稱(chēng)項(xiàng)和候選實(shí)體的匹配程度。
  4. 后處理?!昂蜻x實(shí)體排序模型”的輸出結(jié)果

大模型在知識(shí)圖譜問(wèn)答上的核心算法詳細(xì)思路及實(shí)踐-AI.x社區(qū)

主要流程圖

粗排方式簡(jiǎn)單,使用ES庫(kù)進(jìn)行粗排即可,精排構(gòu)建一個(gè)二分類(lèi)模型。

訓(xùn)練數(shù)據(jù)構(gòu)造形式(正負(fù)樣本比例1:5):

{"query": "莫妮卡·貝魯奇的代表作?", "query_rewrite": "#莫妮卡·貝魯奇#的代表作?", "entity": "<莫妮卡·貝魯奇>", "desc": "母親|畢業(yè)院校|類(lèi)型|主演|別名|相關(guān)人物|中文名|國(guó)籍|作者|外文名|體重|職業(yè)|代表作品|出生日期|導(dǎo)演|身高|朋友", "label": 1}
{"query": "莫妮卡·貝魯奇的代表作?", "query_rewrite": "#莫妮卡·貝魯奇#的代表作?", "entity": "\"莫妮卡·貝魯\" ", "desc": "中文名", "label": 0}
{"query": "莫妮卡·貝魯奇的代表作?", "query_rewrite": "#莫妮卡·貝魯奇#的代表作?", "entity": "<莫妮卡·貝魯>", "desc": "類(lèi)型|游戲大小|中文名|原版名稱(chēng)|游戲類(lèi)型", "label": 0}
{"query": "莫妮卡·貝魯奇的代表作?", "query_rewrite": "#莫妮卡·貝魯奇#的代表作?", "entity": "\"莫妮卡貝魯齊\" ", "desc": "中文名", "label": 0}
{"query": "莫妮卡·貝魯奇的代表作?", "query_rewrite": "#莫妮卡·貝魯奇#的代表作?", "entity": "<莫妮卡貝魯齊>", "desc": "類(lèi)型|操作指南|基本介紹|中文名|原版名稱(chēng)", "label": 0}
{"query": "莫妮卡·貝魯奇的代表作?", "query_rewrite": "#莫妮卡·貝魯奇#的代表作?", "entity": "\"莫妮卡·安娜·瑪麗亞·貝魯奇\" ", "desc": "中文名", "label": 0}

字段解釋?zhuān)?/p>

  • query:原始問(wèn)句
  • query_rewrite:重寫(xiě)后的問(wèn)句
  • entity:鏈接的實(shí)體
  • desc:屬性的拼接
  • label:類(lèi)別標(biāo)簽

在訓(xùn)練時(shí),我們只選擇??query_rewrite???與??desc??進(jìn)行拼接,拼接形式如下:

query_rewrite[SEP]desc
示例:#莫妮卡·貝魯奇#的代表作?[SEP]母親|畢業(yè)院校|類(lèi)型|主演|別名|相關(guān)人物|中文名|國(guó)籍|作者|外文名|體重|職業(yè)|代表作品|出生日期|導(dǎo)演|身高|朋友

精排模型結(jié)構(gòu)如下:

大模型在知識(shí)圖譜問(wèn)答上的核心算法詳細(xì)思路及實(shí)踐-AI.x社區(qū)

精排模型結(jié)構(gòu)

計(jì)算實(shí)體鏈接得分:

思路2:

粗排仍然使用ES進(jìn)行召回,精排使用一個(gè)與思路一相同結(jié)構(gòu)的模型,區(qū)別就是數(shù)據(jù)構(gòu)造方式不同。訓(xùn)練數(shù)據(jù)構(gòu)造形式(正負(fù)樣本比例1:5):

{'query': '莫妮卡·貝魯奇的代表作?', 'mention': '莫妮卡·貝魯奇', 'label': 1}
{'query': '莫妮卡·貝魯奇的代表作?','mention': '低鈣血癥', 'label': 0}
{'query': '莫妮卡·貝魯奇的代表作?', 'mention': '同居損友', 'label': 0}
{'query': '莫妮卡·貝魯奇的代表作?','mention': '"1964-09-22"', 'label': 0}
{'query': '莫妮卡·貝魯奇的代表作?', 'mention': '夏侯瑾軒', 'label': 0}
{'query': '莫妮卡·貝魯奇的代表作?', 'mention': '"日歷"', 'label': 0}

選擇??query???與??mention??進(jìn)行拼接,拼接形式如下:

query[SEP]mention
示例:莫妮卡·貝魯奇的代表作?[SEP]莫妮卡·貝魯奇

計(jì)算實(shí)體鏈接得分:

為了避免噪聲影響,最后,根據(jù)得分獲取top5的鏈接實(shí)體作為候選實(shí)體。

模型結(jié)構(gòu)代碼示例

import torch
from torch import nn
from transformers import BertModel, BertPreTrainedModel

class BertForSequenceClassification(BertPreTrainedModel):
    def __init__(self, config):
        super().__init__(config)
        self.num_labels = config.num_labels

        self.bert = BertModel(config)
        self.dropout = nn.Dropout(config.hidden_dropout_prob)
        self.classifier = nn.Linear(config.hidden_size, config.num_labels)

        self.init_weights()

    def forward(self, input_ids=None, attention_mask=None, token_type_ids=None, position_ids=None, head_mask=None, inputs_embeds=None, labels=None):
        outputs = self.bert(
            input_ids,
            attention_mask=attention_mask,
            token_type_ids=token_type_ids,
            position_ids=position_ids,
            head_mask=head_mask,
            inputs_embeds=inputs_embeds,
        )
        
        pooled_output = outputs[1]
        pooled_output = self.dropout(pooled_output)
        logits = self.classifier(pooled_output)

        loss = None
        if labels is not None:
            if self.num_labels == 1:
                #  We are doing regression
                loss_fct = nn.MSELoss()
                loss = loss_fct(logits.view(-1), labels.view(-1))
            else:
                loss_fct = nn.CrossEntropyLoss()
                loss = loss_fct(logits.view(-1, self.num_labels), labels.view(-1))

        output = (logits,) + outputs[2:]
        return ((loss,) + output) if loss is not None else output

思路3:

向量模型的短文本匹配效果也不錯(cuò),不微調(diào)直接使用向量模型配合ES進(jìn)行實(shí)體鏈接:

from sentence_transformers import SentenceTransformer
sentences_1 = "實(shí)體"
sentences_2 = ["es召回的實(shí)體1", "es召回的實(shí)體2",...,"es召回的實(shí)體n"]
model = SentenceTransformer('lier007/xiaobu-embedding-v2')
embeddings_1 = model.encode(sentences_1, normalize_embeddings=True)
embeddings_2 = model.encode(sentences_2, normalize_embeddings=True)
similarity = embeddings_1 @ embeddings_2.T
print(similarity)

當(dāng)然,更進(jìn)一步的可以根據(jù)自己場(chǎng)景進(jìn)行微調(diào)。

三、屬性選擇及屬性排序

屬性識(shí)別及屬性排序是從用戶(hù)提出的問(wèn)題中識(shí)別出與知識(shí)庫(kù)中相關(guān)的屬性,并根據(jù)某些標(biāo)準(zhǔn)對(duì)這些屬性進(jìn)行排序。這兩個(gè)步驟在KBQA系統(tǒng)中非常重要,因?yàn)樗鼈冎苯佑绊懽罱K答案的準(zhǔn)確性和相關(guān)性。

通過(guò)上一節(jié)中獲取到的top5的鏈接實(shí)體,通過(guò)ES索引或者mysql等工具建立的知識(shí)圖譜,召回出對(duì)應(yīng)實(shí)體的所有的屬性集合。但召回的所有的屬性集合存在一個(gè)問(wèn)題,存在著大量的不相關(guān)的屬性?xún)?nèi)容,因此,需要訓(xùn)練的一個(gè)屬性的排序模型選擇TOP5的屬性保留。

屬性排序訓(xùn)練數(shù)據(jù)構(gòu)造形式(正負(fù)樣本比例1:5):

{"entity": "<莫妮卡·貝魯奇>", "query": "莫妮卡·貝魯奇的代表作?", "attr": "<代表作品>", "label": 1}
{"entity": "<莫妮卡·貝魯奇>", "query": "莫妮卡·貝魯奇的代表作?", "attr": "<體重>", "label": 0}
{"entity": "<莫妮卡·貝魯奇>", "query": "莫妮卡·貝魯奇的代表作?", "attr": "<出生日期>", "label": 0}
{"entity": "<莫妮卡·貝魯奇>", "query": "莫妮卡·貝魯奇的代表作?", "attr": "<導(dǎo)演>", "label": 0}
{"entity": "<莫妮卡·貝魯奇>", "query": "莫妮卡·貝魯奇的代表作?", "attr": "<職業(yè)>", "label": 0}
{"entity": "<莫妮卡·貝魯奇>", "query": "莫妮卡·貝魯奇的代表作?", "attr": "<類(lèi)型>", "label": 0}

選擇??query???與??attr??進(jìn)行拼接,拼接形式如下:

query[SEP]attr
示例:莫妮卡·貝魯奇的代表作?[SEP]<代表作品>

計(jì)算屬性得分:

為了避免噪聲影響,最后,根據(jù)得分獲取top5的屬性作為候選屬性。

屬性排序模型也是BERT+Linear一個(gè)二分類(lèi)模型:

大模型在知識(shí)圖譜問(wèn)答上的核心算法詳細(xì)思路及實(shí)踐-AI.x社區(qū)

屬性排序模型

四、文本拼接

因?yàn)楸疚慕榻B的是結(jié)合大模型的思想進(jìn)行查詢(xún)語(yǔ)句的生成,本文的鏈路與RAG的思想非常相似,通過(guò)上述路徑檢索相關(guān)文本(相關(guān)實(shí)體片段、相關(guān)屬性片段),進(jìn)行組合,組合方式如下:

prompt+question+候選實(shí)體+屬性結(jié)合

五、LLM for Text2SQL

在KBQA系統(tǒng)中,使用大語(yǔ)言模型(LLM)生成SQL查詢(xún)是至關(guān)重要的一步。Text2SQL的任務(wù)是將自然語(yǔ)言問(wèn)題轉(zhuǎn)換為結(jié)構(gòu)化查詢(xún)語(yǔ)言(SQL),以便從數(shù)據(jù)庫(kù)或知識(shí)圖譜中檢索信息。

根據(jù)上節(jié)的介紹,對(duì)于訓(xùn)練LLM的SFT數(shù)據(jù)構(gòu)造示例如下:

[
  {
    "instruction": "你是一個(gè)Sparql生成專(zhuān)家,請(qǐng)根據(jù)給定的內(nèi)容,生成Sparql語(yǔ)句。\n問(wèn)題:“莫妮卡·貝魯奇的代表作?”,和候選實(shí)體信息:[0]名稱(chēng):<莫妮卡·貝魯奇>,屬性集:<代表作品>,<中文名>,<作者>,<外文名>,<別名>。對(duì)應(yīng)查詢(xún)圖譜的Sparql的語(yǔ)句為:",
    "input": "",
    "output": "select ?x where { <莫妮卡·貝魯奇> <代表作品> ?x. }"
  },
  {
    "instruction": "你是一個(gè)Sparql生成專(zhuān)家,請(qǐng)根據(jù)給定的內(nèi)容,生成Sparql語(yǔ)句。\n問(wèn)題:“《湖上草》是誰(shuí)的詩(shī)?”,和候選實(shí)體信息:[0]名稱(chēng):<湖上草>,屬性集:<主要作品>,<中文名>,<傳世之作>,<所著>,<其丈夫>。對(duì)應(yīng)查詢(xún)圖譜的Sparql的語(yǔ)句為:",
    "input": "",
    "output": "select ?x where { ?x <主要作品> <湖上草>. }"
  },
  ...
]

使用預(yù)訓(xùn)練的大語(yǔ)言模型(例如GLM-4-9B)進(jìn)行微調(diào),使其能夠生成正確的SQL查詢(xún)(本文使用的sparql查詢(xún),配合gstore圖數(shù)據(jù)庫(kù)使用,因gstore問(wèn)題太多,個(gè)人不推薦使用,可以轉(zhuǎn)成其他的查詢(xún)語(yǔ)句,如:neo4j等)。本文以LLaMA-Factory為例進(jìn)行微調(diào),微調(diào)腳本如下:

import json
import os

model_name_or_path = "ZhipuAI/glm-4-9b-chat"
template = "glm4"
cutoff_len = 4096
num_train_epochs = 8
train_dataset = "train_data"
predict_dataset = "test_data"
output_dir = f"saves/{train_dataset}-{predict_dataset}-ep{num_train_epochs}-{cutoff_len}-{template}"
adapter_name_or_path = output_dir


do_train = True
do_predict = True

train_args = dict(
    stage="sft",  # 進(jìn)行指令監(jiān)督微調(diào)
    do_train=do_train,
    model_name_or_path=model_name_or_path,
    dataset=train_dataset,
    template=template,
    finetuning_type="lora",
    cutoff_len=cutoff_len,
    lora_target="all",
    output_dir=output_dir,
    per_device_train_batch_size=2,  # 批處理大小
    gradient_accumulation_steps=4,  # 梯度累積步數(shù)
    lr_scheduler_type="cosine",  # 使用余弦學(xué)習(xí)率退火算法
    logging_steps=10,  # 每 10 步輸出一個(gè)記錄
    warmup_ratio=0.1,  # 使用預(yù)熱學(xué)習(xí)率
    save_steps=1000,  # 每 1000 步保存一個(gè)檢查點(diǎn)
    learning_rate=1e-4,  # 學(xué)習(xí)率大小
    num_train_epochs=num_train_epochs,  # 訓(xùn)練輪數(shù)
    max_samples=7625,  # 使用每個(gè)數(shù)據(jù)集中的 300 條樣本
    max_grad_norm=1.0,  # 將梯度范數(shù)裁剪至 1.0
    fp16=True,  # 使用 float16 混合精度訓(xùn)練
    temperature=0.1,
    ddp_timeout=180000000,
    overwrite_cache=True,
    overwrite_output_dir=True
)

predict_args = dict(
    stage="sft",
    do_predict=do_predict,
    model_name_or_path=model_name_or_path,
    adapter_name_or_path=adapter_name_or_path,
    dataset=predict_dataset,
    template=template,
    finetuning_type="lora",
    cutoff_len=cutoff_len,
    per_device_eval_batch_size=1,
    overwrite_cache=True,
    preprocessing_num_workers=16,
    output_dir=f'{output_dir}/predict',
    overwrite_output_dir=True,
    ddp_timeout=180000000,
    temperature=0.1,
    max_samples=1292,
    predict_with_generate=True
)


train_args_file = f"config/{train_dataset}-{predict_dataset}-ep{num_train_epochs}-{cutoff_len}-{template}-train.json"
predict_args_file = f"config/{train_dataset}-{predict_dataset}-ep{num_train_epochs}-{cutoff_len}-{template}-pred.json"

json.dump(train_args, open(train_args_file, "w", encoding="utf-8"), indent=2)

json.dump(predict_args, open(predict_args_file, "w", encoding="utf-8"), indent=2)


os.system(f'llamafactory-cli train {train_args_file}')
os.system(f'llamafactory-cli train {predict_args_file}')

小結(jié)

  • 優(yōu)點(diǎn):借助大模型的優(yōu)勢(shì),實(shí)現(xiàn)文本轉(zhuǎn)化為sparql查詢(xún)語(yǔ)句,實(shí)現(xiàn)單挑、多跳的從kg中查詢(xún)答案。
  • 缺點(diǎn):在實(shí)踐過(guò)程中發(fā)現(xiàn),由于大模型的幻覺(jué)因素,生成的查詢(xún)語(yǔ)句“看上去對(duì),實(shí)際上錯(cuò)誤”,導(dǎo)致查詢(xún)答案不是準(zhǔn)確的答案。

總結(jié)

本文詳細(xì)介紹了KBQA(知識(shí)圖譜問(wèn)答)系統(tǒng)融合了RAG的思路,分為多個(gè)步驟。首先進(jìn)行mention識(shí)別,使用大模型提取文本中的關(guān)鍵實(shí)體;接著進(jìn)行實(shí)體鏈接,將識(shí)別到的實(shí)體提及與知識(shí)圖譜中的具體實(shí)體匹配和鏈接;然后對(duì)所有可能的實(shí)體進(jìn)行排序,找出最相關(guān)的實(shí)體;在此基礎(chǔ)上進(jìn)行屬性選擇及排序,提取與用戶(hù)問(wèn)題相關(guān)的屬性并進(jìn)行排序,確保返回的結(jié)果最符合用戶(hù)需求;接下來(lái)將上述步驟得到的文本內(nèi)容拼接成完整的上下文;最后,將結(jié)構(gòu)化的文本內(nèi)容轉(zhuǎn)化為SQL查詢(xún),以便從知識(shí)圖譜或數(shù)據(jù)庫(kù)中檢索信息。

數(shù)據(jù)集

????https://tianchi.aliyun.com/competition/entrance/532100/information??


本文轉(zhuǎn)載自???大模型自然語(yǔ)言處理??   作者:余俊暉

?著作權(quán)歸作者所有,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任
收藏
回復(fù)
舉報(bào)
回復(fù)
相關(guān)推薦