Giter VIP home page Giter VIP logo

chatdoc-tpu's Introduction

ChatDoc-TPU

这个项目是基于 Sophgo TPU 实现的文档对话工具。项目可在 BM1684X 上独立部署运行。

介绍

该项目的主要目标是通过使用自然语言来简化与文档的交互,并提取有价值的信息。此项目使用LangChain、ChatGLM3-TPUQWEN-TPU构建,以向用户提供流畅自然的对话体验。

以 ChatGPT 为例(可替换为其他LLM,本仓库已支持 Chatglm3-6B 和 Qwen-7B,需要保证接口一致),本地知识库问答流程如下: Flow

特点

  • 完全本地推理。
  • 支持多种文档格式PDF, DOCX, TXT。
  • 与文档内容进行聊天,提出问题根据文档获得相关答案。
  • 用户友好的界面,确保流畅的交互。

安装

按照以下步骤,可以将这个项目部署到SophGo的设备上

安装第三方库

cd ChatDoc-TPU
# 考虑到 langchain 和 sail 版本依赖,推荐在 python>=3.8 环境运行
pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

安装sail

此例程依赖新版本sail,旧版本需要更新,安装方法请参考Sail_Install_Guide

项目结构树

|-- ChatDoc-TPU
    |-- data
        |-- db_tpu        -- 知识库持久化目录
        |-- uploaded      -- 已上传文件目录
    |-- models
        |-- bert_model    -- BERT 模型
        |-- glm3_model    -- charglm3-6B 模型
        |-- qwen_model    -- qwen-7B 模型
    |-- chat
        |-- chatbot.py    -- ChatDoc业务逻辑脚本
        |-- charglm3      -- charglm3 代码
        |-- qwen          -- qwen 代码
    |-- embedding         -- 文本嵌入模型
    |-- docs              -- 环境安装文档
    |-- static            -- README中图片文件
    |-- README.md         -- README
    |-- config.ini        -- 推理模型配置文件
    |-- requirements.txt  -- 项目依赖
    |-- run.sh            -- 启动脚本
    |-- web_demo_st.py    -- 页面交互脚本

启动

回到ChatDoc-TPU主目录,启动程序,模型和配置文件自动下载,使用默认路径

Model Cmd
ChatGLM3-6B ./run.sh --model chatglm3 --dev_id 0
Qwen-7B ./run.sh --model qwen --dev_id 0
usage: ./run.sh [--model MODEL]  [--dev_id DEV_ID] [--server_address SERVER_ADDRESS] [--server_port SERVER_PORT]
--model: 选择模型,可选项为 chatglm3/qwen。默认为 "chatglm3"。
--dev_id: 用于推理的 TPU 设备 ID。默认为 0。
--server_address: web server 地址。默认为 "0.0.0.0"。
--server_port:web sever 端口。如不设置,从 8501 起自动分配。

启动后您可以通过浏览器打开,URL: http://{host_ip}:8501,host_ip为启动ChatDoc的设备IP,或者您通过参数设置的server_address

说明

  1. config.ini 中可修改模型路径,默认使用int4模型
  2. dev_id 需设置为 BM1684X 设备id
  3. 默认使用 2k seq_len 模型,如果需要其他参数的模型,可参考ChatGLM3模型导出与编译Qwen模型导出与编译
  4. embedding 模型默认使用 shibing624/text2vec-bge-large-chinese,导出模型方法可参考 export_onnx.py

操作说明

UI

界面简介

ChatDoc由控制区和聊天对话区组成。控制区用于管理文档和知识库,聊天对话区用于输入和接受消息。

上图中的10号区域是 ChatDoc 当前选中的文档。若10号区域为空,即 ChatDoc 没有选中任何文档,仍在聊天对话区与 ChatDoc 对话,则此时的 ChatDoc 是一个单纯依托 LLM 的 ChatBot。

上传文档

点击1选择要上传的文档,然后点击按钮4构建知识库。随后将embedding文档,完成后将被选中,并显示在10号区域,接着就可开始对话。我们可重复上传文档,embedding成功的文档均会进入10号区域。

持久化知识库

10号区域选中的文档在用户刷新或者关闭页面时,将会清空。若用户需要保存这些已经embedding的文档,可以选择持久化知识库,下次进入时无需embedding计算即可加载知识库。具体做法是,在10号区域不为空的情况下,点击按钮5即可持久化知识库,知识库的名称是所有文档名称以逗号连接而成。

导入知识库

用户可以从选择框2查看目前已持久化的知识库。选中我们需要加载的知识库后,点击按钮3导入知识库。完成后即可开始对话。注意cpu版的知识库和tpu版的知识库不能混用,若启动tpu版程序,则不能加载已持久化的cpu版知识库;若启动cpu版程序,则不能加载已持久化的tpu版知识库。

删除知识库

当用户需要删除本地已经持久化的知识库时,可从选择框2选择要删除的知识库,然后点击按钮6删除知识库。

重命名知识库

Rename

由于知识库的命名是由其文档的名称组合而来,难免造成知识库名称过长的问题。ChatDoc提供了一个修改知识库名称的功能,选择框2选择我们要修改的知识库,然后点击按钮9重命名知识库,随后ChatDoc将弹出一个输入框和一个确认按钮,如上图。在输出框输入修改后的名称,然后点击确认重命名按钮。

清除聊天记录

点击按钮7即可清除聊天对话区聊天记录。其他不受影响。

移除选中文档

点击按钮8将清空10号区域,同时清除聊天记录。

chatdoc-tpu's People

Contributors

wangyifan2018 avatar 24octopus avatar

Stargazers

 avatar  avatar Zeus avatar  avatar  avatar Yongchao Xu avatar  avatar  avatar Bai Feng avatar

Watchers

 avatar

chatdoc-tpu's Issues

ImportError: libGL.so.1: cannot open shared object file: No such file or directory

代码版本和硬件参考 #3

上传一个 word 文档

出现右侧的错误

screenshot_20240710065506

File "/home/linaro/.local/lib/python3.8/site-packages/streamlit/runtime/scriptrunner/script_runner.py", line 552, in _run_script
    exec(code, module.__dict__)
File "/data/ChatDoc-TPU/web_demo_st.py", line 127, in <module>
    if chatbot_st.init_vector_db_from_documents(files_name):
File "/data/ChatDoc-TPU/chat/chatbot.py", line 84, in init_vector_db_from_documents
    doc = kb_file.docs2texts()
File "/data/ChatDoc-TPU/doc_processor/knowledge_file.py", line 247, in docs2texts
    docs = docs or self.file2docs(refresh=refresh)
File "/data/ChatDoc-TPU/doc_processor/knowledge_file.py", line 235, in file2docs
    self.docs = loader.load()
File "/home/linaro/.local/lib/python3.8/site-packages/langchain/document_loaders/unstructured.py", line 71, in load
    elements = self._get_elements()
File "/data/ChatDoc-TPU/doc_processor/document_loaders/mydocloader.py", line 63, in _get_elements
    text = doc2text(self.file_path)
File "/data/ChatDoc-TPU/doc_processor/document_loaders/mydocloader.py", line 17, in doc2text
    from rapidocr_onnxruntime import RapidOCR
File "/home/linaro/.local/lib/python3.8/site-packages/rapidocr_onnxruntime/__init__.py", line 4, in <module>
    from .main import RapidOCR
File "/home/linaro/.local/lib/python3.8/site-packages/rapidocr_onnxruntime/main.py", line 9, in <module>
    import cv2
File "/home/linaro/.local/lib/python3.8/site-packages/cv2/__init__.py", line 181, in <module>
    bootstrap()
File "/home/linaro/.local/lib/python3.8/site-packages/cv2/__init__.py", line 153, in bootstrap
    native_module = importlib.import_module("cv2")
File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)

使用 chatglm3 得到错误的答案,海口有几个机场

上传知识库文件
doc-sample-preprocessing.docx

其中文本内容为:

海口有海口美兰国际机场,位于海口市美兰区,航线飞往国内大中城市,也有飞往国际的专机。从海口去美兰国际机场,除了地铁快速到达外,有绕城高速直达,还有琼文高速和223国道,交通非常便利。海南有三个民用机场:海口美兰国际机场、三亚凤凰国际机场和琼海博鳌机场。

由上文可知:
1)海口有一个机场:美兰国际机场
2)海南有三个机场:海口美兰国际机场、三亚凤凰国际机场和琼海博鳌机场

将该文件上传,生成知识库,然后进行提问:

screenshot_20240710074455

该模型生成的回答是错误的,将海口等同于海南,进行了回答。
正确的回答应该是:
海口有一个机场,海口美兰国际机场。

TypeError: partition() got an unexpected keyword argument 'autodetect_encoding'

设备信息和代码版本,参考 #3

上传文件,点击【添加知识库】

screenshot_20240709114041

得到报错信息

2024-07-08 11:51:20.717 Uncaught app exception
Traceback (most recent call last):
  File "/home/linaro/.local/lib/python3.8/site-packages/streamlit/runtime/scriptrunner/script_runner.py", line 552, in _run_script
    exec(code, module.__dict__)
  File "/data/ChatDoc-TPU/web_demo_st.py", line 127, in <module>
    if chatbot_st.init_vector_db_from_documents(files_name):
  File "/data/ChatDoc-TPU/chat/chatbot.py", line 84, in init_vector_db_from_documents
    doc = kb_file.docs2texts()
  File "/data/ChatDoc-TPU/doc_processor/knowledge_file.py", line 247, in docs2texts
    docs = docs or self.file2docs(refresh=refresh)
  File "/data/ChatDoc-TPU/doc_processor/knowledge_file.py", line 235, in file2docs
    self.docs = loader.load()
  File "/home/linaro/.local/lib/python3.8/site-packages/langchain/document_loaders/unstructured.py", line 71, in load
    elements = self._get_elements()
  File "/home/linaro/.local/lib/python3.8/site-packages/langchain/document_loaders/unstructured.py", line 108, in _get_elements
    return partition(filename=self.file_path, **self.unstructured_kwargs)
TypeError: partition() got an unexpected keyword argument 'autodetect_encoding'

run.sh --model qwen7b 后导入知识库,得到 bm_memset_device failed, return=4

代码版本:
1559fce

硬件信息:

screenshot_20240709113147
screenshot_20240709113223

启动模型

./run.sh --model qwen7b

后台日志

[2024-07-08 11:36:41.420] [error] [tensor.cpp:599] bm_memset_device failed, return=4
[bmlib_memory][error] bm_alloc_gmem failed, dev_id = 0, size = 0x1000000
[BM_CHECK][error] BM_CHECK_RET fail /workspace/libsophon/bmlib/src/bmlib_memory.cpp: bm_malloc_device_byte_heap_mask: 707
[2024-07-08 11:36:41.473] [error] [tensor.cpp:592] bm_malloc_device_type() err=5, size=16777216
[bmlib_memory][error] bm_device_mem_range_valid saddr=0xfffffffff eaddr=0x1000ffffff out of range
[bmlib_memory][error] memset wrong memory addr 0xfffffffff
[2024-07-08 11:36:41.473] [error] [tensor.cpp:599] bm_memset_device failed, return=4
[bmlib_memory][error] bm_alloc_gmem failed, dev_id = 0, size = 0x1000000
[BM_CHECK][error] BM_CHECK_RET fail /workspace/libsophon/bmlib/src/bmlib_memory.cpp: bm_malloc_device_byte_heap_mask: 707
[2024-07-08 11:36:41.526] [error] [tensor.cpp:592] bm_malloc_device_type() err=5, size=16777216
[bmlib_memory][error] bm_device_mem_range_valid saddr=0xfffffffff eaddr=0x1000ffffff out of range
[bmlib_memory][error] memset wrong memory addr 0xfffffffff
[2024-07-08 11:36:41.526] [error] [tensor.cpp:599] bm_memset_device failed, return=4
[bmlib_memory][error] bm_alloc_gmem failed, dev_id = 0, size = 0x1000000
[BM_CHECK][error] BM_CHECK_RET fail /workspace/libsophon/bmlib/src/bmlib_memory.cpp: bm_malloc_device_byte_heap_mask: 707
[2024-07-08 11:36:41.566] [error] [tensor.cpp:592] bm_malloc_device_type() err=5, size=16777216
[bmlib_memory][error] bm_device_mem_range_valid saddr=0xfffffffff eaddr=0x1000ffffff out of range
[bmlib_memory][error] memset wrong memory addr 0xfffffffff
[2024-07-08 11:36:41.566] [error] [tensor.cpp:599] bm_memset_device failed, return=4
[bmlib_memory][error] bm_alloc_gmem failed, dev_id = 0, size = 0x1000000
[BM_CHECK][error] BM_CHECK_RET fail /workspace/libsophon/bmlib/src/bmlib_memory.cpp: bm_malloc_device_byte_heap_mask: 707
[2024-07-08 11:36:41.606] [error] [tensor.cpp:592] bm_malloc_device_type() err=5, size=16777216

screenshot_20240709112845

上传文件

上传文件,点击添加知识库。

执行过程中出现错误:

screenshot_20240709112910

screenshot_20240709112457

[bmlib_memory][error] free gmem addr 0xfffffffff is invalide!
[bmlib_memory][error] free gmem addr 0xfffffffff is invalide!
[bmlib_memory][error] free gmem addr 0xfffffffff is invalide!
[bmlib_memory][error] free gmem addr 0xfffffffff is invalide!
[bmlib_memory][error] free gmem addr 0xfffffffff is invalide!
[bmlib_memory][error] free gmem addr 0xfffffffff is invalide!
[bmlib_memory][error] free gmem addr 0xfffffffff is invalide!
[bmlib_memory][error] free gmem addr 0xfffffffff is invalide!
[bmlib_memory][error] free gmem addr 0xfffffffff is invalide!
[bmlib_memory][error] free gmem addr 0xfffffffff is invalide!
[bmlib_memory][error] free gmem addr 0xfffffffff is invalide!
[bmlib_memory][error] free gmem addr 0xfffffffff is invalide!
[bmlib_memory][error] free gmem addr 0xfffffffff is invalide!

1684X运行ChatDoc-TPU出错

image
1684X运行ChatDoc-TPU出错(已经安装官方提供的sail sophon_arm-3.7.0-py3-none-any.whl[size=1.25em])
步骤一、git clone https://github.com/wangyifan2018/ChatDoc-TPU.git下载工程
步骤二、./run.sh --model chatglm3 --dev_id 0下载大模型
步骤三、pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple安装依赖
步骤四、./run.sh --model chatglm3 --dev_id 0 运行出错。部分log显示如下
[2024-06-25 08:56:20.527] [error] [tensor.cpp:403] bm_memset_device failed, return=4
[bmlib_memory][error] bm_alloc_gmem failed, dev_id = 0, size = 0x0
[BM_CHECK][error] BM_CHECK_RET fail /workspace/libsophon/bmlib/src/bmlib_memory.cpp: bm_malloc_device_byte_heap_mask: 705
[2024-06-25 08:56:20.565] [error] [tensor.cpp:396] bm_malloc_device_type() err=5, size=0
[bmlib_memory][error] bm_device_mem_range_valid saddr=0xfffffffff eaddr=0xfffffffff out of range
[bmlib_memory][error] memset wrong memory addr 0xfffffffff
[2024-06-25 08:56:20.565] [error] [tensor.cpp:403] bm_memset_device failed, return=4
[bmlib_memory][error] bm_alloc_gmem failed, dev_id = 0, size = 0x0
[BM_CHECK][error] BM_CHECK_RET fail /workspace/libsophon/bmlib/src/bmlib_memory.cpp: bm_malloc_device_byte_heap_mask: 705
[2024-06-25 08:56:20.603] [error] [tensor.cpp:396] bm_malloc_device_type() err=5, size=0
[bmlib_memory][error] bm_device_mem_range_valid saddr=0xfffffffff eaddr=0xfffffffff out of range
[bmlib_memory][error] memset wrong memory addr 0xfffffffff
[2024-06-25 08:56:20.604] [error] [tensor.cpp:403] bm_memset_device failed, return=4
[bmlib_memory][error] bm_alloc_gmem failed, dev_id = 0, size = 0x0
[BM_CHECK][error] BM_CHECK_RET fail /workspace/libsophon/bmlib/src/bmlib_memory.cpp: bm_malloc_device_byte_heap_mask: 705
[2024-06-25 08:56:20.642] [error] [tensor.cpp:396] bm_malloc_device_type() err=5, size=0
[bmlib_memory][error] bm_device_mem_range_valid saddr=0xfffffffff eaddr=0xfffffffff out of range
[bmlib_memory][error] memset wrong memory addr 0xfffffffff
[2024-06-25 08:56:20.642] [error] [tensor.cpp:403] bm_memset_device failed, return=4
2024-06-25 08:56:20,643 - INFO - chatbot init success!
2024-06-25 08:58:00.294 Uncaught app exception
Traceback (most recent call last):
File "/usr/local/lib/python3.8/dist-packages/streamlit/runtime/scriptrunner/script_runner.py", line 552, in _run_script
exec(code, module.dict)
File "/home/linaro/ChatDoc-TPU/web_demo_st.py", line 178, in
for result_answer, _ in chatbot_st.llm.stream_predict(user_input, his):
File "/home/linaro/ChatDoc-TPU/chat/chatglm3/chatglm3.py", line 269, in stream_predict
token = self.forward_first(tokens)
File "/home/linaro/ChatDoc-TPU/chat/chatglm3/chatglm3.py", line 147, in forward_first
input_ids = np.zeros(self.SEQLEN, type_convert(self.first_embed_input["dtype"]))
File "/home/linaro/ChatDoc-TPU/chat/utils.py", line 16, in type_convert
if sail_dtype == sail.Dtype.BM_FLOAT16:
AttributeError: type object 'sophon.sail.Dtype' has no attribute 'BM_FLOAT16'
具体Log信息如下:
newlog.txt

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.