RAG系统(一)系统介绍与向量检索
背景
在搭建RAG系统时,需要将外部的知识文档进行读取并做分段处理(不做分段也可以,但是会影响性能和使用效果),以便后续进行获取向量值并灌入向量数据库。
读取PDF文档并分段
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainer
class PdfHandler:
def __init__(self, filename):
self.filename = filename
def extract_text_from_pdf(self, page_numbers=None, min_line_length=1):
'''从 PDF 文件中(按指定页码)提取文字'''
paragraphs = []
buffer = ''
full_text = ''
# 提取全部文本
for i, page_layout in enumerate(extract_pages(self.filename)):
# 如果指定了页码范围,跳过范围外的页
if page_numbers is not None and i not in page_numbers:
continue
for element in page_layout:
if isinstance(element, LTTextContainer):
full_text += element.get_text() + '\n'
# print(full_text)
# 按空行分隔,将文本重新组织成段落
lines = full_text.split('\n')
for text in lines:
if len(text) >= min_line_length:
buffer += (' ' + text) if not text.endswith('-') else text.strip('-')
elif buffer:
paragraphs.append(buffer)
buffer = ''
if buffer:
paragraphs.append(buffer)
return paragraphs
if __name__ == '__main__':
pdf = PdfHandler("llama2.pdf")
paragraphs = pdf.extract_text_from_pdf(page_numbers=[2],min_line_length=2)
for para in paragraphs[:4]:
print(para + "\n")
生产级系统的处理方式
- 知识文档支持的类型应该更丰富,比如txt、word、pdf等
- 对于原始文档中存在的图片和表格,暂时没有特别好的处理办法,如果又需要,可考虑将图片或表格转换成文字描述。
- 分段很重要,但分段不当也会导致问答的效果不好。原因就是当发起检索时,可能检索出的结果由于原始内容的分段导致并未匹配到完整的答案,此时建议的处理方式就是首先采用代码自动分段,然后再由人工进行分段内容的确认和调整。最后再灌库。