NLP(六十九)智能文档问答助手升级

news2024/12/26 11:38:21

本文在笔者之前研发的大模型智能文档问答项目中,开发更进一步,支持多种类型文档和URL链接,支持多种大模型接入,且使用更方便、高效。

项目介绍

在文章NLP(六十一)使用Baichuan-13B-Chat模型构建智能文档中,笔者详细介绍了如何使用Baichuan-13B-Chat模型来构建智能文档问答助手。

一般,使用大模型来实现文档问答功能的流程图如下:

LangChain文档问答流程

本次,笔者在之前的项目中更进一步,支持的功能如下:

  • 支持多种格式文档(包括txt, pdf, docx)和URL链接
  • 问答可视化页面
  • 问答可追溯,加入高亮显示
  • 单/多模型调用
  • 模型效果对比

说明如下:

  1. 支持的文档格式由LangChain提供,URL链接的解析由LangChain中的 seleniumunstructured,可支持JavaScript渲染的页面。但网页解析(或者说爬虫)是一项复杂而艰巨的任务,不可能在本项目中实现所有的网页解析。
  2. 可视化问答页面由Gradio模块实现
  3. 支持单模型或多模型调用,并且可以提供问答溯源。同时,还支持不同模型回答结果的比对,该想法来源于OpenCompass .

在工程开发上,加入的特性(features)如下:

  • 丰富使用文档
  • 加入配置文件
  • 增加日志调用
  • ES分词器支持用户词典
  • Milvus支持初步筛选的阈值配置

本项目已开源至Github,代码实现可参考document_qa_with_llm,这里不再讲解代码细节。

支持文档格式

本项目原先只支持txt格式,现在已支持多种格式文档(包括txt, pdf, docx)和URL链接,这得益于LangChain框架中的文档加载模块,使得各种格式的文档加载变得更加统一、简洁、高效。

本项目中的文件解析脚本如下:

# -*- coding: utf-8 -*-
from langchain.document_loaders import TextLoader, PyPDFLoader, Docx2txtLoader, SeleniumURLLoader

from utils.logger import logger


class FileParser(object):
    def __init__(self, file_path):
        self.file_path = file_path

    def txt_loader(self):
        documents = TextLoader(self.file_path, encoding='utf-8').load()
        return documents

    def pdf_loader(self):
        loader = PyPDFLoader(self.file_path)
        documents = loader.load_and_split()
        return documents

    def docx_loader(self):
        loader = Docx2txtLoader(self.file_path)
        documents = loader.load()
        return documents

    def url_loader(self):
        loader = SeleniumURLLoader(urls=[self.file_path])
        documents = loader.load()
        return documents

    def parse(self):
        logger.info(f'parse file: {self.file_path}')
        if self.file_path.endswith(".txt"):
            return self.txt_loader()
        elif self.file_path.endswith(".pdf"):
            return self.pdf_loader()
        elif self.file_path.endswith(".docx"):
            return self.docx_loader()
        elif "http" in self.file_path:
            return self.url_loader()
        else:
            logger.error("unsupported document type!")
            return []


if __name__ == '__main__':
    txt_file_path = "/Users/admin/PycharmProjects/document_qa_with_llm/files/gdp.txt"
    content = FileParser(txt_file_path).parse()
    print(content)

    pdf_file_path = "/Users/admin/PycharmProjects/document_qa_with_llm/files/oppo_n3_flip.pdf"
    content = FileParser(pdf_file_path).parse()
    print(content)

    docx_file_path = "/Users/admin/PycharmProjects/document_qa_with_llm/files/haicaihua.docx"
    content = FileParser(docx_file_path).parse()
    print(content)

    url = "https://gaokao.xdf.cn/202303/12967078.html"
    url = "https://www.hntv.tv/50rd/article/1/1700396378818207745?v=1.0"
    content = FileParser(url).parse()
    print(content)

问答测试

文档上传页面如下,支持多种格式文档上传和URL解析(依赖于页面解析能力),页面较为粗糙。

文件上传页面

上传后的文件会放至files文件夹上,示例文档可在Github项目中files文件夹中参考。

  • txt文件

我们以files/dengyue.txt为例,问答如下:

你知道格里芬的职务吗?
格里芬的职务是美国宇航局局长。

格里芬发表演说时讲了什么?
根据文档知识,格里芬发表演说时讲了如下内容:他认为如果中国人愿意,2020年他们可以实现载人登月工程。此外,叶培建院士也曾发表自己的观点,认为2025年比较合适。然而,根据中国科学院编制的50年长远规划,中国要实现载人登月工程是2030年。

  • pdf文件

我们以files/oppo_n3_flip.pdf为例,回答如下:

OPPO最新款折叠屏手机叫什么?
OPPO最新款折叠屏手机是OPPO Find N3 Flip。

腾讯有发布自研的大模型吗,什么时候发布的?
是的,腾讯已经发布了自研的大语言模型,名为 “ 混元大模型 ” 。它在 2023 年腾讯全球数字生态大会上正式对外亮相。具体时间为 9 月 7 日。

  • docx文件

我们以files/haicaihua.docx为例,回答如下:

海菜花对生长环境有什么要求?
海菜花对生长环境要求极高,只能在水体洁净、透明度较高的水体中生长,被誉为水质的“试金石”。

  • URL链接

我们以https://gaokao.xdf.cn/202303/12967078.html 为例,回答如下:

电子科技大学2022年招生多少人?
电子科技大学2022年招生总计划是5030人,其中“电子科技大学”将面向全国招生3300余人,“电子科技大学(沙河校区)”将面向部分省份招生1700余人。

电子科技大学的官网?
电子科技大学的官网是:http://www.zs.uestc.edu.cn/

可视化问答

除了之前的API调用,本项目还支持可视化问答。该功能由Gradio模块实现,支持在页面上进行可视化问答,同时还支持多模型调用,支持的大模型如下:

  • Baichuan-13B-Chat: 百川智能发布的模型,现已更新至Baichuan2
  • LLAMA-2-Chinese-13b-Chat: 在LLAMA 2模型上进行微调得到的中文对话模型
  • internlm-chat-7b:上海人工智能实验室发布的书生(InternLM)对话模型

这些都是中文大模型。理论上,支持的模型由FastChat 和 部署的GPU型号、数量决定,本项目只考虑以上三种。

该页面支持多模型或单模型的问答。多模型问答时,可比较不同模型在相同的Prompt下的回答效果,作为模型评估的一种方式。

单模型问答

多模型问答

同时,该页面还支持问答溯源,可追踪文档问答得到的答案所需的引用文本和对用的数据来源。

问答溯源

问答溯源中的文本高亮

由于Gradio中的表格不支持单元格内文本高亮,因此,我们所用它自带的高亮文本控件对问答溯源中的引用文本进行文本高亮,方便我们对回答内容在原文中的位置进行确认,避免大模型幻觉问题。

问答溯源中的文本高亮算法如下:

  1. 找到问答所在的引用文本列表,由ES和Milvus产生
  2. 对引用文本拆分成列表
  3. 得到与回答相似度最高的文本,相似度采用Jaccard系数
  4. 将相似度最高文本中与回答重合的部分,进行高亮显示

问答溯源中的文本高亮

总结

本项目在之前开源的基础上,加入了更丰富的功能,包括支持多种格式文档解析和URL解析,支持问答可视化页面,支持单/多模型调用,支持多模型效果对比。

本项目已开源至Github,代码实现可参考document_qa_with_llm 。

推荐阅读

  • NLP(六十一)使用Baichuan-13B-Chat模型构建智能文档
  • Gradio入门(1)输入输出、表格、文本高亮

欢迎关注我的公众号NLP奇幻之旅,原创技术文章第一时间推送。

欢迎关注我的知识星球“自然语言处理奇幻之旅”,笔者正在努力构建自己的技术社区。

引用链接

[1] 大模型智能文档问答项目: https://github.com/percent4/document_qa_with_llm
[2] OpenCompass: https://opencompass.org.cn/
[3] document_qa_with_llm: https://github.com/percent4/document_qa_with_llm
[4] 文档加载模块: https://python.langchain.com/docs/integrations/document_loaders/
[5] FastChat: https://github.com/lm-sys/FastChat
[6] document_qa_with_llm: https://github.com/percent4/document_qa_with_llm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/995315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

APP检测认证第三方检测机构

APP检测 APP检测的必要性: 软件(APP)安全属于软件领域里一个重要的子领域。在以前的单机时代,安全问题主要是操作系统容易感染病毒,单机应用程序软件安全问题并不突出。但是自从互联网普及后,软件安全问题…

文件上传漏洞第十六关

文件上传漏洞 解题 解题 首先查看一下页面情况 一如既往的是上传图片文件,这里提示我们本题对上传的图片重新进行了渲染。也就是说,我们这里上传的图片将会被打乱重组,那么如果还是将一句话木马和图片拼接,然后上传的话&#xf…

2023.9.6 Redis 的基本介绍

目录 Redis 的介绍 Redis 用作缓存和存储 session 信息 Redis 用作数据库 消息队列 消息队列是什么? Redis 用作消息队列 Redis 的介绍 特点: 内存中存储数据:奠定了 Redis 进行访问和存储时的快可编程性:支持使用 Lua 编写脚…

Flink CDC 菜鸟教程 -环境篇

本教程将介绍如何使用 Flink CDC 来实现这个需求, 在 Flink SQL CLI 中进行,只涉及 SQL,无需一行 Java/Scala 代码,也无需安装 IDE。 系统的整体架构如下图所示: 环境篇 1、 准备一台Linux 2、准备教程所需要的组件 下载 flink-1.13.2 并将其解压至目录 flink-1.13.2 …

MAC安装JDK8

说明 mac版本:MacBook Pro Intel mac系统:macOS Ventura 13.5.1 开始我试着用linux版本的jdk,通过解压的方式安装jdk(先解压然后配置环境变量,类似linux安装步骤),但是有各种问题。比如修改环境…

价值10万的最强爽文短剧合集 短剧素材300多部

这是一个包含300多部短剧视频素材的集合,旨在为您的视频创作项目提供尽可能丰富和多样的选项。这些素材涵盖了各种类型和风格,包括但不限于喜剧、悲剧、惊悚、浪漫和冒险等,以满足您的多样化创作需求。 每部短剧视频素材都经过精心挑选和处理…

springboot集成Actuator+Prometheus+Grafana

一、环境准备 PrometheusGrafana环境准备 请参考我的博文&#xff1a;https://blog.csdn.net/luckywuxn/article/details/129475991 二、代码准备 我在本次实践中使用的springboot版本是2.6.13,然后在pom.xml文件中增加一下配置 <dependency><groupId>org.sprin…

【实训项目】基于JavaWeb的图书销售购物系统

1.引言 随着互联网的快速发展和普及&#xff0c;电子商务已经成为了人们购物的主要方式之一。在电子商务领域中&#xff0c;图书销售一直是一个重要的组成部分。随着人们对知识和阅读的需求不断增长&#xff0c;图书销售市场也呈现出蓬勃发展的态势。 传统的图书销售模式存在…

速学Linux丨一文带你打开Linux学习之门

前言 如果你是刚开始学习Linux的小白同学&#xff0c;相信你已经体会到与学习一门编程语言相比&#xff0c;学习Linux系统的门槛相对较高&#xff0c;你会遇到一些困惑&#xff0c;比如&#xff1a; 为什么要学习Linux&#xff0c;学成之后我们可以在哪些领域大显身手&#xf…

GitHubGiteeGitlab极狐(JihuLab)同时配置SSH公私钥详细过程

GitHub-微软-github.com Gitee-开源中国- gitee.com Gitlab-乌克兰GitLab 公司-gitlab.com 极狐(JihuLab)-中国代理商运营的Gitlab -gitlab.cn或者jihulab.com 使用SSH公钥可以让你在你的电脑和GitHub等平台通讯的时候使用更安全的连接&#xff08;Git的Remote要使用SSH地址&a…

第6篇 vue的打包工具webpack

一 webpack 1.1 webpack的作用 webpack是一个打包工具&#xff0c;可以把多个静态资源文件打包成一个文件。如图所示&#xff1a; 1.2 webpack的打包案例

游戏开发入门——CocosCreator实现

课程介绍 课前介绍 为什么要开这门课&#xff1f; 其实市面上已经有很多关于游戏开发的课程了&#xff0c;而且都各有千秋。但是。 目前市面上的编程课很多标榜的零基础&#xff0c;但是很多名词都没有做相应的解释。我觉得对于初学者来说&#xff0c;可能还是有些难度。课…

Sketch for mac v98.2最新版 修复了打开某些文档时导致 Sketch 崩溃的错误

Sketch是一款专为Mac操作系统设计的矢量图形编辑软件&#xff0c;被广泛应用于UI/UX设计、网页设计、移动应用设计等领域。Sketch提供了各种工具和功能&#xff0c;包括绘图、图形设计、排版等&#xff0c;可以帮助设计师轻松地创建高质量的矢量图形和模型。 Sketch for mac更…

Go for循环中的defer

背景 写个后台程序&#xff0c;定时抓取服务器指标&#xff0c;代码逻辑如下&#xff0c;使用一段时间后内存不断增加 func CollectInfo() {for {// 获取服务器信息代码// ...............resp, err : http.Post("http://server", "application/json", str…

buuctf crypto 【RSAROLL】解题记录

1.打开文件&#xff0c;发现数据 2.rsa算法中的n&#xff0c;e&#xff0c;多个c都已经给出&#xff0c;写出脚本计算出每个c对应的m值转换成字符即可 3.运行得到flag

哈希切割 及 海量数据处理面试题讲解

文章目录 哈希切割及海量数据处理面试题讲解问题1问题2 哈希切割及海量数据处理面试题讲解 问题1 给两个文件&#xff0c;分别有100亿个query字符串&#xff0c;我们只有1G内存&#xff0c;如何找到两个文件交集&#xff1f;分别给出精确算法和近似算法 近似算法&#xff1a…

PL2303串口不支持WINDOWS11解决方法

1.打开设置管理器--端口选择不支持的串口--右击--选择卸载驱动--刷新 即可使用 2.禁用驱动更新:保存下面为 "disable_win11_update_driver.reg", 双击加入注册表 Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\W…

【商业知识】中国消费者洞察

文章目录 一、市场: 中国消费市场已进入复苏期二、政策: 政策不断优化消费环境三、社会: 消费者逐步步入正确消费时代四、品牌: 科普专业知识&#xff0c;加深消费者对技术力的感知五、电商直播: 提供源头优质产品&#xff0c;提高生活质量六、信息平台: 科学消费和内容营销&am…

【Java Web】Kafka,构建TB级异步消息系统

1. 阻塞队列 BlockingQueue 解决线程通信的问题&#xff1b;阻塞方法&#xff1a;put从队列中存一个 &#xff0c; take 从队列中拿出一个 生产者消费者模式 生产者&#xff1a;产生数据的线程&#xff1b;消费者&#xff1a;使用数据的线程。 实现类 ArrayBlockingQueueLinke…

pyqt5调用摄像头

pyqt5调用摄像头 1、UI布局 2、代码 # !/usr/bin/python # -*- coding: utf-8 -*-""" contact: 微信 1257309054 file: t.py time: 2023/9/10 0:16 author: LDC """import sysimport cv2 from PyQt5 import QtCore from PyQt5 import QtWidget…