基於本地知識庫和LLM的知識庫問答難點及解決方案

  難點:由於langchain採用的是硬切分文檔的方式,導致文檔分割不夠準確,例如:在文檔中若有分點描述的情況,對文檔硬性分割後,會把各個重點分隔開,導致後續向量召回時,片段是殘缺的。如:

 

如果硬性分割文檔,則在召回階段拿到所有的通知信息。

 

  解決方案:考慮使用語義分析的方式來分割文檔,BERT模型訓練時有個NSP的任務,即預測句子是否爲上一句的下一句,所以bert是具有預測兩句子之前是否有語義銜接的能力的。在對文檔分割時,我們既可以對段落進行分割也可以對句子進行分隔,設置一個閾值,將文檔從前往後根據兩句子(兩段落)的銜接度跟閾值比較即可。代碼實現如下:

  

 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

 

附:可以根據業務的具體情況對段落、句子進行分隔並加入向量庫

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章