如何将自己的私有数据搭建一个专属的问答系统,例如企业的客服机器人、企业的内部文档等知识库,今天我们就用python结合chatgpt来打造一个专属私有知识库问答系统,效果如下:
步骤讲解如下:
首先,需要安装python环境及几个Python库:
pip install llama-indexpip install langchainpip install gradiopip install openaipip install PyPDF2
如果安装过程中出现错误,请根据错误信息安装相应的缺失库,可能是由于网络问题导致安装失败,或缺少自带库。
新建一个目录,在此目录下新建一个python脚本文件叫app.py,代码如下:
from llama_index import SimpleDirectoryReader, LangchainEmbedding, GPTListIndex,GPTSimpleVectorIndex, PromptHelper, LLMPredictor, ServiceContext from langchain import OpenAI import gradio as gr import sys import os os.environ["OPENAI_API_KEY"] = 'openaikey' def construct_index(directory_path): #max_input_size = 4096 num_outputs = 2000 #max_chunk_overlap = 20 #chunk_size_limit = 600 #prompt_helper = PromptHelper(max_input_size, num_outputs, max_chunk_overlap, chunk_size_limit=chunk_size_limit) llm_predictor = LLMPredictor(llm=OpenAI(temperature=0.7, model_name="gpt-3.5-turbo", max_tokens=num_outputs)) documents = SimpleDirectoryReader(directory_path).load_data() service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor) index = GPTSimpleVectorIndex.from_documents(documents,service_context=service_context) index.save_to_disk('index3.json') return index def chatbot(input_text): index = GPTSimpleVectorIndex.load_from_disk('index.json') response = index.query(input_text, response_mode="compact") return response.response iface = gr.Interface(fn=chatbot, inputs=gr.inputs.Textbox(lines=7, label="输入您的文本"), outputs="text", title="AI 知识库聊天机器人") if os.path.exists("index3.json"): print("所以存在,无需重新索引!") else: index = construct_index("docs") iface.launch(share=True)
这段代码的主要功能是:
1. 构建一个知识图谱索引,通过读取docs文件夹下的文档。它使用GPT模型来构建这个索引。2. 定义了一个chatbot函数,可以传入文本,并利用步骤1构建的索引来生成响应。3. 使用gradio构建了一个web界面,可以让用户输入文本,并显示chatbot函数生成的响应。4. 调用construct_index函数构建索引,并启动web界面。
代码中填写你的open ai API密钥,这个可以去官网申请
同时,在项目文件夹下创建docs子文件夹,用于存储需要训练的文本,这里面就可以放一下你自己的私有文件,支持pdf、word、TXT、md等文本文件。
将你的知识库以md格式、txt格式或pdf格式放入docs文件夹。
目录如下
一切准备完成后,使用cmd命令运行,输入python app.py。
运行时间根据计算机性能和训练文本量不同。运行完成后,会有一个本地域名,在浏览器中打开,输入下面的网址:
要关闭运行,在终端输入ctrl+c。
如果有新增的文档,可以重新生成索引,但是消耗tokens,建议进行增量索引,index.extend()
示例代码
from llama_index import GPTSimpleVectorIndex # 加载已有索引 index = GPTSimpleVectorIndex.load("index.pkl") # 读取新文档 new_docs = [] for file in os.listdir("new_docs"): with open(os.path.join("new_docs", file), "r") as f: new_docs.append(f.read()) # 扩展索引 index.extend(new_docs) # 保存索引 index.save("index.pkl")
网友评论0