版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGE6博学谷——让IT教学更简单,让IT学习更有效PAGE12《智能体构建与应用开发》教学设计课程名称:授课年级:授课学期:教师姓名:年月课题名称项目6配实现RAG检索增强生成任务6-1处理和检索文档计划课时5课时教学引入王亮完成智能体任务开发后,技术主管提出了新的需求:为使AI助手能有效处理公司内部的专业知识查询,需构建一套文档智能处理系统,将各类内部文档(如产品手册、技术文档等)转化为结构化的可检索知识库,具体完成文档结构化切分、文本向量化表示、基于关键词和语义的检索等任务。教学目标【知识目标】(1)理解文档切分的不同策略及其适用场景。(2)了解向量化处理文档的作用。(3)掌握关键字检索和语义检索的区别。【技能目标】(1)能够将文档分割为合适的文本块。(2)能够使用嵌入模型将文本转换为向量表示。(3)能够实现基于关键词的精确匹配检索功能。(4)能够实现基于向量相似度的语义检索功能。【素养目标】(1)通过合理设计文档切分策略,培养学生"平衡粒度、保留语义"的信息处理思维。(2)通过对比不同检索方法的效果,培养学生的数据驱动决策意识和优化能力。教学重点配置磁盘分区和格式化。教学难点配置用户和组磁盘配额。教学方式课堂教学以PPT讲授为主,并结合多媒体进行教学教学过程任务6-1处理和检索文档※通过直接引入的方式导入新课王亮完成智能体任务开发后,技术主管提出了新的需求:为使AI助手能有效处理公司内部的专业知识查询,需构建一套文档智能处理系统,将各类内部文档(如产品手册、技术文档等)转化为结构化的可检索知识库,具体完成文档结构化切分、文本向量化表示、基于关键词和语义的检索等任务。※新课讲解一、教师通过PPT的方式讲解1.文档切分的不同策略及其适用场景(1)固定长度切分(2)按句子切分(3)按结构切分(4)重叠切分(5)按语义/主题切分2.向量化处理文档的作用向量化处理文档的作用是将非结构化文本转化为机器可理解的数学向量,为语义计算提供基础。它使计算机能够通过向量间的几何关系判断文本语义相似度,从而支持智能检索、分类等高级任务。这一技术大幅提升了文本处理的效率与精度,并为多模态与跨语言应用奠定了基础。(1)实现文本的数学化表示(2)支持高效的语义相似度计算(3)赋能高级人工智能任务(4)提升处理效率与可扩展性3.关键字检索和语义检索的区别(1)关键字检索(2)语义检索二、切分文档1.新建项目打开PyCharm,按照创建项目5的方法创建项目6,打开项目6的本地终端窗口,导入LangChain的核心依赖,如下所示。(.venv)PSD:\langchain\project6>pipinstalllangchainlangchain-openailangchain-community2.按固定长度切分文档(1)固定长度切分文档(2)示例代码在project6项目中,创建名称为fixed_length_splitter.py的文件,输入以下代码。text="我爱学习人工智能,人工智能很有趣。机器学习是人工智能的一部分。深度学习用于图像识别。"chunk_size=20#每个文本块的大小chunks=[]#存储切分结果#切分循环:按固定长度滑动窗口foriinrange(0,len(text),chunk_size):#生成起始位置:0,20,40...chunk=text[i:i+chunk_size]#切片:提取20个字符chunks.append(chunk)#保存到列表print("结果:")#打印结果foriinrange(len(chunks)):#遍历所有文本块block_number=i+1#从1开始编号current_chunk=chunks[i]#获取当前文本块print(f"块{block_number}:{current_chunk}")#格式化输出以上代码首先定义了要处理的文本内容,并设置每个文本块的固定大小为20个字符。程序通过一个循环,使用滑动窗口的方式遍历整个文本:从位置0开始,每次向后移动20个字符作为新的起始点,并提取从该点开始连续20个字符的子字符串作为一个文本块,将这些文本块依次存入列表中。完成切分后,程序再通过另一个循环遍历存储的文本块列表,格式化打印出每个块的序号和其对应的文本内容。以上固定切分文档是纯机械的字符切割,不考虑句子或词语的完整性,因此会在语义中间切断文本,运行fixed_length_splitter.py文件,结果如图6-2所示。图6-2项目6固定长度切分文档从结果中发现,按照20个字符串切割了文档,但由于是根据固定长度切分,句子的结构被破坏了。3.按句子切分文档(1)句子切分文档(2)示例代码在project6项目中,创建名称为sentence_splitter.py的文件,输入以下代码。text="我爱学习人工智能,人工智能很有趣。机器学习是人工智能的一部分。深度学习用于图像识别。计算机视觉是AI的重要应用领域。"#按完整句子切分defsentence_split(text):chunks=[]#存储切分后的句子列表current=""#当前正在构建的句子forcharintext:#遍历文本中的每个字符current+=char#将字符添加到当前句子#遇到句号就结束当前块ifchar=='。':#检测句子结束标志chunks.append(current)#将完整句子保存到列表current=""#重置,开始下一句#处理最后一句(如果最后没有句号)ifcurrent:#检查是否还有未保存的内容chunks.append(current)#添加最后一个句子returnchunks#返回句子列表print("按完整句子切分")chunks=sentence_split(text)#调用函数进行切分#打印结果fori,chunkinenumerate(chunks,1):#enumerate从1开始计数print(f"句子{i}:{chunk}")#格式化输出每个句子以上代码使用sentence_split的函数实现了按完整句子切分文本的功能,其核心逻辑是逐个字符遍历输入文本,利用中文句号作为句子边界标识进行智能分割。函数内部通过维护一个current字符串变量来动态累积字符,当检测到句号字符时,将当前累积的完整句子存入chunks列表并重置累积器,最终确保每个切分出的文本块都是语义完整的句子单元。运行sentence_splitter.py,结果如图6-3所示。图6-3项目6固定长度切分文档从结果中发现,成功的将给定的文档切分成4个句子。4.按结构切分文档(1)结构切分文档(2)示例代码在project6项目中,创建名称为structure_splitter.py的文件,输入以下代码。importos#创建测试文件file_content="""第一章:人工智能人工智能是未来的趋势。它正在改变各行各业。第二章:机器学习机器学习让计算机自主学习。这是人工智能的核心技术。"""#保存到文件withopen("tech_doc.txt","w",encoding="utf-8")asf:f.write(file_content)#将内容写入文件print("-"*40)#读取文件并按段落切分withopen("tech_doc.txt","r",encoding="utf-8")asf:content=f.read()#读取整个文件内容print("读取文件并按2个空行切分段落")print("="*40)#按2个空行分割段落paragraphs=content.split('\n\n')#核心:按两个换行符切分段落#遍历并显示每个段落fori,parainenumerate(paragraphs,1):#enumerate从1开始计数print(f"段落{i}:")print(para)#打印段落内容print("-"*30)以上代码通过识别连续空行(\n\n)将一篇文档切分成多个独立的段落单元,首先创建了一个包含两个章节的测试文档,其中章节间用2个空行分隔,然后通过读取文件内容,使用split('\n\n')方法精准地在每个空行处分割文本,将文档切分为结构清晰的段落,最后遍历并格式化输出每个段落的内容及其序号,实现了文档创建、内容读取、智能切分和结果展示。运行structure_splitter.py文件,结果如图6-4所示。图6-4项目6按结构切分文档从结果中发现,已经通过2个空行方式将测试文档切分为2个段落。5.重叠切分文档(1)重叠切分(2)示例代码在project6项目中,创建名称为overlap_splitter.py的文件,输入以下代码。#重叠切分document="人工智能技术快速发展。机器学习算法不断优化。深度学习模型效果显著。自然语言处理应用广泛。"print("文档:",document)#简化的重叠切分函数defsplit_with_overlap(text,chunk_size=2,overlap=1):#参数包括文本、块大小、重叠度#1.分割成句子sentences=[]#初始化空列表,用于存储分割出的句子current=""#初始化空字符串,用于临时构建当前句子forcharintext:#遍历输入文本的每个字符current+=char#将当前字符追加到正在构建的句子中ifcharin'。.!?!?':#检测句子结束标点符号sentences.append(current)#将完整句子添加到列表current=""#清空当前句子缓存,准备下一个#2.按句子数切分,带重叠chunks=[]i=0whilei<len(sentences):end=i+chunk_size#计算当前块包含的句子范围chunk="".join(sentences[i:end])#将多个句子拼接成一个文本块chunks.append(chunk)#将文本块添加到结果列表#计算下一个块的起始位置i+=chunk_size-overlap#减去重叠部分,实现滑动窗口效果returnchunks,sentences#3.输出切分结果chunks,sentences=split_with_overlap(document,2,1)print(f"得到{len(chunks)}个重叠文本块")fori,chunkinenumerate(chunks,1):#enumerate从1开始计数print(f"{i}.{chunk}")以上代码实现了一个基于句子的重叠切分,其核心逻辑分为两个阶段:首先算法通过检测句号、问号等标点符号将原始文本按句子边界切分为独立的语义单元,确保每个单元都是完整的句子;然后,采用滑动窗口机制将这些句子组合成更大的文本块——每个块包含固定数量的句子(由chunk_size参数控制),并通过设置overlap参数使相邻块之间保留一定数量的重叠句子。运行overlap_splitter.py,结果如图6-5所示。图6-5项目6重叠切分文档从结果中发现,除最后一个文本块外,每个文本块中都包含一个与后边文本块重叠的句子。三、向量化处理文档1.文档向量化文档向量化是通过数学表示方法将非结构化的文本内容转换为机器可处理的数值向量。该技术运用特征提取、编码转换或模型映射等手段,将文档的语义信息、统计特征或结构关系转化为高维空间中的点坐标,构建出一个能够支持相似性计算、聚类分析和高效检索的数学表示系统,实现将人类可读文本到机器可读向量的转换。2.示例代码在project6项目中,创建名称为text_vector.py的文件,输入以下代码。print("===文本相似度===")#定义词汇表word_list=['猫','狗','喜欢','讨厌','鱼','骨头']#示例句子sentence1="猫喜欢鱼"sentence2="狗喜欢骨头"sentence3="猫讨厌鱼"sentence4="猫喜欢鱼"defsentence_to_Vector(sentence):"""将句子转换为向量(二进制表示)"""Vector=[]#初始化空向量words=sentence.split()#分割句子为单词列表#遍历词汇表中的所有单词forwinword_list:ifwinwords:#检查单词是否在句子中Vector.append(1)#存在该词,标记为1else:Vector.append(0)#不存在该词,标记为0returnVector#返回二进制向量#打印词汇表和向量化结果print("词汇对应向量:","".join(word_list))#显示词汇顺序print("句子1转向量:",sentence_to_Vector(sentence1))#向量:[1,0,1,0,1,0]print("句子2转向量:",sentence_to_Vector(sentence2))#向量:[0,1,1,0,0,1]print("句子3转向量:",sentence_to_Vector(sentence3))#向量:[1,0,0,1,1,0]print("句子4转向量:",sentence_to_Vector(sentence4))#向量:[1,0,1,0,1,0]print("比较:")print("句子1和句子2:都有一个'喜欢',其他都不同→不太相似")#只有一个共同特征print("句子1和句子3:都有'猫'和'鱼',但'喜欢/讨厌'相反,相似但不同")#有两个共同特征print("句子1和句子4:完全相同")#所有特征都相同,完全相似运行程序,结果如图6-6所示。图6-6项目6文本向量化处理以上代码包含数据准备、转换函数、向量化结果等三个部分。(1)程序初始化和数据准备(2)转换函数(3)向量化结果展示首先打印词汇表,然后对四个句子分别调用转换函数,得到它们的向量表示,从输出结果可以看出。句子1"猫喜欢鱼"转换为[1,0,1,0,1,0],表示词汇表中第1、3、5个位置(猫、喜欢、鱼)的词汇出现。句子2"狗喜欢骨头"转换为[0,1,1,0,0,1]。句子3"猫讨厌鱼"转换为[1,0,0,1,1,0]。句子4与句子1相同,也转换为[1,0,1,0,1,0]。通过分析比较句子相似度。虽然代码没有自动计算相似度数值,但通过观察向量可以直观判断。句子1和句子2只有一个共同特征"喜欢",所以不太相似,句子1和句子3有两个共同特征"猫"和"鱼",但喜欢和讨厌相反,所以有一定相似性但也有重要差异,句子1和句子4所有特征完全相同,因此完全相似。在实际应用中,通常会使用余弦相似度等数学方法来量化这种相似性,通过计算向量间的夹角或重叠比例来得到0到1之间的相似度分数。四、实现关键字检索1.关键字检索关键字检索是通过用户提供的关键词或短语在文档中定位相关信息的搜索技术。该技术运用文本匹配、索引构建和排序算法等手段,将用户查询意图与文档内容特征进行对应,建立从信息需求到检索结果的映射关系,构建出一个能够支持精准定位、相关性排序和快速响应的信息查找系统,实现从用户查询到目标文档的定向定位过程。关键字检索的优点是响应速度快且实现简单,能够快速从海量文档中定位包含特定词汇的信息,技术成熟稳定,缺点是依赖字面匹配而缺乏语义理解,无法处理同义词、一词多义等语言现象,检索准确性受限。2.示例代码在project6项目中,创建名称为keyword_search.py的文件,输入以下代码。fromlangchain_community.document_loadersimportTextLoader#导入文档加载器print("文档问答系统")print("="*40)#创建示例文件withopen("公司信息.txt","w",encoding="utf-8")asf:#打开文件用于写入f.write("""公司名称:创新科技上班时间:9:00-18:00年假天数:10天联系电话司地址:北京市""")#写入测试数据#加载文档loader=TextLoader("公司信息.txt",encoding="utf-8")#创建文档加载器doc=loader.load()[0]#加载文档并取第一个文档对象#按行分割并输出文档内容lines=doc.page_content.split('\n')#将文档内容按换行符分割成列表print(f"文档已加载,共{len(lines)}行信息")#显示文档行数print("文档内容:")fori,lineinenumerate(lines,1):#遍历所有行,从1开始编号print(f"{i}.{line}")#显示每行内容print("开始问答(输入'退出'结束)")print("-"*40)#问答循环whileTrue:#无限循环,持续接收用户输入question=input("请提问:").strip()#获取用户输入并去除首尾空格ifquestion.lower()in['退出','exit']:#检查退出条件print("再见!")break#跳出循环,结束程序#遍历查找匹配行,先处理用户问题,准备好要搜索的单词cleaned_question=question.replace("?","").replace("?","")#去掉问号question_words=cleaned_question.split()#分割成单词列表#设置一个标记,记录是否找到了答案answer_found=False#一行一行检查文档内容fordocument_lineinlines:#检查当前行是否包含问题中的任何单词forwordinquestion_words:ifwordindocument_line:#如果单词在当前行中print(f"答:{document_line}")#输出这一行作为答案answer_found=True#标记已经找到了答案break#停止检查其他单词#如果找到了答案,就停止继续搜索ifanswer_found:break#如果检查完所有行都没找到答案ifnotanswer_found:print("答:未找到相关信息")以上代码包含文档加载、文档内容显示、关键字检索、结果输出等四个部分。(1)创建和加载文档(2)文档内容显示(3)关键字检索(4)结果输出使用answer_found布尔变量作为检索状态标记,当在内层循环中发现关键字匹配时,立即执行三项操作:输出匹配的行作为答案、将状态标记设为True、跳出内层关键字循环。外层循环随后检查这个状态标记,如果已找到答案,则跳出外层文档行循环。如果双重循环完整执行后仍未找到任何匹配(answer_found仍为False),系统输出"未找到相关信息"的提示。运行keyword_search.py,首先提问“上班时间”,能够正确回答,然后提问“联系”,也能够进行正确回答,这是因为只要文档某行中包含用户提问内容,就返回该行内容,当提问“公司在哪里”时,程序无法返回正确结果,这是因为程序只是做关键字的包含匹配,根本无法理解用户输入问题的语义,如图6-7所示。图6-7项目6关键字查询结果五、实现语义检索1.语义检索语义检索是通过理解用户查询意图和文档内容含义来进行信息匹配的智能搜索技术。该技术运用语义理解、向量表示和深度学习等手段,将自然语言查询与文档语义特征进行深层对应,建立从概念意图到语义空间的知识映射关系,构建出一个能够支持意图理解、语义相似度计算和上下文感知的信息发现系统,实现从用户语义表达到相关内容发现的智能匹配过程。语义检索的优点是能够深入理解语言含义而非简单字面匹配,可以处理同义词替换、概念扩展和上下文关联等复杂语言现象,提供更符合用户真实意图的检索结果。缺点是技术要求复杂且计算资源消耗大,在特定专业领域因训练数据不足而表现不佳,响应速度通常比传统关键字检索慢。2.示例代码在project6项目中,创建名称为vetor_search.py的文件,输入以下代码。importrequests#网络请求库,调用API获取向量importnumpyasnp#数学计算库,处理向量运算fromlangchain_core.embeddingsimportEmbeddings#嵌入模型标准接口fromtypingimportList#类型提示importzipfile#解压docx文件importxml.etree.ElementTreeasET#解析XML文档print("Apache文档语义搜索系统")print("="*50)#创建模型类classSiliconFlowEmbeddings(Embeddings):def__init__(self,api_key:str):self.api_key=api_key#API密钥self.url="/v1/embeddings"#API地址defembed_documents(self,texts:List[str])->List[List[float]]:return[self._get_embedding(text)fortextintexts]#批量生成向量defembed_query(self,text:str)->List[float]:returnself._get_embedding(text)#生成单个问题向量def_get_embedding(self,text:str)->List[float]:headers={"Authorization":f"Bearer{self.api_key}"}#认证头data={"model":"BAAI/bge-large-zh-v1.5","input":text}#请求数据response=requests.post(self.url,headers=headers,json=data)#发送请求returnresponse.json()["data"][0]["embedding"]#提取向量#读取docx文件(简单方法)defread_docx_simple(file_path):"""使用Python内置方法读取docx文件"""withzipfile.ZipFile(file_path,'r')asdocx:#打开docx文件(zip格式)xml_content=docx.read('word/document.xml')#读取主文档XMLroot=ET.fromstring(xml_content)#解析XMLtext_parts=[]foreleminroot.iter():#遍历所有XML元素ifelem.textandelem.text.strip():#检查是否有文本内容text_parts.append(elem.text.strip())#收集文本return''.join(text_parts)#合并所有文本#主程序if__name__=="__main__":#初始化嵌入模型embeddings=SiliconFlowEmbeddings(api_key="*************"#输入读者在硅基流动平台申请的API开发密钥)#读取apache.docx文件print("正在读取apache.docx...")content=read_docx_simple("apache.docx")#读取文档内容print(f"文档已加载,长度:{len(content)}字符")#简单分割文本sentences=[s.strip()forsincontent.split('。')ifs.strip()]#按句号分割print(f"文档切分为{len(sentences)}个句子")#生成向量print("正在生成向量...")vectors=embeddings.embed_documents(sentences)#为所有句子生成向量print(f"向量生成完成,维度:{len(vectors[0])}")#开始问答print("="*50)print("开始问答(输入'退出'结束)")print("-"*50)whileTrue:question=input("请输入问题:").strip()#获取用户输入ifquestion.lower()in['退出','exit']:#退出条件检查print("再见!")break#生成问题向量question_vector=embeddings.embed_query(question)#将问题转为向量#寻找最相似句子best_answer=""best_score=0fori,sentence_vectorinenumerate(vectors):#遍历所有句子向量#计算余弦相似度similarity=np.dot(question_vector,sentence_vector)/\(np.linalg.norm(question_vector)*np.linalg.norm(sentence_vector))ifsimilarity>best_score:#找到更相似的句子best_score=similaritybest_answer=sentences[i]#直接输出结果ifbest_score>0.3:#相似度阈值判断print(f"答案:{best_answer}")else:print("未找到相关信息")以上代码包含初始化、创建模型类、文档解析、数据处理、语义匹配算符、输出结果等6个部分。(1)初始化(2)创建模型类(3)文档解析数据处理语义匹配算法输出结果相似度阈值0.3是经验值设置,基于语义向量在余弦空间中的分布特性。低于该阈值通常表示语义关联较弱,可能是偶然匹配。输出结果采用直接呈现模式,当未找到相关结果时,系统明确告知用户而非返回低质量答案。整个流程形成"问题→向量→匹配→筛选→输出"的完整检索链,实现了从关键词匹配到语义理解的跨越。运行vector_search.py,首先提问“怎么配置yum源”,返回相似度和答案,结果如图6-8所示。图6-8项目6语义查询结果从结果中发现,当提问“怎么配置yum源”时,查询apache.docx文档,返回了相似度和答案,实现了语义检索。·课题名称项目6实现RAG检索增强生成任务6-2持久化存储向量数据计划课时3课时教学引入王亮在开发企业内部信息查询功能智能体时,每次查询都需要对文档进行向量化处理,导致响应速度慢且资源消耗大。技术主管要求他实现向量数据库的持久化存储与查询能力,将公司文档一次性向量化并持久化存储为本地向量数据库;当智能体启动时快速加载已持久化的向量索引;确保用户使用自然语言查询时能准确返回相关文档信息。教学目标【知识目标】(1)掌握持久化向量数据的常用方法。(2)掌握FAISS向量数据库的存储机制。【技能目标】(1)能够使用FAISS数据库持久化向量数据。(2)能够查询FAISS数据库中的向量数据。【素养目标】(1)通过构建向量数据库系统,培养学生处理非结构化数据的工程化能力。(2)通过向量数据库的创建、存储和查询实践,培养学生系统化解决复杂问题的能力。教学重点掌握向量持久化存储方案与FAISS存储机制,完成FAISS向量库持久化存储与向量检索操作。教学难点理解FAISS向量索引持久化读写逻辑,根据业务场景合理选择向量持久化存储方案。教学方式任务驱动,案例教学教学过程任务6-2持久化存储向量数据※通过直接引入的方式导入新课王亮在开发企业内部信息查询功能智能体时,每次查询都需要对文档进行向量化处理,导致响应速度慢且资源消耗大。技术主管要求他实现向量数据库的持久化存储与查询能力,将公司文档一次性向量化并持久化存储为本地向量数据库;当智能体启动时快速加载已持久化的向量索引;确保用户使用自然语言查询时能准确返回相关文档信息。※新课讲解教师通过PPT的方式讲解。1.持久化向量数据的常用方法向量数据持久化的常用方法主要包括文件系统存储、专用向量数据库、传统数据库扩展、云存储服务和混合存储架构五种方案,其中文件系统存储因简单直接成为最常用的方法。(1)文件系统存储(2)专用向量数据库存储(3)传统数据库扩展存储(4)云存储服务集成2.FAISS向量数据库的存储机制FAISS是开源的向量数据库,专注于高维向量的高效相似性搜索和聚类。它提供了GPU加速支持,能够处理十亿级别的向量数据,广泛应用于推荐系统、图像检索和自然语言处理等领域,适合大多数中小项目。(1)双文件架构设计(2)序列化与持久化机制(3)高效加载与内存映射(4)增量更新策略二、使用向量数据库存储数据1.功能实现流程(1)连接搭建阶段(2)数据预处理阶段(3)向量转换阶段(4)检索结构构建阶段(5)持久化存储阶段2.编写示例代码(1)导入必要的库在project6项目中,创建名称为vector_database的文件,输入以下代码。fromlangchain_community.vectorstoresimportFAISSimportrequestsfromlangchain_core.embeddingsimportEmbeddingsfromlangchain_core.documentsimportDocumentfromtypingimportListimportos以上代码导入了构建向量数据库所需的五个核心Python组件。FAISS作为Facebook开源的高效向量数据库,专门用于存储和检索文本向量;requests作为HTTP请求库,负责向硅基流动API发送文本向量化请求;Embeddings作为LangChain框架的嵌入模型抽象接口,定义了文本向量化的标准方法规范;Document作为LangChain的标准文档结构,用于封装文本内容及其元数据;List用于明确函数参数和返回值的类型约束,提高代码可读性和维护性;os作为Python标准库,提供操作系统交互功能,用于文件路径操作和目录管理。(2)定义嵌入模型类在以上代码下方,定义了一个继承自LangChainEmbeddings抽象基类的SiliconEmbeddings类,通过实现标准接口方法,调用硅基流动API将文本转换为向量数据,代码如下所示。classSiliconEmbeddings(Embeddings):#构造函数:初始化API配置def__init__(self,api_key:str):self.api_key=api_key#存储API密钥self.url="/v1/embeddings"#API端点地址#批量文本向量化方法defembed_documents(self,texts:List[str])->List[List[float]]:headers={"Authorization":f"Bearer{self.api_key}"}#BearerToken认证data={"model":"BAAI/bge-large-zh-v1.5","input":texts}#指定模型和输入response=requests.post(self.url,headers=headers,json=data)#发送POST请求return[item["embedding"]foriteminresponse.json()["data"]]#提取向量数据#调用embed_documents接口获取向量defembed_query(self,text:str)->List[float]:returnself.embed_documents([text])[0]#将单文本包装成列表,调用函数,提取结果#返回嵌入模型的实例@classmethoddefcreate_embeddings_model(cls,api_key:str)->'SiliconEmbeddings':embeddings=cls(api_key)#实例化嵌入模型类print("嵌入模型创建成功!")#操作反馈returnembeddings以上代码定义了一个名为SiliconEmbeddings的自定义嵌入模型类,它继承自LangChain框架的Embeddings抽象基类,专门用于对接硅基流动平台,将文本转化为向量化数据。该类包含__init__()、embed_documents()、embed_query()、create_embeddings_model()等4个关键方法,具体功能解释如下。①__init__()②embed_documents()③embed_query()④create_embeddings_model()(3)创建向量数据库管理类在以上代码的下方,定义一个向量数据库管理类,代码如下所示。#向量数据库管理类classVectorDatabaseManager:#初始化向量数据库管理器def__init__(self,embeddings:SiliconEmbeddings):self.embeddings=embeddingsself.db=None#存储向量数据库实例print("向量数据库管理器初始化完成!")#从文档创建向量数据库defcreate_from_documents(self,docs:List[Document])->FAISS:self.db=FAISS.from_documents(docs,self.embeddings)#一键构建向量数据库print("向量数据库创建成功!")returnself.db#保存向量数据库到本地文件defsave_to_local(self,save_path:str="silicon_db"):print(f"正在保存数据库到:{save_path}")self.db.save_local(save_path)#持久化存储到文件#输出文件个数files=os.listdir(save_path)print(f"保存成功!生成{len(files)}个文件")以上代码定义一个名为VectorDatabaseManager的向量数据库管理类,专门用于封装向量数据库的构建和持久化操作流程。该类包含三个关键方法:__init__()构造函数接收嵌入模型实例参数并进行初始化设置;create_from_documents()方法实现从文档创建向量数据库的功能;save_to_local()方法负责将向量数据库保存到本地文件系统,具体功能如下。①管理器初始化②向量数据库构建③持久化存储实现(4)创建文档集合函数在以上代码的下方,创建文档集合函数,代码如下所示。#创建文档集合函数defcreate_documents()->List[Document]:"""创建文档数据"""docs=[Document(page_content="上班时间:9:00-18:00"),#创建文档对象Document(page_content="公司电话:12345678"),Document(page_content="公司地址:北京市"),Document(page_content="年假天数:10天"),Document(page_content="午休时间:12:00-13:00"),]print(f"已创建{len(docs)}个文档")#显示文档数量returndocs以上代码定义了一个名为create_documents的文档集合创建函数,专门用于构建公司信息文档数据,供后续向量化处理使用,该函数不需要接收任何参数,返回类型为List[Document],表示返回一个包含多个文档对象的列表,具体功能如下。①文档对象创建②文档数量统计与返回(5)主程序入口在以上代码的下方,输入主程序入口代码,如下所示。#主程序入口if__name__=="__main__":API_KEY="*************************"#使用读者自己申请的API开发密钥#使用类方法创建嵌入模型embeddings=SiliconEmbeddings.create_embeddings_model(API_KEY)#创建文档集合docs=create_documents()#使用管理器类创建和保存数据库db_manager=VectorDatabaseManager(embeddings)#初始化管理器db=db_manager.create_from_documents(docs)#创建数据库db_manager.save_to_local("company")#保存数据库print("持久化完成!")以上代码定义了一个Python程序的主执行入口,通过if__name__=="__main__":条件判断确保代码只在文件被直接运行时执行,不会被模块导入时意外执行。该入口程序按照清晰的四个步骤实现了完整的向量数据库构建与持久化流程:①API密钥配置与嵌入模型创建②文档数据准备③向量数据库构建与存储3.测试结果运行vector_database.py程序,结果如图6-9所示。图6-9项目6创建向量数据库并持久化文档从结果中可以发现,程序向量化处理文档后,FAISS向量数据库持久化了向量数据,保存到当前项目的company目录,如图6-10所示。图6-10项目6向量数据库持久化文件三、检索向量数据库1.功能实现流程(1)构建模型阶段(2)数据库加载阶段(3)查询向量化阶段(4)相似度匹配阶段(5)结果返回阶段2.编写示例代码(1)导入必要的库在project6项目中,创建名称为vector_database_select.py的文件,输入以下代码。importrequests#导入requests库用于发送HTTP请求fromlangchain_community.vectorstoresimportFAISS#导入FAISS向量数据库fromlangchain_core.embeddingsimportEmbeddings#导入嵌入模型基类fromtypingimportList#导入类型注解以上代码导入了构建向量数据库查询系统所需的四个核心Python组件。requests作为HTTP客户端库,负责向硅基流动API发送文本向量化请求,将用户查询转换为数学向量;FAISS向量数据库库用于从本地文件加载和检索已构建的向量索引;Embeddings作为LangChain框架的嵌入模型抽象接口,定义了文本向量化的标准方法规范,确保查询向量化与存储向量化的一致性;List作为Python类型注解工具,用于明确函数参数和返回值的类型约束。(2)自定义嵌入模型类在以上代码下方,输入自定义嵌入模型类的代码,如下所示。#自定义嵌入模型类,继承自EmbeddingsclassSiliconEmbeddings(Embeddings):"""必须使用与持久化存储向量数据相同的模型"""def__init__(self,api_key:str):#初始化方法self.api_key=api_key#存储API密钥self.url="/v1/embeddings"#设置API端点地址defembed_documents(self,texts:List[str])->List[List[float]]:#文档嵌入方法headers={"Authorization":f"Bearer{self.api_key}"}
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026ibm面试题及答案
- 2026java反射原理面试题目及答案
- 2026linux面试题及答案java
- 2026年特种设备作业人员考试特种设备操作与评估试卷(附答案)
- 初中七年级上学期英语 Unit 3:探索我的校园 教案
- 稻米品牌化种植的源头质量管控体系构建(年)行业报告
- 2026年金属非金属矿山安全生产(小型露天采石场)考试试题(含答案)
- 初中七年级地理 探究地理环境知识清单
- 2026年教师资格证初中综合素质试题及答案
- 2026年基层法律工作者考试(民事法律实务)试题及答案
- 2026湖南衡阳市衡东县卫健系统招聘专业技术人员46人模拟试卷完整附答案详解
- 2026-2030国内铁路电气设备行业市场发展分析及竞争格局与投资机会研究报告
- 2026-2030中国建筑信息模型(BIM)行业发展状况与前景趋势研究报告
- 水电站运行人员考试题及答案(教学参考)
- 2026年营养师《公共营养》测试卷(含答案)专项训练
- 2026年甘肃省三支一扶招聘考试(1800人)考试参考题库及答案详解
- 2026年学校会计高频面试题包含详细解答
- 初中八年级历史《民族团结与祖国统一》单元整体导学案
- 2026年7月自考13811绩效管理押题及答案
- 多病共存患者安全管理
- 24J113-1 内隔墙-轻质条板(一)
评论
0/150
提交评论