使用llama Index帮你训练pdf的示例详解
作者:Ronny说 发布时间:2023-07-30 23:00:33
llama Index是什么
《零开始带你入门人工智能系列》第一篇:还用什么chatpdf,让llama Index 帮你训练pdf。
LlamaIndex 是您的外部数据和 LLM 之间的一个简单、灵活的接口。它以易于使用的方式提供了以下工具:
为您现有的数据源和数据格式(API、PDF、文档、SQL 等)提供数据连接器
为您的非结构化和结构化数据提供索引,以便与 LLM 一起使用。这些索引有助于抽象出情境学习的常见样板和痛点:
以易于访问的格式存储上下文以便快速插入。
当上下文太大时处理提示限制(例如 Davinci 的 4096 个标记)。
处理文本拆分。
为用户提供查询索引(输入提示)并获得知识增强输出的界面。
为您提供全面的工具集,权衡成本和性能。
这里只是LlamaIndex应用的冰山一角,还可以挖掘更多好玩的功能
下面让我一步步来教你如何实现
第一步:安装依赖
requirements.txt
Flask==2.2.3
Flask-Cors==3.0.10
langchain==0.0.115
llama-index==0.4.30
PyPDF2==3.0.1
我们需要部署一个web服务,这里我使用了Flask,你也可以使用fastapi 或者django实现。其次我们使用llama-index作为索引进行pdf查询。
第二步:训练数据和构建索引的server
index_server.py
import os
import pickle
# 这里可以换成你自己的key,但是最好不要上传到github上
os.environ['OPENAI_API_KEY'] = ""
from multiprocessing import Lock
from multiprocessing.managers import BaseManager
from llama_index import SimpleDirectoryReader, GPTSimpleVectorIndex, Document
index = None
stored_docs = {}
lock = Lock()
# 保存index的json文件
index_name = "./index.json"
# 保存文档的pkl文件 用于保存文档的id和文本,这样客户端就可以查询到文档的列表了
pkl_name = "stored_documents.pkl"
def initialize_index():
"""初始化index,如果已经存在index,就使用已经训练好的index,否则就创建一个新的index"""
global index, stored_docs
with lock:
if os.path.exists(index_name):
"""使用已经训练好的index"""
index = GPTSimpleVectorIndex.load_from_disk(index_name)
else:
"""使用GPTSimpleVectorIndex创建一个新的index 这里是llama_index的一个bug,如果你不传入一个空的list,就会报错 """
index = GPTSimpleVectorIndex([])
index.save_to_disk(index_name)
if os.path.exists(pkl_name):
with open(pkl_name, "rb") as f:
stored_docs = pickle.load(f)
def query_index(query_text):
"""查询index 根据你查询的文本,返回一个response"""
global index
response = index.query(query_text)
return response
def insert_into_index(doc_file_path, doc_id=None):
"""将文档插入到index中,插入的文档可以是一个文件,也可以是一个字符串,
如果doc_id不为空,就使用doc_id,否则就使用文件名作为doc_id"""
global index, stored_docs
document = SimpleDirectoryReader(input_files=[doc_file_path]).load_data()[0]
if doc_id is not None:
document.doc_id = doc_id
# Keep track of stored docs -- llama_index doesn't make this easy
stored_docs[document.doc_id] = document.text[0:200] # only take the first 200 chars
with lock:
index.insert(document)
index.save_to_disk(index_name)
with open(pkl_name, "wb") as f:
pickle.dump(stored_docs, f)
return
def get_documents_list():
"""查询保存的文档列表,返回一个list"""
global stored_doc
documents_list = []
for doc_id, doc_text in stored_docs.items():
documents_list.append({"id": doc_id, "text": doc_text})
return documents_list
if __name__ == "__main__":
# 初始化index, 如果已经存在index,就使用已经训练好的index,否则就创建一个新的index
print("initializing index...")
initialize_index()
# 启动服务器,监听5602端口
manager = BaseManager(('127.0.0.1', 5602), b'123456')
# 注册使用到的函数,这样客户端就可以调用这些函数了
manager.register('query_index', query_index)
manager.register('insert_into_index', insert_into_index)
manager.register('get_documents_list', get_documents_list)
server = manager.get_server()
print("server started...")
server.serve_forever()
注意上面的OPENAI_API_KEY
需要修改为你自己的,否则执行initialize_index
函数会提示报错
最后,成功启动
$ python index_server.py
initializing index...
server started...
总结时刻
教程使用了Flask、llama-index、PyPDF2等库,通过搭建web服务,使用llama-index作为索引,最后提供一个交互界面进行pdf的内容查询。
如果您有相关的问题需要进一步解答,欢迎提问!有需要的赶紧转发给你的好友吧
今天的内容就到这里了,下期我们继续完善这个项目,提供一个Flask服务,然后可以支持接口调用,还会做一个简单的ui进行文档处理,敬请期待。
来源:https://juejin.cn/post/7213544005601787964


猜你喜欢
- 接下来,我们将实现微信朋友圈的爬取。如果直接用 Charles 或 mitmproxy 来监听微信朋友圈的接口数据,这是无法实现爬取的,因为
- python的hashlib库中提供的hexdigest返回长度32的字符串。直接通过digest返回的16字节,有不可打印字符。问题来了,
- 游戏说明:一个考验您记忆力的游戏,只要两个方块的;图案能够凑成一对,最终翻开所有的图片,那么您就获胜,计算机将自动记录您的游戏时
- MySql 8.0 对应驱动包匹配MySql 数据库更新为8.0及以上后,对应的应用程序数据库链接驱动包也要更新为8.0版本。否则会报驱动异
- 通过web框架搭建一个最简易的程序:第一步:新建一个web框架程序通过CMD进入到想要创建web程序的文件夹数据命令django-admin
- 前言前段时间看到有人问如何使用Python实现多张图片组成文字的效果?觉得还挺有意思,于是尝试做了一下,刚好赶上端午节,所以打算从网上下载1
- 安装的方式很常规,直接使用pip安装就行了。pip install fpdf将需要使用的三方模块导入进来from fpdf import F
- 本文实例总结了Python实现string字符串连接的方法。分享给大家供大家参考,具体如下:以下基于python 2.7版本,代码片段真实有
- mysql之alter表的SQL语句集合,包括增加、修改、删除字段,重命名表,添加、删除主键等。1:删除列ALTER TABLE 【表名字】
- 在本篇文章里,我们会使用一个简单的Web表单,它会列出某个目录下的一些XML文件。然后,我们会从这个目录里选择一个文件,将它发送到另一个We
- 前言在写 python 程序的时候,经常会用到引入其他文件夹里的 py 文件,要是都在同目录下直接 import 就好了,可是有的不在同一个
- 最近一直忙,我们的注册页面还是在持续优化。今天抽时间分析了下数据,依然以主注册表单为例,对表单里3个区块、9个字段做了个小小出错排行;看看哪
- 目录1、为什么使用2、空结构体的特殊性3、使用场景3.1 实现方法接收者3.2 实现集合类型3.3 实现空通道前言:在 Go 语言中,有一个
- 让我们首先考虑正方形和长方形。如果我们认为在接口方面,忽略了实现细节,方块是否是矩形的子类型?子类型的定义取决于Liskov代换原理。为了成
- USE master; Go EXEC sp_attach_db @dbname = N'数据库名', @filename1
- SQLyog是一款MySQL可视化工具,他可以将部分SQL操作通过图形化界面操作来完成,方便开发者更好的进行开发及数据库设计。在安装SQLy
- 原文地址:30 Days of Mootools 1.2 Tutorials - Day 5 - Event HandlingMooTool
- 一,十进制(decimal system)转换函数说明 1,十进制转二进制 decbin() 函数,如下实例 echo decbin(12)
- Django中提供了一个关于URL的映射的解决方案,1.客户端的浏览器发起一个url请求,Django根据URL解析,把url中的参数捕获,
- Python的import包含文件功能就跟PHP的include类似,但更确切的说应该更像是PHP中的require,因为Python里的i