盘锦威旺做网站建设重庆手机网站推广报价
2026/3/17 4:43:12 网站建设 项目流程
盘锦威旺做网站建设,重庆手机网站推广报价,dedecms建站教程,网站建设和数据容量整合目录#xff1a;一、项目简介和项目结构二、向量数据库的使用2.1、voctorSaveTest.py2.2、结果分析三、中英文文件内容分割3.1、中文pdfSplitTest_Ch.py3.2、英文pdfSplitTest_En.py一、项目简介和项目结构 本项目实现一个健康档案助手智能体#xff0c;包含两个Agent#…目录一、项目简介和项目结构二、向量数据库的使用2.1、voctorSaveTest.py2.2、结果分析三、中英文文件内容分割3.1、中文pdfSplitTest_Ch.py3.2、英文pdfSplitTest_En.py一、项目简介和项目结构本项目实现一个健康档案助手智能体包含两个Agent一个Agent负责根据医生询问的健康问题从私有健康档案库(RAG)中检索相关内容另一个Agent负责根据检索的内容和问题进行健康分析并最终调用外部工具把生成的报告以PDF文件保存到本地回忆下RAG的功能:离线步骤:文档加载-文档切分-向量化-灌入向量数据库在线步骤:获取用户问题-用户问题向量化-检索向量数据库-将检索结果和用户问题填入prompt模版-用最终的prompt调用LLM-由LLM生成主业务逻辑处理都是一样的这里我们主要讲解新增的工具向量数据库的使用通过向量数据来检索内容。二、向量数据库的使用2.1、voctorSaveTest.py# 功能说明将PDF文件进行向量计算并持久化存储到向量数据库chromaDB# 引入相关库importloggingfromopenaiimportOpenAIimportchromadbimportuuidimportnumpyasnpfromutilsimportpdfSplitTest_ChfromutilsimportpdfSplitTest_En# 设置日志模版logging.basicConfig(levellogging.INFO,format%(asctime)s - %(name)s - %(levelname)s - %(message)s)loggerlogging.getLogger(__name__)# 模型设置相关 根据自己的实际情况进行调整API_TYPEopenai# openai:调用gpt模型oneapi:调用oneapi方案支持的模型(这里调用通义千问)# openai模型相关配置 根据自己的实际情况进行调整OPENAI_API_BASEhttps://api.wlai.vip/v1OPENAI_EMBEDDING_API_KEYsk-YgieAyjrhxwWFmn423FbB8A1C3B94f378d3b67467b32F6E7OPENAI_EMBEDDING_MODELtext-embedding-3-small# oneapi相关配置(通义千问为例) 根据自己的实际情况进行调整ONEAPI_API_BASEhttp://139.224.72.218:3000/v1ONEAPI_EMBEDDING_API_KEYsk-DoU00d1PaOMCFrSh68196328E08e443a8886E95761D7F4BfONEAPI_EMBEDDING_MODELtext-embedding-v1# 设置测试文本类型TEXT_LANGUAGEChinese#Chinese 或 English# 测试的pdf文件路径INPUT_PDFinput/健康档案.pdf# 指定文件中待处理的页码全部页码则填NonePAGE_NUMBERSNone# PAGE_NUMBERS[2, 3]# 指定向量数据库chromaDB的存储位置和集合 根据自己的实际情况进行调整CHROMADB_DIRECTORYchromaDB# chromaDB向量数据库的持久化路径CHROMADB_COLLECTION_NAMEdemo001# 待查询的chromaDB向量数据库的集合名称# get_embeddings方法计算向量defget_embeddings(texts):globalAPI_TYPE,ONEAPI_API_BASE,ONEAPI_EMBEDDING_API_KEY,ONEAPI_EMBEDDING_MODEL,OPENAI_API_BASE,OPENAI_EMBEDDING_API_KEY,ONEAPI_EMBEDDING_MODELifAPI_TYPEoneapi:try:# 初始化非OpenAI的Embedding模型,这里使用的是oneapi方案clientOpenAI(base_urlONEAPI_API_BASE,api_keyONEAPI_EMBEDDING_API_KEY)dataclient.embeddings.create(inputtexts,modelONEAPI_EMBEDDING_MODEL).datareturn[x.embeddingforxindata]exceptExceptionase:logger.info(f生成向量时出错:{e})return[]elifAPI_TYPEopenai:try:# 初始化OpenAI的Embedding模型clientOpenAI(base_urlOPENAI_API_BASE,api_keyOPENAI_EMBEDDING_API_KEY)dataclient.embeddings.create(inputtexts,modelOPENAI_EMBEDDING_MODEL).datareturn[x.embeddingforxindata]exceptExceptionase:logger.info(f生成向量时出错:{e})return[]# 对文本按批次进行向量计算defgenerate_vectors(data,max_batch_size25):results[]foriinrange(0,len(data),max_batch_size):batchdata[i:imax_batch_size]# 调用向量生成get_embeddings方法 根据调用的API不同进行选择responseget_embeddings(batch)results.extend(response)returnresults# 封装向量数据库chromadb类提供两种方法classMyVectorDBConnector:def__init__(self,collection_name,embedding_fn):# 申明使用全局变量globalCHROMADB_DIRECTORY# 实例化一个chromadb对象# 设置一个文件夹进行向量数据库的持久化存储 路径为当前文件夹下chromaDB文件夹chroma_clientchromadb.PersistentClient(pathCHROMADB_DIRECTORY)# 创建一个collection数据集合# get_or_create_collection()获取一个现有的向量集合如果该集合不存在则创建一个新的集合self.collectionchroma_client.get_or_create_collection(namecollection_name)# embedding处理函数self.embedding_fnembedding_fn# 添加文档到集合# 文档通常包括文本数据和其对应的向量表示这些向量可以用于后续的搜索和相似度计算defadd_documents(self,documents):self.collection.add(embeddingsself.embedding_fn(documents),# 调用函数计算出文档中文本数据对应的向量documentsdocuments,# 文档的文本数据ids[str(uuid.uuid4())foriinrange(len(documents))]# 文档的唯一标识符 自动生成uuid,128位)# 检索向量数据库返回包含查询结果的对象或列表这些结果包括最相似的向量及其相关信息# query查询文本# top_n返回与查询向量最相似的前 n 个向量defsearch(self,query,top_n):try:resultsself.collection.query(# 计算查询文本的向量然后将查询文本生成的向量在向量数据库中进行相似度检索query_embeddingsself.embedding_fn([query]),n_resultstop_n)returnresultsexceptExceptionase:logger.info(f检索向量数据库时出错:{e})return[]# 封装文本预处理及灌库方法 提供外部调用defvectorStoreSave():globalTEXT_LANGUAGE,CHROMADB_COLLECTION_NAME,INPUT_PDF,PAGE_NUMBERS# 测试中文文本ifTEXT_LANGUAGEChinese:# 1、获取处理后的文本数据# 演示测试对指定的全部页进行处理其返回值为划分为段落的文本列表paragraphspdfSplitTest_Ch.getParagraphs(filenameINPUT_PDF,page_numbersPAGE_NUMBERS,min_line_length1)# 2、将文本片段灌入向量数据库# 实例化一个向量数据库对象# 其中传参collection_name为集合名称, embedding_fn为向量处理函数vector_dbMyVectorDBConnector(CHROMADB_COLLECTION_NAME,generate_vectors)# 向向量数据库中添加文档文本数据、文本数据对应的向量数据vector_db.add_documents(paragraphs)# 测试英文文本elifTEXT_LANGUAGEEnglish:# 1、获取处理后的文本数据# 演示测试对指定的全部页进行处理其返回值为划分为段落的文本列表paragraphspdfSplitTest_En.getParagraphs(filenameINPUT_PDF,page_numbersPAGE_NUMBERS,min_line_length1)# 2、将文本片段灌入向量数据库# 实例化一个向量数据库对象# 其中传参collection_name为集合名称, embedding_fn为向量处理函数vector_dbMyVectorDBConnector(CHROMADB_COLLECTION_NAME,generate_vectors)# 向向量数据库中添加文档文本数据、文本数据对应的向量数据vector_db.add_documents(paragraphs)# 封装从向量数据库中查询内容方法 提供外部调用defvectorSearch(user_query):globalCHROMADB_COLLECTION_NAME vector_dbMyVectorDBConnector(CHROMADB_COLLECTION_NAME,generate_vectors)# 封装检索接口进行检索测试# 将检索出的5个近似的结果full_textsearch_resultsvector_db.search(user_query,5)logger.info(f检索向量数据库的结果:{search_results[documents][0]})fordocinsearch_results[documents][0]:logger.info(fdoc结果:{doc})full_textfull_textdoc logger.info(ffull_text结果:{full_text})if__name____main__:# 1、测试文本预处理及灌库vectorStoreSave()# # 2、测试检索# user_query 张三九最近的头痛与之前的体检记录是否有关# vectorSearch(user_query)2.2、结果分析# 1、测试文本预处理及灌库vectorStoreSave()# # 2、测试检索# user_query 张三九最近的头痛与之前的体检记录是否有关# vectorSearch(user_query)我们是先调用“1、测试文本预处理及灌库”将文档的内容进行存库操作然后就可以调用“2、测试检索”通过用户输入问题从向量数据库中检索出内容三、中英文文件内容分割3.1、中文pdfSplitTest_Ch.py# 功能说明将PDF文件进行文本预处理,适用中文# 准备工作安装相关包# pip install pdfminer.six# 导入相关库importloggingfrompdfminer.high_levelimportextract_pagesfrompdfminer.layoutimportLTTextContainerimportre# 设置日志模版logging.basicConfig(levellogging.INFO,format%(asctime)s - %(name)s - %(levelname)s - %(message)s)loggerlogging.getLogger(__name__)# 当处理中文文本时按照标点进行断句defsent_tokenize(input_string):sentencesre.split(r(?[。?!]),input_string)# 去掉空字符串return[sentenceforsentenceinsentencesifsentence.strip()]# PDF文档处理函数,从PDF文件中按指定页码提取文字defextract_text_from_pdf(filename,page_numbers,min_line_length):# 申明变量paragraphs[]bufferfull_text# 提取全部文本并按照一行一行进行截取并在每一行后面加上换行符fori,page_layoutinenumerate(extract_pages(filename)):# 如果指定了页码范围跳过范围外的页ifpage_numbersisnotNoneandinotinpage_numbers:continueforelementinpage_layout:ifisinstance(element,LTTextContainer):full_textelement.get_text()\n# full_text将文件按照一行一行进行截取并在每一行后面加上换行符# logger.info(ffull_text: {full_text})# 按空行分隔将文本重新组织成段落# lines将full_text按照换行符进行切割此时空行则为空‘’linesfull_text.split(\n)# logger.info(flines: {lines})# 将lines进行循环取出每一个片段text进行处理合并成段落处理逻辑为# 1首先判断text的最小行的长度是否大于min_line_length设置的值# 2如果大于min_line_length则将该text拼接在buffer后面如果该text不是以连字符“-”结尾则在行前加上一个空格如果该text是以连字符“-”结尾则去掉连字符# 3如果小于min_line_length且buffer中有内容则将其添加到 paragraphs 列表中# 4最后处理剩余的缓冲区内容在遍历结束后如果 buffer 中仍有内容则将其添加到 paragraphs 列表中fortextinlines:iflen(text)min_line_length:buffer( text)ifnottext.endswith(-)elsetext.strip(-)elifbuffer:paragraphs.append(buffer)bufferifbuffer:paragraphs.append(buffer)# logger.info(fparagraphs: {paragraphs[:10]})# 其返回值为划分段落的文本列表returnparagraphs# 将PDF文档处理函数得到的文本列表再按一定粒度部分重叠式的切割文本使上下文更完整# chunk_size每个文本块的目标大小以字符为单位默认为 800# overlap_size块之间的重叠大小以字符为单位默认为 200defsplit_text(paragraphs,chunk_size800,overlap_size200):# 按指定 chunk_size 和 overlap_size 交叠割文本sentences[s.strip()forpinparagraphsforsinsent_tokenize(p)]chunks[]i0whileilen(sentences):chunksentences[i]overlapprev_len0previ-1# 向前计算重叠部分whileprev0andlen(sentences[prev])len(overlap)overlap_size:overlapsentences[prev] overlap prev-1chunkoverlapchunknexti1# 向后计算当前chunkwhilenextlen(sentences)andlen(sentences[next])len(chunk)chunk_size:chunkchunk sentences[next]next1chunks.append(chunk)inext# logger.info(fchunks: {chunks[0:10]})returnchunksdefgetParagraphs(filename,page_numbers,min_line_length):paragraphsextract_text_from_pdf(filename,page_numbers,min_line_length)chunkssplit_text(paragraphs,800,200)returnchunksif__name____main__:# 测试 PDF文档按一定条件处理成文本数据paragraphsgetParagraphs(../input/健康档案.pdf,# page_numbers[2, 3], # 指定页面page_numbersNone,# 加载全部页面min_line_length1)# 测试前3条文本logger.info(f只展示3段截取片段:)logger.info(f截取的片段1:{paragraphs[0]})logger.info(f截取的片段2:{paragraphs[2]})logger.info(f截取的片段3:{paragraphs[3]})3.2、英文pdfSplitTest_En.py# 功能说明将PDF文件进行文本预处理,适用英文# 准备工作安装相关包# pip install pdfminer.six# pip install nltk# 导入相关库importloggingfrompdfminer.high_levelimportextract_pagesfrompdfminer.layoutimportLTTextContainerimportnltk# 设置日志模版logging.basicConfig(levellogging.INFO,format%(asctime)s - %(name)s - %(levelname)s - %(message)s)loggerlogging.getLogger(__name__)# 当处理英文文本时按照该条件进行断句fromnltk.tokenizeimportsent_tokenize# # 运行后直接下载使用# nltk.download(punkt_tab)# 也可从本地加载punk_tabnltk.data.path.append(../other/punkt_tab)# PDF文档处理函数,从PDF文件中按指定页码提取文字defextract_text_from_pdf(filename,page_numbers,min_line_length):# 申明变量paragraphs[]bufferfull_text# 提取全部文本并按照一行一行进行截取并在每一行后面加上换行符fori,page_layoutinenumerate(extract_pages(filename)):# 如果指定了页码范围跳过范围外的页ifpage_numbersisnotNoneandinotinpage_numbers:continueforelementinpage_layout:ifisinstance(element,LTTextContainer):full_textelement.get_text()\n# full_text将文件按照一行一行进行截取并在每一行后面加上换行符# logger.info(ffull_text: {full_text})# 按空行分隔将文本重新组织成段落# lines将full_text按照换行符进行切割此时空行则为空‘’linesfull_text.split(\n)# logger.info(flines: {lines})# 将lines进行循环取出每一个片段text进行处理合并成段落处理逻辑为# 1首先判断text的最小行的长度是否大于min_line_length设置的值# 2如果大于min_line_length则将该text拼接在buffer后面如果该text不是以连字符“-”结尾则在行前加上一个空格如果该text是以连字符“-”结尾则去掉连字符# 3如果小于min_line_length且buffer中有内容则将其添加到 paragraphs 列表中# 4最后处理剩余的缓冲区内容在遍历结束后如果 buffer 中仍有内容则将其添加到 paragraphs 列表中fortextinlines:iflen(text)min_line_length:buffer( text)ifnottext.endswith(-)elsetext.strip(-)elifbuffer:paragraphs.append(buffer)bufferifbuffer:paragraphs.append(buffer)# logger.info(fparagraphs: {paragraphs[:10]})# 其返回值为划分段落的文本列表returnparagraphs# 将PDF文档处理函数得到的文本列表再按一定粒度部分重叠式的切割文本使上下文更完整# chunk_size每个文本块的目标大小以字符为单位默认为 800# overlap_size块之间的重叠大小以字符为单位默认为 200defsplit_text(paragraphs,chunk_size800,overlap_size200):# 按指定 chunk_size 和 overlap_size 交叠割文本sentences[s.strip()forpinparagraphsforsinsent_tokenize(p)]chunks[]i0whileilen(sentences):chunksentences[i]overlapprev_len0previ-1# 向前计算重叠部分whileprev0andlen(sentences[prev])len(overlap)overlap_size:overlapsentences[prev] overlap prev-1chunkoverlapchunknexti1# 向后计算当前chunkwhilenextlen(sentences)andlen(sentences[next])len(chunk)chunk_size:chunkchunk sentences[next]next1chunks.append(chunk)inext# logger.info(fchunks: {chunks[0:10]})returnchunksdefgetParagraphs(filename,page_numbers,min_line_length):paragraphsextract_text_from_pdf(filename,page_numbers,min_line_length)chunkssplit_text(paragraphs,800,200)returnchunksif__name____main__:# 测试 PDF文档按一定条件处理成文本数据paragraphsgetParagraphs(../input/llama2.pdf,page_numbers[2,3],# 指定页面# page_numbersNone,#加载全部页面min_line_length1)# 测试前3条文本logger.info(f只展示3段截取片段:)logger.info(f截取的片段1:{paragraphs[0]})logger.info(f截取的片段2:{paragraphs[2]})logger.info(f截取的片段3:{paragraphs[3]})代码比较简单大家可以根据注释去理解代码。项目地址https://github.com/NanGePlus/CrewAITest/tree/main/crewAIWithRag

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询