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

devtools/2025/3/29 3:19:38/

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.ppmy.cn/devtools/169135.html

相关文章

【GPT入门】第25课 掌握 LangChain:链式调用的奥秘、特性与使用示例

【GPT入门】第25课 掌握 LangChain&#xff1a;链式调用的奥秘、特性与使用示例 语法解释各部分性质链式调用的性质调用方式注意事项 语法解释 你给出的代码 is_duplicated_chain (check_duplicated | model | parser) 运用了 LangChain 里的链式调用语法。在 LangChain 中&a…

算法2--两数相加

题目描述 解题思路 题目说的很详细了&#xff0c;也就是把每个数倒序写成链表进行输入&#xff0c;然后让你计算两个倒序数组的和&#xff0c;要保证跟预期的结果一样。 首先应该考虑的是两个数组的长度问题&#xff0c;对于链表的每一位进行加法运算&#xff0c;如果两个列表…

Java IO流汇总

Java IO&#xff08;输入/输出&#xff09;流用于处理数据的输入与输出。在Java中&#xff0c;IO流主要分为字节流和字符流&#xff0c;它们又可进一步细分为输入流和输出流。 1. IO流的分类 Java IO流的主要类别如下&#xff1a; 1.1 按数据单位分类 字节流&#xff08;Str…

KNN算法

一、KNN算法介绍 KNN 算法&#xff0c;也称 k邻近算法&#xff0c;是 有监督学习 中的 分类算法 。它可以用于分类或回归问题&#xff0c;但它通常用作分类算法。 二、KNN算法流程 1.计算已知类别数据集中的点与当前点的距离 2.按照距离增次序排序 3.选取与当前点距离最小…

MyBatis注解方式:从CRUD到数据映射的全面解析

目录 1. MyBatis是什么&#xff1f;2.准备工作2.1创建工程2.2 数据准备2.3 持久层代码2.4 单元测试 3.Mybatis的增删改查操作&#xff08;使用注解方式&#xff09;3.1 增&#xff08;insert&#xff09;3.2 删&#xff08;delete&#xff09;3.3 改&#xff08;update&#xf…

Pycharm接入DeepSeek,提升自动化脚本的写作效率

一.效果展示&#xff1a; 二.实施步骤&#xff1a; 1.DeepSeek官网创建API key&#xff1a; 创建成功后&#xff0c;会生成一个API key&#xff1a; 2. PyCharm工具&#xff0c;打开文件->设置->插件&#xff0c;搜索“Continue”&#xff0c;点击安装 3.安装完成后&…

Excel(函数进阶篇):FILTER函数全解读、XLOOKUP函数全解读、UNIQUE函数、数组与数组公式

目录 数组与数组函数office365中VLOOKUP函数的加强数组中的多条件判断FILTER函数详解用法概述函数语法 基础筛选多条件筛选进阶技巧结合动态数组 高级函数整合错误处理注意事项FILTER经典问题&#xff1a;一对多查询 XLOOKUP函数XLOOKUP基础用法XLOOKUP函数多条件匹配和双向查询…

Milvus WeightedRanker 对比 RRF 重排机制

省流:优先选择WeightedRanker 以rag为例,优先选择bm25全文检索,其次选择向量检索 Milvus混合搜索中的重排机制 Milvus通过hybrid_search() API启用混合搜索功能&#xff0c;结合复杂的重排策略来优化多个AnnSearchRequest实例的搜索结果。本主题涵盖了重排过程&#xff0c;…