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解析其中内容以解惑。

相关推荐
白手小弟21 分钟前
docker部署Stirling-PDF
docker·容器·pdf
咔咔学姐kk37 分钟前
2024最新版,人大赵鑫老师《大语言模型》新书pdf分享
数据库·人工智能·语言模型·自然语言处理·pdf·知识图谱·产品经理
zhang-ge41 分钟前
python提取pdf表格到excel:拆分、提取、合并
python·pdf·excel
AIBox3651 小时前
GPT撰写开题报告教程——课题确定及文献调研
人工智能·chatgpt
aiwisland4 小时前
亲测好用,ChatGPT 3.5/4.0新手使用手册~
人工智能·ai·语言模型·chatgpt·ai编程·ai写作
Funhpc_huachen10 小时前
AI对未来教育领域的改变!如何使用ChatGPT,一个高效提问的指令构建模型,通过ChatGPT有效提高学习效率
人工智能·学习·chatgpt
忧郁的蛋~10 小时前
asp.net core调用wps实现word转pdf的方法
pdf·word·wps
洛阳泰山16 小时前
Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用增强扩展(text2sql)
数据库·python·langchain·交互·通义千问·postgres·chainlit
小和尚敲代码18 小时前
word文档无损原样转pdf在windows平台使用python调用win32com使用pip安装pywin32
windows·python·pdf
小言从不摸鱼19 小时前
【AI大模型】ChatGPT模型原理介绍(上)
人工智能·python·深度学习·机器学习·chatgpt