自制RAG工具:docx文档读取工具
1. 介绍
在RAG相关的工作中,经常会用到读取docx文档的功能,为了更好地管理文档中的各个分块,以提供更高质量的prompt给LLM,我在去年实现了一个轻量好用的docx管理工具。
主要应用到python模块docx。安装依赖:
python-docx 1.0.1
2. 源码
代码结构非常简单,仅有两个类构成。以及需要引用的部分:
import docx
from uuid import uuid4
from typing import *
ZH2NUM = {
'一': 1, '二': 2, '三': 3, '四': 4, '五': 5, '六': 6, '七': 7, '八': 8, '九': 9, '十': 10}
2.1 chunk
chunk类指的是文档中一个分块,考虑到LLM的长度限制问题和成本问题,通常需要对文档进行分块处理,尤其是对于篇幅很长的文档,需要在文档内部再做一次召回。
class Chunk:
"""
文本块
---------------
ver: 2023-11-02
by: changhongyu
"""
def __init__(self, id_: str, level: int, content: str, children: List = None, max_depth: int = 99):
"""
:param id_: 此文本块的唯一id
:param level: 此文本块的层级
:param content: 此文本块的内容
:param children: 此文本块的所有下一级文本块
:param max_depth: 允许存在的文本块最大层级数,由DocReader控制
"""
self.id = id_
self.level = level
self.content = content
self.children = children
self.max_depth = max_depth
if not self.children:
self.children = []
self.path_to_this_chunk = None
self.title_path = None
def __len__(self):
return len(self.content)
def __str__(self):
msg = ''
msg += f'[{
self.level}]'
if self.level >= 99:
msg += ' ' * self.max_depth
else:
msg += ' ' * (self.level - 1)
if len(self.content) < 20:
msg += self.content
else:
msg += self.content[:20