全网营销型网站建站专家,特色个人网站,切削工具东莞网站建设,招标网有哪些目录 一、知识文档的准备二、OCR转换三、分词处理四、创建向量数据库五、初始化语言聊天模型1.prompt2.检索链3.对话 完整代码 知识文档的准备#xff1a;首先需要准备知识文档#xff0c;这些文档可以是多种格式#xff0c;如Word、TXT、PDF等。使用文档加载器或多模态模型… 目录 一、知识文档的准备二、OCR转换三、分词处理四、创建向量数据库五、初始化语言聊天模型1.prompt2.检索链3.对话 完整代码 知识文档的准备首先需要准备知识文档这些文档可以是多种格式如Word、TXT、PDF等。使用文档加载器或多模态模型如OCR技术将这些文档转换为可理解的纯文本数据。对于长篇文档还需进行文档切片以便更高效地处理和检索信息。 嵌入模型将文本转换为向量形式以便通过计算向量之间的差异来识别语义上相似的句子。常见的嵌入模型包括Word2Vec、BERT和GPT系列等。
向量数据库将嵌入后的向量数据存储在向量数据库中以便进行高效的相似性搜索。
查询检索当用户提出查询时系统会将查询通过嵌入模型转换为向量然后在向量数据库中进行相似性搜索找到与查询最相关的文档或信息。
生成回答将检索到的相关信息与用户的查询结合生成最终的回答。生成模型会利用检索到的信息作为上下文输入并结合大语言模型来生成文本内容。 这里的嵌入模型用的是本地部署的ollama也可以使用openai但是连接不太稳定还有阿里云的通义千问。
一、知识文档的准备
知识库中存放pdf等类型的文档准备后面转换为txt文本
二、OCR转换
OCR转换会将PDF、图片这些信息提取得到TXT文本。数据质量的好坏直接影响着后面模型对话效果。因此PDF解析选用的工具必须精确且合适。 在这个例子中我是事先将PDF用MinerU解析成markdown形式了
三、分词处理
文本分词处理Tokenization是自然语言处理NLP中的一个重要步骤其目的是将连续的文本字符串分割成有意义的单元这些单元通常被称为“词”或“标记”tokens。分词处理是文本分析的基础因为大多数NLP任务都需要在词级别上进行操作例如文本分类、情感分析、机器翻译等。 中文分词使用了jieba库 jieba 是一个非常流行的 Python 中文分词库主要用于将中文文本切分成单个词语。它支持多种分词模式并提供了丰富的功能来满足不同的自然语言处理需求。 主要功能和特点 分词模式 精确模式将文本精确地切分成单个词语适合用于文本分析。 全模式将文本中所有可能的词语都扫描出来速度非常快但可能存在冗余数据。 搜索引擎模式在精确模式的基础上对长词再次进行切分提高召回率适合用于搜索引擎分词。 自定义词典用户可以通过自定义词典来增加新词以提高分词的准确性。 关键词提取jieba 提供了基于 TF-IDF 算法的关键词提取功能可以从文本中提取出最重要的词。 词性标注通过 jieba.posseg 模块可以在分词的同时获取词性信息。 并行分词支持并行分词以提高分词速度 。
四、创建向量数据库
def create_vector_store(tokenized_texts: List[List[str]], embeddings_model: OllamaEmbeddings) - FAISS:将分词后的文本创建向量库try:# 将分词列表转换回文本processed_texts [ .join(tokens) for tokens in tokenized_texts]# 批量处理优化batch_size 100 # 可以根据实际情况调整vectors []# # 如果有 GPU# if FAISS.get_num_gpus():# res FAISS.StandardGpuResources()# index FAISS.index_cpu_to_gpu(res, 0, index)for i in tqdm(range(0, len(processed_texts), batch_size), desc创建向量数据库):batch processed_texts[i:i batch_size]# 批量创建向量vector_store FAISS.from_texts(textsbatch,embeddingembeddings_model,metadatas[{index: j} for j in range(i, i len(batch))] # 添加元数据以追踪文档)vectors.append(vector_store)# 如果有多个批次合并它们if len(vectors) 1:final_vector_store vectors[0]for v in vectors[1:]:final_vector_store.merge_from(v)else:final_vector_store vectors[0]# 保存向量库到本地final_vector_store.save_local(resume_vectors)return final_vector_storeexcept Exception as e:print(f创建向量库时发生错误: {str(e)})raise五、初始化语言聊天模型
刚刚就是制作了向量数据库这是大模型的第一步下面还需要有明确的提示词prompt
1.prompt 2.检索链
检索链Retrieval Chain是一种在信息检索和自然语言处理中使用的技术流程主要用于从大规模数据集中高效地找到与用户查询最相关的信息片段或文档 3.对话
使用一个while循环始终在对话中
完整代码
import os
import jieba
import re
from typing import List
import pdf
# from langchain_community.embeddings import OpenAIEmbeddings
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_community.llms import Ollama
from tqdm import tqdm from loguru import logger
from magic_pdf.data.data_reader_writer import FileBasedDataWriter
from magic_pdf.pipe.UNIPipe import UNIPipeimport nltk
# 下载punkt
nltk.download(punkt)# 设置 OpenAI API 密钥
# os.environ[OPENAI_API_KEY] os.getenv(OPENAI_API_KEY)
# 创建 OpenAI API 密钥
api_key sk-xxx
os.environ[OPENAI_API_KEY] api_key# 定义简历文件夹路径
resume_folder ./data/demo# 读取 PDF 文件并提取文本
# def extract_text_from_pdfs(folder_path):
# texts []
# for filename in os.listdir(folder_path):
# if filename.endswith(.pdf):
# with open(os.path.join(folder_path, filename), rb) as file:
# reader PyPDF2.PdfReader(file)
# text
# for page in reader.pages:
# text page.extract_text()
# texts.append(text)
# return texts# 读取markdown文件并提取文本
def extract_text_from_markdown(folder_path):texts []for filename in os.listdir(folder_path):if filename.endswith(.md):with open(os.path.join(folder_path, filename), r, encodingutf-8) as file:text file.read()texts.append(text)return textsdef clean_text(text: str) - str:清理文本移除特殊字符和多余的空白# 替换多个空白字符为单个空格text re.sub(r\s, , text)# 移除特殊字符保留中文、英文、数字和基本标点text re.sub(r[^\u4e00-\u9fa5a-zA-Z0-9.,!?;:。], , text)return text.strip()def tokenize_texts(texts: List[str]) - List[List[str]]:对文本进行分词处理Args:texts: 要处理的文本列表Returns:处理后的分词列表tokenized_texts []for text in texts:# 清理文本cleaned_text clean_text(text)# 分别处理中文和英文words []# 使用jieba进行中文分词segments jieba.cut(cleaned_text)# 过滤空字符串和纯空白字符words [word for word in segments if word.strip()]# 移除停用词可选# words [word for word in words if word not in stopwords]tokenized_texts.append(words)return tokenized_textsdef create_vector_store(tokenized_texts: List[List[str]], embeddings_model: OllamaEmbeddings) - FAISS:将分词后的文本创建向量库try:# 将分词列表转换回文本processed_texts [ .join(tokens) for tokens in tokenized_texts]# 批量处理优化batch_size 100 # 可以根据实际情况调整vectors []# # 如果有 GPU# if FAISS.get_num_gpus():# res FAISS.StandardGpuResources()# index FAISS.index_cpu_to_gpu(res, 0, index)for i in tqdm(range(0, len(processed_texts), batch_size), desc创建向量数据库):batch processed_texts[i:i batch_size]# 批量创建向量vector_store FAISS.from_texts(textsbatch,embeddingembeddings_model,metadatas[{index: j} for j in range(i, i len(batch))] # 添加元数据以追踪文档)vectors.append(vector_store)# 如果有多个批次合并它们if len(vectors) 1:final_vector_store vectors[0]for v in vectors[1:]:final_vector_store.merge_from(v)else:final_vector_store vectors[0]# 保存向量库到本地final_vector_store.save_local(resume_vectors)return final_vector_storeexcept Exception as e:print(f创建向量库时发生错误: {str(e)})raise# 提取简历文本
resume_texts extract_text_from_markdown(resume_folder)
# resume_texts extract_text_from_pdfs(resume_folder)
print(简历文本提取完成)# 简历文本分词
tokenized_texts tokenize_texts(resume_texts)
print(f简历文本分词完成共处理 {len(tokenized_texts)} 份文档)# 可以打印一些统计信息可选
for i, tokens in enumerate(tokenized_texts):print(f文档 {i1} 分词数量: {len(tokens)})# 创建 OpenAI 嵌入
embeddings OllamaEmbeddings(modelnomic-embed-text:latest,base_urlxxx)
print(ollama 嵌入完成~)# 创建向量库
vector_store create_vector_store(tokenized_texts, embeddings)
print(向量库创建完成)# Initialize OpenAI model
# from langchain_community.chat_models import ChatOpenAI
# llm ChatOpenAI(modelgpt-4o, temperature0.1, api_keyos.environ.get(OPENAI_API_KEY))from langchain_community.llms import Ollama
llm Ollama(modelllama3.3:70b, temperature0.1, num_ctx60000,base_urlxxx)# Update imports
from langchain.chains import RetrievalQA # Changed from create_retrieval_qa_chain
from langchain.prompts import PromptTemplate # Import the necessary classPROMPT_TEMPLATE
已知信息{context}。
你是一个核聚变、人工智能、科学计算领域的人才鉴别专家你具备管理大量简历的能力请注意我向你提供了很多简历PDF文件但每个PDF文件对应一个候选人包括候选人的姓名、年龄、技能、经历、项目、成果等内容请仔细识别各个信息。 \
现在需要你帮我分析每个候选人的详细信息包括年龄、教育程度、专业技能、职业履历、项目背景、研究成果、获得荣誉、发展潜力然后帮我完成以下两个功能 \
1.当我给出开展项目的描述信息时你能帮我准确地按照适配项目的优先级推荐相关候选人每次允许按照优先级顺序推荐多个候选人并且详细给出推荐原因使用markdown的表格形式给出包括以下信息姓名、年龄、专业技能、推荐原因 \
2.当我需要分析一个候选人时请你能进行客观、准确的评估先描述其主要信息然后按照专业能力、科研成果、项目成绩、发展潜力、综合能力进行评分每项总分100结果以markown形式给出。 \
请务必注意每个简历仅对应一个候选人切记不要混淆各个人的信息1个候选人只需引用1次相关文档即可仔细识别每个文档中候选人的姓名。请回答以下问题{question}# 创建提示模板
prompt_template PromptTemplate(input_variables[context, question],templatePROMPT_TEMPLATE
)# 创建检索链
chain_type_kwargs {prompt: prompt_template,document_variable_name: context,
}# 创建检索链
qa RetrievalQA.from_chain_type(llmllm,chain_typestuff,retrievervector_store.as_retriever(),chain_type_kwargschain_type_kwargs,
)def chat_loop():print(\n欢迎使用简历分析助手)print(输入 quit 或 exit 结束对话)while True:# Get user inputuser_input input(\n请输入您的问题: ).strip()# Check if user wants to exitif user_input.lower() in [quit, exit]:print(感谢使用再见)breakif user_input:try:# Get the responseresult qa.run(user_input)print(\n回答)print(result)except Exception as e:print(f发生错误: {str(e)})continueif __name__ __main__:chat_loop()
文章转载自: http://www.morning.rfrx.cn.gov.cn.rfrx.cn http://www.morning.ghzfx.cn.gov.cn.ghzfx.cn http://www.morning.kpnpd.cn.gov.cn.kpnpd.cn http://www.morning.qtbnm.cn.gov.cn.qtbnm.cn http://www.morning.kntbk.cn.gov.cn.kntbk.cn http://www.morning.bkylg.cn.gov.cn.bkylg.cn http://www.morning.dwgcx.cn.gov.cn.dwgcx.cn http://www.morning.njhyk.cn.gov.cn.njhyk.cn http://www.morning.ubpsa.cn.gov.cn.ubpsa.cn http://www.morning.srgsb.cn.gov.cn.srgsb.cn http://www.morning.fndmk.cn.gov.cn.fndmk.cn http://www.morning.ejknty.cn.gov.cn.ejknty.cn http://www.morning.ydxx123.cn.gov.cn.ydxx123.cn http://www.morning.fznj.cn.gov.cn.fznj.cn http://www.morning.mfsxd.cn.gov.cn.mfsxd.cn http://www.morning.xiaobaixinyong.cn.gov.cn.xiaobaixinyong.cn http://www.morning.qyxwy.cn.gov.cn.qyxwy.cn http://www.morning.fjzlh.cn.gov.cn.fjzlh.cn http://www.morning.pctsq.cn.gov.cn.pctsq.cn http://www.morning.yksf.cn.gov.cn.yksf.cn http://www.morning.mywnk.cn.gov.cn.mywnk.cn http://www.morning.jqbpn.cn.gov.cn.jqbpn.cn http://www.morning.jbtzx.cn.gov.cn.jbtzx.cn http://www.morning.jzkqg.cn.gov.cn.jzkqg.cn http://www.morning.mgwdp.cn.gov.cn.mgwdp.cn http://www.morning.sfwcx.cn.gov.cn.sfwcx.cn http://www.morning.wclxm.cn.gov.cn.wclxm.cn http://www.morning.nlkhr.cn.gov.cn.nlkhr.cn http://www.morning.grbp.cn.gov.cn.grbp.cn http://www.morning.rxnr.cn.gov.cn.rxnr.cn http://www.morning.jhgxh.cn.gov.cn.jhgxh.cn http://www.morning.kqfdrqb.cn.gov.cn.kqfdrqb.cn http://www.morning.wmrgp.cn.gov.cn.wmrgp.cn http://www.morning.zfqdt.cn.gov.cn.zfqdt.cn http://www.morning.rxfjg.cn.gov.cn.rxfjg.cn http://www.morning.nzxdz.cn.gov.cn.nzxdz.cn http://www.morning.nqpy.cn.gov.cn.nqpy.cn http://www.morning.phxdc.cn.gov.cn.phxdc.cn http://www.morning.prgdy.cn.gov.cn.prgdy.cn http://www.morning.xtdtt.cn.gov.cn.xtdtt.cn http://www.morning.bkppb.cn.gov.cn.bkppb.cn http://www.morning.lbggk.cn.gov.cn.lbggk.cn http://www.morning.jtmrx.cn.gov.cn.jtmrx.cn http://www.morning.jstggt.cn.gov.cn.jstggt.cn http://www.morning.hsrpc.cn.gov.cn.hsrpc.cn http://www.morning.hysqx.cn.gov.cn.hysqx.cn http://www.morning.hbqhz.cn.gov.cn.hbqhz.cn http://www.morning.yrfxb.cn.gov.cn.yrfxb.cn http://www.morning.rpfpx.cn.gov.cn.rpfpx.cn http://www.morning.khtyz.cn.gov.cn.khtyz.cn http://www.morning.qxmnf.cn.gov.cn.qxmnf.cn http://www.morning.prls.cn.gov.cn.prls.cn http://www.morning.pqnps.cn.gov.cn.pqnps.cn http://www.morning.yzsdp.cn.gov.cn.yzsdp.cn http://www.morning.wcghr.cn.gov.cn.wcghr.cn http://www.morning.ctswj.cn.gov.cn.ctswj.cn http://www.morning.rgrys.cn.gov.cn.rgrys.cn http://www.morning.kskpx.cn.gov.cn.kskpx.cn http://www.morning.bgpb.cn.gov.cn.bgpb.cn http://www.morning.gccdr.cn.gov.cn.gccdr.cn http://www.morning.gediba.com.gov.cn.gediba.com http://www.morning.dsmwy.cn.gov.cn.dsmwy.cn http://www.morning.lwcqh.cn.gov.cn.lwcqh.cn http://www.morning.bfrff.cn.gov.cn.bfrff.cn http://www.morning.rjrh.cn.gov.cn.rjrh.cn http://www.morning.zqnmp.cn.gov.cn.zqnmp.cn http://www.morning.zstry.cn.gov.cn.zstry.cn http://www.morning.gqwbl.cn.gov.cn.gqwbl.cn http://www.morning.fbpyd.cn.gov.cn.fbpyd.cn http://www.morning.dpwcl.cn.gov.cn.dpwcl.cn http://www.morning.rpsjh.cn.gov.cn.rpsjh.cn http://www.morning.xdjwh.cn.gov.cn.xdjwh.cn http://www.morning.wrqw.cn.gov.cn.wrqw.cn http://www.morning.jzlkq.cn.gov.cn.jzlkq.cn http://www.morning.wanjia-sd.com.gov.cn.wanjia-sd.com http://www.morning.fbxlj.cn.gov.cn.fbxlj.cn http://www.morning.pwbps.cn.gov.cn.pwbps.cn http://www.morning.ypqwm.cn.gov.cn.ypqwm.cn http://www.morning.fynkt.cn.gov.cn.fynkt.cn http://www.morning.ddfp.cn.gov.cn.ddfp.cn