检索增强生成(2)本地PDF 本地嵌入模型


from langchain_community.document_loaders import PyPDFLoader
from pathlib import Pathdef load_local_pdf(file_path):if not Path(file_path).exists():raise FileNotFoundError(f"文件 {file_path} 不存在!")loader = PyPDFLoader(file_path)try:docs = loader.load()print(f"成功加载 {len(docs)} 页 | 首页内容片段: {docs[0].page_content[:200]}...")return docsexcept Exception as e:print(f"加载失败: {str(e)}")return None# For openai key
import os
os.environ["OPENAI_API_KEY"] = "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"# 1. 初始化OpenAI模型
from langchain_openai.chat_models import ChatOpenAIllm = ChatOpenAI(model_name="gpt-4o-mini")# 测试OpenAI调用
response = llm.invoke("奖惩的原则是什么?")
print(response.content)# 2. 加载PDF文档
from langchain_community.document_loaders import PyPDFLoader# Or download the paper and put a path to the local file instead
# loader = PyPDFLoader("https://arxiv.org/pdf/2402.03216")
# docs = loader.load()
# print(docs[0].metadata)local_docs = load_local_pdf("C:\\员工奖惩管理办法.pdf")# 3. 分割文本
from langchain.text_splitter import RecursiveCharacterTextSplitter# initialize a splitter
# 配置智能分割器
splitter = RecursiveCharacterTextSplitter(chunk_size=1000,chunk_overlap=200,  # 增加重叠比例separators=["\n\n", "。", "\n", " ", ""],  # 优化分隔符优先级length_function=len,add_start_index=True  # 记录起始位置
)# use the splitter to split our paper
corpus = splitter.split_documents(local_docs)
print(f"分割后文档数: {len(corpus)} | 首块内容示例:\n{corpus[0].page_content[:200]}...")# 4. 初始化嵌入模型
from langchain_huggingface.embeddings import HuggingFaceEmbeddings# 指定本地模型路径
model_path = "./models/bge-large-zh-v1.5"
# embedding_model = HuggingFaceEmbeddings(model_name="BAAI/bge-large-zh-v1.5", encode_kwargs={"normalize_embeddings": True})
embedding_model = HuggingFaceEmbeddings(model_name=model_path,  # 直接指向本地路径encode_kwargs={"normalize_embeddings": True},model_kwargs={"local_files_only": True}  # 强制从本地加载
)# 5. 构建向量数据库
from langchain_community.vectorstores import FAISSvectordb = FAISS.from_documents(corpus, embedding_model)# (optional) save the vector database to a local directory
# 保存向量库(确保目录权限)
if not os.path.exists("vectorstore.db"):vectordb.save_local("vectorstore.db")
print("向量数据库已保存")# 6. 创建检索链
from langchain_core.prompts import ChatPromptTemplatetemplate = """
You are a Q&A chat bot.
Use the given context only, answer the question.<context>
{context}
</context>Question: {input}
"""# Create a prompt template
prompt = ChatPromptTemplate.from_template(template)from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains import create_retrieval_chaindoc_chain = create_stuff_documents_chain(llm, prompt)
# Create retriever for later use
retriever = vectordb.as_retriever(search_kwargs={"k": 3})  # 调整检索数量
chain = create_retrieval_chain(retriever, doc_chain)# 7. 执行查询
response = chain.invoke({"input": "奖惩的原则是什么?"})# print the answer only
print("\n答案:", response['answer'])

模型下载参考上一篇文章: 使用huggingface-cli下载模型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全守护:反光衣检测技术的革新之路

视觉分析助力船上工人反光衣检测 在现代工业生产与作业环境中&#xff0c;安全始终是首要考虑的因素。对于水上作业&#xff0c;如船舶维护、海上施工等场景&#xff0c;工人穿戴反光衣是预防事故、提高可见性的重要措施。然而&#xff0c;传统的人工检查方式不仅效率低下&…

【Scrapy】Scrapy教程8——处理子链接

通过前面几篇文章,已经了解了如何去爬取网页内容并存储到数据库,但是目前只是存储了一个页面的内容,现在想要获取每篇文章链接内的文章内容,我们来看看怎么获取。 生成新请求 首先我们肯定要先拿到链接,所以第一步都获取文章标题和链接肯定少不了,然后再爬取获取到到子…

Centos6配置yum源

Centos6配置yum源 为Centos6配置CentOS Vault源—防止yum源过期为Centos6配置epel源为Centos6配置ELRepo源---已ELRepo被官方清空Centos6安装dockerdocker配置国内镜像加速 为Centos6配置CentOS Vault源—防止yum源过期 参考&#xff1a;https://mirrors.ustc.edu.cn/help/cen…

“智改数转”新风口,物联网如何重构制造业竞争力?

一、政策背景 为深化制造业智能化改造、数字化转型、网络化联接&#xff0c;江苏省制定了《江苏省深化制造业智能化改造数字化转型网络化联接三年行动计划&#xff08;2025&#xff0d;2027年&#xff09;》&#xff0c;提出到2027年&#xff0c;全省制造业企业设备更新、工艺…

制作Oracle11g Docker 镜像

基于Linux系统&#xff0c;宿主主机要设置如下环境变量&#xff0c;oracle为64位版本 dockerfile中需要的数据库安装包可从csdn下载内找到 #!/bin/bash # 在宿主机上运行以设置Oracle所需的内核参数 # 这些命令需要root权限cat > /etc/sysctl.d/99-oracle.conf << EO…

从GTC2025首次量子日看英伟达量子AI融合算力网络前景与趋势

GTC2025 Quantum Day 最新内容全部汇总: 技术名称描述合作伙伴/开发者应用场景/目标量子模拟器优化方案NVIDIA与IonQ、D-Wave合作,针对量子模拟器进行性能优化,提升量子计算任务效率。IonQ、D-Wave量子算法开发、复杂系统模拟混合量子-经典计算架构结合量子计算与经典GPU加速…

UE4学习笔记 FPS游戏制作12 添加第二把枪,制作枪的父类,动态生成物体,切换武器

我们添加一个发射器类型的枪 我们目前有了一个Rifle的枪械蓝图&#xff0c;我们在添加Launcher时&#xff0c;需要为他们添加一个父类&#xff0c;将公共方法放到父类里&#xff0c;方法体由子类实现 添加父类 方法1 新建一个Gun的蓝图&#xff0c;Gun继承Actor&#xff0c;…

【原创首发】开源基于AT32 SIP/VOIP电话

前言 本次为了反馈各位粉丝的关注&#xff0c;特此分享 AT32_VOIP 工程&#xff0c;此功能其实跟我之前发过的《STM32F429的VOIP功能》是一样的&#xff0c;只是用了AT32F437。 其实那个工程是一个比较Demo中的Demo&#xff0c;很多功能和硬件依赖性太大了。后面项目中发现AT…

通俗易懂搞懂@RequestParam 和 @RequestBody

&#x1f4cc; 博主简介: &#x1f4bb; 努力学习的 23 级科班生一枚 &#x1f680;&#x1f3e0; 博主主页 &#xff1a; &#x1f4ce; 灰阳阳&#x1f4da; 往期回顾 &#xff1a;Session和Cookie我不允许你不懂&#x1f4ac; 每日一言&#xff1a; 「流水不争先&#xff0c…

dubbo版本与分组

Dubbo服务中&#xff0c;接口并不能唯一确定一个服务&#xff0c;只有 接口分组版本号 的三元组才能唯一确定一个服务。 当同一个接口针对不同的业务场景、不同的使用需求或者不同的功能模块等场景&#xff0c;可使用服务分组来区分不同的实现方式。同时&#xff0c;这些不同实…

RAG现有技术方案

RAG现有技术方案 一、现有技术方案的核心问题 检索质量不足 挑战:传统RAG系统依赖单轮检索,难以应对智能电网的海量异构数据(如传感器读数、控制参数),导致检索结果相关性低、覆盖不全。案例:BM25稀疏检索在处理长文本或专业术语时,易遗漏语义关联;BGE等稠密检索模型对…

redis MISCONF Redis is configured to save RDB snapshots报错解决

直接上解决方案 修改redis配置文件 stop-writes-on-bgsave-error no 重启redis

个人学习编程(3-22) leetcode刷题

连续子数组&#xff1a;&#xff08;难&#xff09; 示例 1: 输入: nums [0,1] 输出: 2 说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。 示例 2: 输入: nums [0,1,0] 输出: 2 说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。 需要理解的知识&a…

希尔排序

希尔排序是一种改进的插入排序算法&#xff0c;它通过将原始数据分成多个子序列来改善插入排序的性能&#xff0c;每个子序列的元素间隔为 d&#xff08;增量&#xff09;。随着算法的进行&#xff0c;d 逐渐减小&#xff0c;最终减为 1&#xff0c;此时整个序列就被排序好了。…

JavaScript基础-DOM事件流

在Web开发过程中&#xff0c;理解和掌握DOM事件流是实现高效交互的关键。DOM事件流描述了当一个事件发生时&#xff0c;它在文档树中的传播路径。了解事件流的概念有助于我们更精确地控制事件处理逻辑&#xff0c;避免不必要的行为&#xff0c;并提升用户体验。本文将深入探讨D…

C语言基础知识07---预编译模块化

目录 预编译指令 1.1 编译流程 1.2 文件包含 1.3 条件编译 1.4 宏定义 1.5 无参宏 1.6 typedef和无参宏的区别 1.7 有参宏 1.8 函数与有参宏的区别 1.9 取消宏定义 #undef 1.10 符合使用 模块化操作 1.1 H文件&#xff1a;固定模版 1.2 C文件&#xff1a;源文件-…

自由学习记录(46)

CG语法的数据类型 // uint : 无符号整数&#xff08;32位&#xff09; // int : 有符号整数&#xff08;32位&#xff09; // float : 单精度浮点数&#xff08;32位&#xff09;&#xff0c;通常带后缀 f&#xff08;如 1.0f&#xff09; // half : 半精度浮…

Agent:大模型中的智能“函数”

在传统的编程范式中&#xff0c;函数是执行特定任务的基本单元。它们接收输入参数&#xff0c;执行预定义的操作&#xff0c;并返回结果。这种模式在确定性和结构化任务中非常有效&#xff0c;但在处理复杂、开放性和非结构化的任务时&#xff0c;函数的局限性就显现出来了。随…

【数据结构】kmp算法介绍+模板代码

目录 1.kmp算法介绍 2.应用场景 3.KMP与暴力算法比较 4.模板代码 KMP算法是一种高效的字符串匹配算法&#xff0c;用于在文本串中快速查找模式串的所有出现位置。其核心思想是通过预处理模式串&#xff0c;避免在匹配失败时进行不必要的回溯&#xff0c;从而将时间复杂度优…

(自用)yolo算法学习

1.难受中&#xff0c;看了教程过后无从下手啊 2.pycharm专业版成功就好 3.安装包时出先问题 (base) PS G:\pycharm\projects\yolo\yolov5> pip install opencv-python>4.1.1 Requirement already satisfied: opencv-python>4.1.1 in g:\anaconda\app\lib\site-packa…