前言hi这里是惬鹤频道又过去几天了感觉应该来更新一下我的最新进度了。最近正式学完了RAG相关的基础知识进入了项目实战。本来想着应该有很多可以和大家聊聊的东西但是。。。真的好难我不是一个能在脑袋里快速记下大概结构的人对于RAG项目这种需要在前期进行结构思考想清楚代码内所需的基本方法并想好怎么把它们都拼接起来的工作实在有点艰难。到现在已经两天了才写好了两个代码文件所有py文件加起来大概有六七个接下来还需要熬一熬才能完成。所以这一期和大家介绍一下我写的两个代码文件吧没有啥需要分享的问题大家感兴趣的也可以学学。好了不说太多了最近的文章就短一点吧有点累了。app_file_uploader.py 文件介绍 文件名app_file_uploader.py 结构利用streamlit对接knowledge_base.py文件创建一个可以上传读取解析文本文件的网页。 # 导入依赖importstreamlitasstimporttimefromknowledge_baseimportKnowledgeBase# 创建页面st.title(请上传文本)# 设置上传文件入口the_filest.file_uploader(label请上传文件,type[txt],accept_multiple_filesFalse,)# 创建数据存储服务ifservicenotinst.session_state:st.session_state[service]KnowledgeBase()ifthe_fileisnotNone:# 解析文件的名称类型和大小大小默认为B转成KB比较好file_namethe_file.name file_typethe_file.typefile_size_kbthe_file.size/1024textthe_file.getvalue().decode(utf-8)st.subheader(以下是文件的简要数据)st.write(f文件名{file_name}文件类型{file_type}文件大小{file_size_kb:.2f}KB)withst.spinner(请稍等正在处理中。。。):time.sleep(1)st.write(st.session_state[service].upload_by_str(text,file_name))嗯这是一个基于streamlit的代码可以在命令提示符中执行自动生成一个网页。knowledge_base.py 文件介绍 文件名knowledge_base.py 结构在类KnowledgeBase中可以进行文本文档的chroma上传并基于MD5格式进行文本文档的md5转换记录去重。 类内方法upload_by_str 传入字符串和文件名调用类外方法将文本记录至md5文档和数据库 类外方法check_md5save_md5get_string_md5 check_md5检查传入的字符串是否在MD5文档中已经存在如果有则拒绝再次入库。 save_md5保存字符串到MD5文档中 get_string_md5将普通的文本转化为16进制且固定长度。 # 导入依赖importosimporthashlibimportconfig_md5fromlangchain_chromaimportChromafromlangchain_community.embeddingsimportDashScopeEmbeddingsfromlangchain_text_splittersimportRecursiveCharacterTextSplitterfromdatetimeimportdatetime# 定义三个md5相关处理方法# 检测是否有这个文件 解释md5.txt用来存放所有曾经处理过的文本为避免出现相同的文本这里需要进行去重。 defcheck_md5(input_str:str):ifnotos.path.exists(config_md5.md5_path):# 如果这个文件不存在那么就打开后再关闭相当于创建它。open(config_md5.md5_path,w,encodingutf-8).close()returnFalseelse:# 如果这个文件存在那么接下来判断是否处理过它。需要先去除前后换行符和空格textsopen(config_md5.md5_path,r,encodingutf-8).readlines()fortextintexts:texttext.strip()iftextinput_str:returnTruereturnFalse# save_md5负责往md5.txt里面输入处理过的文本经过16进制转化的defsave_md5(input_md5:str):withopen(config_md5.md5_path,a,encodingutf-8)asf:f.write(input_md5\n)# get_string_md5负责将普通的文本转化为16进制格式好处就是不论文本多长多大转化后的长度相同。defget_string_md5(input_str:str):# 先转化为bytes类型byte_strinput_str.encode(encodingutf-8)# 创建一个md5哈希对象hash_strhashlib.md5()# 将要转换的bytes类型文件传入其中hash_str.update(byte_str)# 转换完成返回16进制数据returnhash_str.hexdigest()# 创建知识库基础服务类classKnowledgeBase(object):def__init__(self):# 先确保数据库存储的文件夹存在os.makedirs(config_md5.persist_directory,exist_okTrue)# 创建数据库self.chromaChroma(collection_nameconfig_md5.collection_name,embedding_functionDashScopeEmbeddings(modeltext-embedding-v4),persist_directoryconfig_md5.persist_directory,)# 定义文本分割器self.text_splitterRecursiveCharacterTextSplitter(chunk_sizeconfig_md5.chunk_size,chunk_overlapconfig_md5.chunk_overlap,separatorsconfig_md5.separator,length_functionlen,)defupload_by_str(self,data:str,filename:str):md5_hexget_string_md5(data)ifcheck_md5(md5_hex):return[错误]已被记录不允许重复的记录# 判断当前的文本长度是否需要切割iflen(data)config_md5.max_split_char_number:knowledge_chunk:list[str]self.text_splitter.split_text(data)else:knowledge_chunk[data]# 源数据定义metadata{source:filename,create_time:datetime.now().strftime(%Y-%m-%d %H:%M:%S),operator:zzy,}# 将处理过的文本放到数据库中附上源数据self.chroma.add_texts(knowledge_chunk,metadatas[metadatafor_inknowledge_chunk],)# 记录到md5文件中save_md5(md5_hex)return[成功]已创建记录# 测试if__name____main__:serviceKnowledgeBase()rservice.upload_by_str(zzy是天才,test_file)print(r)这是用于将数据上传至chroma数据库同时检测记录是否是已经载入的数据的代码文件。这两个文件合起来后可以在生成的网页段中上传解析记录文本。结尾大概就是这些具体的说明可以看看代码的开头和代码行的注释这两个代码文件其实原理还不算难但是抓细节的话需要记的东西还很多。总之明天继续努力我先去睡了byebye
Day6:RAG项目实战(1)
发布时间:2026/6/2 19:20:23
前言hi这里是惬鹤频道又过去几天了感觉应该来更新一下我的最新进度了。最近正式学完了RAG相关的基础知识进入了项目实战。本来想着应该有很多可以和大家聊聊的东西但是。。。真的好难我不是一个能在脑袋里快速记下大概结构的人对于RAG项目这种需要在前期进行结构思考想清楚代码内所需的基本方法并想好怎么把它们都拼接起来的工作实在有点艰难。到现在已经两天了才写好了两个代码文件所有py文件加起来大概有六七个接下来还需要熬一熬才能完成。所以这一期和大家介绍一下我写的两个代码文件吧没有啥需要分享的问题大家感兴趣的也可以学学。好了不说太多了最近的文章就短一点吧有点累了。app_file_uploader.py 文件介绍 文件名app_file_uploader.py 结构利用streamlit对接knowledge_base.py文件创建一个可以上传读取解析文本文件的网页。 # 导入依赖importstreamlitasstimporttimefromknowledge_baseimportKnowledgeBase# 创建页面st.title(请上传文本)# 设置上传文件入口the_filest.file_uploader(label请上传文件,type[txt],accept_multiple_filesFalse,)# 创建数据存储服务ifservicenotinst.session_state:st.session_state[service]KnowledgeBase()ifthe_fileisnotNone:# 解析文件的名称类型和大小大小默认为B转成KB比较好file_namethe_file.name file_typethe_file.typefile_size_kbthe_file.size/1024textthe_file.getvalue().decode(utf-8)st.subheader(以下是文件的简要数据)st.write(f文件名{file_name}文件类型{file_type}文件大小{file_size_kb:.2f}KB)withst.spinner(请稍等正在处理中。。。):time.sleep(1)st.write(st.session_state[service].upload_by_str(text,file_name))嗯这是一个基于streamlit的代码可以在命令提示符中执行自动生成一个网页。knowledge_base.py 文件介绍 文件名knowledge_base.py 结构在类KnowledgeBase中可以进行文本文档的chroma上传并基于MD5格式进行文本文档的md5转换记录去重。 类内方法upload_by_str 传入字符串和文件名调用类外方法将文本记录至md5文档和数据库 类外方法check_md5save_md5get_string_md5 check_md5检查传入的字符串是否在MD5文档中已经存在如果有则拒绝再次入库。 save_md5保存字符串到MD5文档中 get_string_md5将普通的文本转化为16进制且固定长度。 # 导入依赖importosimporthashlibimportconfig_md5fromlangchain_chromaimportChromafromlangchain_community.embeddingsimportDashScopeEmbeddingsfromlangchain_text_splittersimportRecursiveCharacterTextSplitterfromdatetimeimportdatetime# 定义三个md5相关处理方法# 检测是否有这个文件 解释md5.txt用来存放所有曾经处理过的文本为避免出现相同的文本这里需要进行去重。 defcheck_md5(input_str:str):ifnotos.path.exists(config_md5.md5_path):# 如果这个文件不存在那么就打开后再关闭相当于创建它。open(config_md5.md5_path,w,encodingutf-8).close()returnFalseelse:# 如果这个文件存在那么接下来判断是否处理过它。需要先去除前后换行符和空格textsopen(config_md5.md5_path,r,encodingutf-8).readlines()fortextintexts:texttext.strip()iftextinput_str:returnTruereturnFalse# save_md5负责往md5.txt里面输入处理过的文本经过16进制转化的defsave_md5(input_md5:str):withopen(config_md5.md5_path,a,encodingutf-8)asf:f.write(input_md5\n)# get_string_md5负责将普通的文本转化为16进制格式好处就是不论文本多长多大转化后的长度相同。defget_string_md5(input_str:str):# 先转化为bytes类型byte_strinput_str.encode(encodingutf-8)# 创建一个md5哈希对象hash_strhashlib.md5()# 将要转换的bytes类型文件传入其中hash_str.update(byte_str)# 转换完成返回16进制数据returnhash_str.hexdigest()# 创建知识库基础服务类classKnowledgeBase(object):def__init__(self):# 先确保数据库存储的文件夹存在os.makedirs(config_md5.persist_directory,exist_okTrue)# 创建数据库self.chromaChroma(collection_nameconfig_md5.collection_name,embedding_functionDashScopeEmbeddings(modeltext-embedding-v4),persist_directoryconfig_md5.persist_directory,)# 定义文本分割器self.text_splitterRecursiveCharacterTextSplitter(chunk_sizeconfig_md5.chunk_size,chunk_overlapconfig_md5.chunk_overlap,separatorsconfig_md5.separator,length_functionlen,)defupload_by_str(self,data:str,filename:str):md5_hexget_string_md5(data)ifcheck_md5(md5_hex):return[错误]已被记录不允许重复的记录# 判断当前的文本长度是否需要切割iflen(data)config_md5.max_split_char_number:knowledge_chunk:list[str]self.text_splitter.split_text(data)else:knowledge_chunk[data]# 源数据定义metadata{source:filename,create_time:datetime.now().strftime(%Y-%m-%d %H:%M:%S),operator:zzy,}# 将处理过的文本放到数据库中附上源数据self.chroma.add_texts(knowledge_chunk,metadatas[metadatafor_inknowledge_chunk],)# 记录到md5文件中save_md5(md5_hex)return[成功]已创建记录# 测试if__name____main__:serviceKnowledgeBase()rservice.upload_by_str(zzy是天才,test_file)print(r)这是用于将数据上传至chroma数据库同时检测记录是否是已经载入的数据的代码文件。这两个文件合起来后可以在生成的网页段中上传解析记录文本。结尾大概就是这些具体的说明可以看看代码的开头和代码行的注释这两个代码文件其实原理还不算难但是抓细节的话需要记的东西还很多。总之明天继续努力我先去睡了byebye