)从TXT文件构建RAG知识库
一、读取TXT文件中的文本TXT文件是最简单的文本格式读写TXT无需任何第三方库。Python代码先调用open函数打开TXT再调用read函数读取全部文本内容也可循环调用readline函数依次读取每行文本。比如下面代码依次读取TXT文件的每行文本并把各行文本依次添加到知识库数组knowledge中。# 从文本文件读取知识库替代原数组 def load_knowledge_from_txt(file_path): knowledge [] with open(file_path, r, encodingutf-8) as f: for line in f: line line.strip() if line: # 非空行才加入 knowledge.append(line) return knowledge # 加载知识自动读 knowledge.txt knowledge load_knowledge_from_txt(knowledge.txt)二、兼容GBK字符集的TXT文件首先确保Python代码的同目录下存在knowledge.txt并且文件内容非空再运行上面的Python测试代码。可是Windows系统多半会报错“UnicodeDecodeError: utf-8 codec cant decode byte 0xca in position 4: invalid continuation byte”这是因为Windows系统默认把TXT文件保存为ASCII编码而非UTF-8编码。而Python代码企图以UTF-8编码打开TXT就会报编码格式不符的错误了。为了解决字符集编码冲突的问题需要改造前面的Python代码使得既支持UTF-8编码又支持GBK形式的ASCII编码。改造后的Python文件读取代码如下# 从文本文件读取知识库替代原数组 def load_knowledge_from_txt(file_path): knowledge [] encoding_type utf-8 try: with open(file_path, r, encodingencoding_type) as f: f.readline() except: encoding_type gbk with open(file_path, r, encodingencoding_type) as f: for line in f: line line.strip() if line: # 非空行才加入 knowledge.append(line) return knowledge # 加载知识自动读 knowledge.txt knowledge load_knowledge_from_txt(knowledge.txt)可见上面代码先以UTF-8方式打开TXT如果遇到异常再以GBK方式打开TXT从而实现了同时兼容UTF-8与GBK的目标。三、对文本内容自动分块不过TXT文件中的文本很可能不是一句话一行字而是一段一段的文字每段都包含好几个句子那么上面代码依次调用readline函数并添加到数组每个数组元素都包含一大段文字十分臃肿。为此需要根据句号来拆分文本内容而非根据段落来拆分文本内容。基本要求如下1、读取TXT文件的所有文本内容。2、按照句号分割文本。3、每条知识设定字数下限比如不得少于50个汉字如果某条知识小于这个长度就要跟下一条知识合并。4、处理过程注意去除无效字符例如剔除空行、删除空格等等。根据上述逻辑可编写自动分块的Python测试代码如下# 加载一整段 TXT 文本 def load_text(file_path): try: with open(file_path, r, encodingutf-8) as f: return f.read().strip() except: with open(file_path, r, encodinggbk) as f: return f.read().strip() # 读取一整段文本 raw_text load_text(knowledge.txt) # 自动把一段文字切成多段关键 def split_text(text, max_len50): sentences text.split(。) # 按句号分割 chunks [] current for sen in sentences: sen sen.strip() if not sen: continue # 加回去句号让语义完整 sen 。 if len(current) max_len: current sen else: if current: chunks.append(current.strip()) current sen if current: chunks.append(current.strip()) return chunks # 自动分块 knowledge split_text(raw_text)