基于本地知識(shí)庫(kù)和LLM的知識(shí)庫(kù)問(wèn)答難點(diǎn)及解決方案
難點(diǎn):由于langchain采用的是硬切分文檔的方式,導(dǎo)致文檔分割不夠準(zhǔn)確,例如:在文檔中若有分點(diǎn)描述的情況,對(duì)文檔硬性分割后,會(huì)把各個(gè)重點(diǎn)分隔開(kāi),導(dǎo)致后續(xù)向量召回時(shí),片段是殘缺的。如:

如果硬性分割文檔,則在召回階段拿不到所有的通知信息。
解決方案:考慮使用語(yǔ)義分析的方式來(lái)分割文檔,BERT模型訓(xùn)練時(shí)有個(gè)NSP的任務(wù),即預(yù)測(cè)句子是否為上一句的下一句,所以bert是具有預(yù)測(cè)兩句子之前是否有語(yǔ)義銜接的能力的。在對(duì)文檔分割時(shí),我們既可以對(duì)段落進(jìn)行分割也可以對(duì)句子進(jìn)行分隔,設(shè)置一個(gè)閾值,將文檔從前往后根據(jù)兩句子(兩段落)的銜接度跟閾值比較即可。代碼實(shí)現(xiàn)如下:
1 def is_nextsent(sent, next_sent): 2 encoding = tokenizer(sent, next_sent, return_tensors="pt",truncation=True, padding=False) 3 with torch.no_grad(): 4 outputs = model(**encoding, labels=torch.LongTensor([1])) 5 6 logits = outputs.logits 7 probs = torch.softmax(logits, dim=1) 8 next_sentence_prob = probs[:, 0].item() 9 if next_sentence_prob <= FLAG_RATIO: 10 return False 11 else: 12 return True
附:可以根據(jù)業(yè)務(wù)的具體情況對(duì)段落、句子進(jìn)行分隔并加入向量庫(kù)

浙公網(wǎng)安備 33010602011771號(hào)