langchain入门系列之六 使用langchain构建PDF解析助手

本文将介绍如何使用langchain构建一个pdf解析助手,在此文中你将学习到langchain如何与web应用(fastapi)相结合,向量持久化等知识,话不多说,现在开始。

安装环境

bash 复制代码
pip install fastapi
pip install python-dotenv 
pip install uvicorn

直接在pycharm新建一个fastapi项目也可!
python-dotenv 管理环境变量,我们会将llm的一些相关变量放在其中。

新建一个.env文件

bash 复制代码
touch .env
-------------------
在.env 文件中放入千帆相关参数:
QIANFAN_AK = "your key"
QIANFAN_SK = "your secret key"

项目结构图:

新建一个langchain文件
python3 复制代码
from langchain.document_loaders import PyPDFLoader
from langchain.vectorstores import Chroma
from langchain.embeddings import QianfanEmbeddingsEndpoint
from langchain.text_splitter import RecursiveCharacterTextSplitter
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
# 创建embedding模型
embeddings_model = QianfanEmbeddingsEndpoint()
embedding = QianfanEmbeddingsEndpoint()
persist_directory = f'本地持久化路径'

# 解析pdf并保存到本地向量数据库中
def save_pdf(file_path, file_name):
    loader = PyPDFLoader(file_path)
    # 分割
    text_spliter = RecursiveCharacterTextSplitter(
        chunk_size=200,
        chunk_overlap=5,  # 每个块之间的重叠长度
        length_function=len,
    )
    pages = loader.load_and_split(text_spliter)
    persist_path = persist_directory + file_name
    # 持久化到本地
    Chroma.from_documents(
        documents=pages,
        embedding=embedding,
        persist_directory=persist_path
        )

# 加载向量索引
def load_index(file_name):
    persist_path = persist_directory + file_name
    print(persist_path)
    index = Chroma(persist_directory=persist_path, embedding_function=embedding)
    return index

# 在向量中查询
def query(index, question):
    idx = load_index(index)
    return len(idx.similarity_search(question))

这个文件我们主要用来解析和保存pdf文件,其中query用来查询pdf文件内容有多少与查询内容相关的内容个数,你也可以调用parse相关函数解析成str或list返回。

fastapi上传pdf文件接口
python 复制代码
import logging
import os
from pydantic import BaseModel
from fastapi import FastAPI
from typing import Annotated
from fastapi import File, Form, UploadFile
from langchain_helper import save_pdf, query

@app.post("/upload")
async def upload_file(
        file: Annotated[UploadFile, File()],
        index_name: Annotated[str, Form()]
):
    file_upload_target_path = os.path.join(os.getcwd(), file.filename)
    with open(file_upload_target_path, "wb+") as f:
        f.write(file.file.read())
    save_pdf(file_upload_target_path, index_name)
    return {"message": f"File uploaded successfully", "file_name": file.filename, "index_name": index_name}

这个接口就是上传pdf,并调用我们上面写的解析和保存pdf的方法,完成pdf的向量持久化。

接口调用成功,成功上传pdf并保存

fastapi查询接口
python 复制代码
class Query(BaseModel):
    index_name: str
    query_question: str

@app.post("/search")
def query_index(request: Query):
    logging.info("--------------------------------------")
    index_name = request.index_name
    query_question = request.query_question
    logging.info(f"index_name: {index_name}, question: {query_question}")
    return query(index_name, query_question)

这里的index_name与上一个上传接口的index_name相同!

调用成功,成功返回内容!

以上就是langchain解析pdf保存在本地,通过web 接口查询相关内容,这是一个很简单的示例,希望能够做到抛砖引玉,通过以前的文章,在此基础上,我们可以使用langchain玩出更多花活,比如我们在查找书中某些内容的时候,同时让langchain解析其中内容以解惑。

相关推荐
一个处女座的程序猿2 小时前
LLMs之PDF:zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略
pdf·markdown·zerox
Dxy12393102162 小时前
python下载pdf
数据库·python·pdf
周亚鑫2 小时前
vue3 pdf base64转成文件流打开
前端·javascript·pdf
一名技术极客3 小时前
Vue2 doc、excel、pdf、ppt、txt、图片以及视频等在线预览
pdf·powerpoint·excel·文件在线预览
爱技术的小伙子6 小时前
【ChatGPT】如何通过逐步提示提高ChatGPT的细节描写
人工智能·chatgpt
johnny2336 小时前
《大模型应用开发极简入门》笔记
笔记·chatgpt
S. Dylan17 小时前
Edge浏览器打开PDF无法显示电子签章
edge·pdf
一马平川的大草原17 小时前
如何基于pdf2image实现pdf批量转换为图片
计算机视觉·pdf·文件拆分
m0_5945263017 小时前
Python批量合并多个PDF
java·python·pdf
hairenjing112317 小时前
将图片添加到 PDF 的 5 种方法
pdf