一、文档的加载和分割1、文档LLM回复系统搭建2、把文本切分成chunks把文本切分成chunks的方式有很多种1.按照句子来切分2.按照字符数来切分3.按固定字符数结合overlapping window4. 递归方法 RecursiveCharacterTextSplitter案例1: 按照句子来切分import re txts(大语言模型是基于深度学习架构、通过海量文本数据训练而成的人工智能系统。它能够理解自然语言、生成连贯文本并在对话、翻译、摘要、创作等多种任务中表现出接近人类的表达能力。模型的性能通常与其参数量、训练数据规模和优化算法密切相关。随着技术不断迭代大模型已从单一文本生成逐步走向多模态理解、逻辑推理与工具调用成为新一代人工智能应用的重要基础。) #正则表达式匹配中文句子结束的标点符合 sentences re.split(r(。| ||\...\...]), txts) #重新组合句子和结尾的标点符合 chunks[sentence (puncutation if puncutation else ) for sentence, puncutation in zip(sentences[::2], sentences[1::2])] for i ,chunk in enumerate(chunks): print(fchunk {i1}:{len(chunk)}:{chunk})案例2按照字符数来切分import re txts(大语言模型是基于深度学习架构、通过海量文本数据训练而成的人工智能系统。它能够理解自然语言、生成连贯文本并在对话、翻译、摘要、创作等多种任务中表现出接近人类的表达能力。模型的性能通常与其参数量、训练数据规模和优化算法密切相关。随着技术不断迭代大模型已从单一文本生成逐步走向多模态理解、逻辑推理与工具调用成为新一代人工智能应用的重要基础。) def split_fixed_count(text,count): return [text[i:icount] for i in range(0,len(text),count)] #如果按照每50个字符来切分文本 chunkssplit_fixed_count(txts,50) for i ,chunk in enumerate(chunks): print(fchunk {i1}:{len(chunk)}:{chunk})案例3按固定字符数结合overlapping windowimport re txts(大语言模型是基于深度学习架构、通过海量文本数据训练而成的人工智能系统。它能够理解自然语言、生成连贯文本并在对话、翻译、摘要、创作等多种任务中表现出接近人类的表达能力。模型的性能通常与其参数量、训练数据规模和优化算法密切相关。随着技术不断迭代大模型已从单一文本生成逐步走向多模态理解、逻辑推理与工具调用成为新一代人工智能应用的重要基础。) #将文本切分成多个部分 def sliding_chunks(text,chunk_size,step): return [text[i:ichunk_size] for i in range(0,len(text),step)] #如果按照每100个字符来切分文本,步长为50 chunkssliding_chunks(txts,100,50) for i ,chunk in enumerate(chunks): print(fchunk {i1}:{len(chunk)}:{chunk})案例4 递归方法 RecursiveCharacterTextSplitterimport re from langchain_text_splitters import RecursiveCharacterTextSplitter txts ( 大语言模型是基于深度学习架构、通过海量文本数据训练而成的人工智能系统。它能够理解自然语言、生成连贯文本并在对话、翻译、摘要、创作等多种任务中表现出接近人类的表达能力。模型的性能通常与其参数量、训练数据规模和优化算法密切相关。随着技术不断迭代大模型已从单一文本生成逐步走向多模态理解、逻辑推理与工具调用成为新一代人工智能应用的重要基础。) # 初始化分割器 # chunk_size: 每个块的最大长度 # chunk_overlap: 每个块之间的重叠长度 # length_function: 计算文本长度的函数默认是len # RecursiveCharacterTextSplitter会递归地尝试不同的分隔符如段落、句子、单词等来分割文本确保分割后的文本块尽可能完整且有语义意义 text_splitter RecursiveCharacterTextSplitter(chunk_size50, chunk_overlap10, length_functionlen) #一个文本块列表每个文本块的长度不超过50个字符且相邻文本块有10个字符的重叠部分。 chunks text_splitter.split_text(txts) for i, chunk in enumerate(chunks): print(fchunk {i 1}:{len(chunk)}:{chunk})注意安装 pip install langchain安装 pip install langchain-text-splitters新版1.2.15from langchain_text_splitters import ...LangChain 官方做了模块化拆分文本分割器独立成包了。二、向量检索1、检索的方式关键字搜索通过用户输入的关键字来查找文本数据。语义搜索不仅考虑关键词的匹配还考虑词汇之间的语义关系以提供更准确的搜索结果。2、关键字搜索我们需要把相关的信息存储在Redis中。我们需要先安装一个Redis。先下载再直接解压缩。然后cmd进入到对应的目录。然后输入redis-server.exe再安装一个RDM工具来查看导入的数据连接到Redis服务器默认有16个数据库将json中的数据存入到Redis数据库中python安装 pip install redisimport redis # pip install redis from openai import OpenAI from dotenv import load_dotenv import json # 默认加载项目根目录下的 .env 文件 load_dotenv() # 1. 获取client对象OpenAI类对象 clientOpenAI() #2. 获取redis对象 #localhost:指定Redis服务器地址为本地主机 #6379:指定Redis服务器端口为6379 #db0:指定Redis数据库索引为0;(Redis默认有16个数据库0-15) #decode_responsesTrue:指定Redis返回的数据类型为字符串 r redis.Redis(hostlocalhost, port6379, db0,decode_responsesTrue) #3.读取数据 with open(train_zh.json, r, encodingutf-8) as f: data json.load(f) #4.取出问题 instrutions [item[instruction] for item in data[0:800]] #5.输出数据 outputs[item[output] for item in data[0:800]] #6.将数据存入redis for instrution,output in zip(instrutions,outputs): #存入Redis,值序列化为JSON r.set(instrution,output) #key为问题value为答案 #7.查询数据:根据关键字搜索instruction中包含该关键字的条目 def search_instrutions(keyword,top3): # 通过模糊匹配 keysr.keys(pattern*keyword*) data[] #遍历通过模糊匹配找到的所有键 for key in keys: data.append(r.get(key)) return data[:top]