【Financial RAG Demo 项目】知识库构建

张开发
2026/4/12 6:29:35 15 分钟阅读

分享文章

【Financial RAG Demo 项目】知识库构建
知识库服务(KnowledgeBaseService) 初始化__init__(self)1. 初始化向量数据库self.chromaChroma(collection_namerag,embedding_functionDashScopeEmbeddings(modeltext-embedding-v4),persist_directory./chromadb)使用langchain_chroma的Chroma。定义三个参数collection_name数据库的名称。embedding_function向量转换使用的模型。persist_directory数据库的位置持久化地址。模型使用langchain_community.embeddings的DashScopeEmbeddings阿里云通义千问的类。2. 初始化文本分割器self.spliterRecursiveCharacterTextSplitter(chunk_size300,chunk_overlap30,separators[\n\n,\n,.,!,?,。,,, ,],length_functionlen)使用langchain_text_splitters的RecursiveCharacterTextSplitter。定义四个参数chunk_size文本块最大长度计算方法用length_function指定。chunk_overlap相邻文本块重叠的字符数。separators分割时检测的分隔符一个列表按顺序决定优先级。先尝试用\n\n(段落) 分割若超过最大长度再尝试\n。length_function指定长度计算方法。len表示用 Python 的字符计算任何一个文本单位都算一个字符。️ 主函数upload_by_str(self, data: str, filename)1. MD5 去重流程计算文件的 MD5 - 检测是否已有相同 MD5 - 保存未处理过的 MD5哈希对象 (HASH)意义接收字节序列内部处理后返回 32 位的字符串。一般流程使用字符串的encode()方法把文件转换为字节序列调用hashlib模块的哈希算法函数如md5()、sha1()、sha256()、blake2b生成对应的哈希对象使用update()方法传入字节序列使用digest()或hexdigest()(分别是二进制和十六进制) 完成计算并取出字符串。对比阶段实际生产可用 SQLite 来存储。2. 分割器knowledge_chunks:list[str]self.spliter.split_text(data)使用spliter的split_text()方法接收字符串返回一个列表里面是切好的字符串。3. 数据入库元数据metadata{source:filename,create_time:datetime.now().strftime(%Y-%m-%d %H:%M:%S),operator:Semones}source文件名。operator上传者。create_time入库时间。调用datetime模块的datetime类的now()方法获取当前时间。strftime()方法把datatime对象规格化为字符串。使用方法符号含义示例%Y四位数的年份2026%y两位数的年份26%m月份 (01-12)04%d日期 (01-31)01%H小时 (00-23)21%I小时 (01-12)09%M分钟 (00-59)47%S秒 (00-59)52%B完整月份名April%b缩写月份名Apr%A完整星期名Wednesday%a缩写星期名Wed%pAM/PMPM入库self.chroma.add_texts(knowledge_chunks,metadatas[metadatafor_inknowledge_chunks])用Chrome类的add_texts()方法传入文本列表和元数据列表两个参数。同一文件内文本段的元数据相同用列表推导式生成一个与knowledge_chunks元素个数相同的元数据列表即可。

更多文章