難點:由於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
附:可以根據業務的具體情況對段落、句子進行分隔並加入向量庫