大家好,欢迎来到我的专栏,每天共享最新AI资讯,技能演进的Ronny说
,今天是从《零开始带你入门人工智能系列》第一篇:还用什么chatpdf,让llama Index 帮你练习pdf。
llama Index是什么
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进行文档处理,敬请期待。
本文正在参加 人工智能创作者扶持方案