当前位置: 首页 > news >正文

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

本文在笔者之前研发的大模型智能文档问答项目中,开发更进一步,支持多种类型文档和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, SeleniumURLLoaderfrom utils.logger import loggerclass FileParser(object):def __init__(self, file_path):self.file_path = file_pathdef txt_loader(self):documents = TextLoader(self.file_path, encoding='utf-8').load()return documentsdef pdf_loader(self):loader = PyPDFLoader(self.file_path)documents = loader.load_and_split()return documentsdef docx_loader(self):loader = Docx2txtLoader(self.file_path)documents = loader.load()return documentsdef url_loader(self):loader = SeleniumURLLoader(urls=[self.file_path])documents = loader.load()return documentsdef 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

相关文章:

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

本文在笔者之前研发的大模型智能文档问答项目中,开发更进一步,支持多种类型文档和URL链接,支持多种大模型接入,且使用更方便、高效。 项目介绍 在文章NLP(六十一)使用Baichuan-13B-Chat模型构建智能文档中…...

如何使用SQL系列 之 如何在MySQL中使用索引

引言 关系数据库可用于处理任何大小的数据,包括包含数百万行的大型数据库。结构化查询语言(SQL)提供了一种基于特定条件在数据库表中查找特定行的简洁而直接的方法。随着数据库变得越来越大,在其中找到特定的行变得越来越困难,就像大海捞针一…...

数字孪生相关政策梳理,重点对各行业版块的指导和引领

前言 数字孪生技术作为新型智慧城市建设的创新引领性技术,有利于打造孪生城市运行空间,强化城市大脑基础能力,实现全域时空数据融合。数字孪生技术在推动智慧城市建设方面的作用已越来越受到重视。2021年3月,《国家“十四五”规划…...

nios里面打开eclipse遇到Unresolved inclusion: “system.h“等问题

问题:在Nios中打开软核部分代码时,遇到一堆Unresolved inclusion: "system.h"等问题报错 原因:bsp文件和软核没关联,导致找不到头文件地址,关联一下就好 解决步骤: 右键bsp文件,点击…...

C#,数值计算——伽马微分(Gammadev)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Gammadev : Normaldev { private double alph { get; set; } private double oalph { get; set; } private double bet { get; set; } private double a1 { g…...

【UE5 智慧城市系列】5-通过鼠标键盘控制摄像机

目标 通过鼠标WASD键控制摄像机前后左右移动,鼠标滚轮控制弹簧臂长度的修改,鼠标中键控制摄像机旋转。 步骤 1. 首先创建一个游戏模式,这里命名为“BP_GameMode” 2. 再创建一个玩家控制器,这里命名为“BP_PlayerController” …...

工作纪实38-ES分页数据问题

之前分页查询有接ES,随着系统使用时间数据量不断增加,会有如下报错。关键信息就是 Result window is too large, from size must be less than or equal to: [10000] but was [100001] 当索引非常非常大(千万或亿),是无法按照from size做深…...

设计模式之访问器模式(Visitor)的C++实现

1、访问器模式的提出 在软件开发过程中,早已发布的软件版本,由于需求的变化,需要给某个类层次结构增加新的方法。如果在该基类和子类中都添加新的行为方法,将给代码原有的结构带来破坏,同时,也违反了修改封…...

Python之OS模块

os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;即os模块提供了非常丰富的方法用来处理文件和目录。 使用的时候需要导入该模块:import os...

vue 使用canvas 详细教程

Vue.js 中使用 Canvas Vue.js 是一个流行的 JavaScript 框架,用于构建用户界面。它提供了一种简洁的方式来管理和渲染数据,同时也支持与其他库和工具的集成。要在 Vue.js 中使用 Canvas,您可以按照以下步骤进行操作: 在 Vue.js …...

Git 基本操作【本地仓库与远程仓库的推送、克隆和拉取】

文章目录 一、Git简介二、Git的下载安装三、Git常规命令四、新建本地仓库五、本地分支操作六、Git远程仓库七、远程仓库克隆、抓取和拉取八、总结九、学习交流 一、Git简介 Git是分布式版本控制系统(Distributed Version Control System,简称 DVCS&…...

FPGA开发

https://www.enclustra.com.cn/?bd_vid11435475462206745180 https://www.monolithicpower.cn/design-tools/design-tools/llc-design-tool.html https://www.elecfans.com/article/88/143/2012/20120718280641_2.html...

js手撕代码

1、实现instanceof运算符 instanceof运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上,运算符左侧是实例对象,右侧是构造函数。 const isInstanceof function(left,right){let proto Object.getPrototypeOf(left);while(true…...

typecho反序列化

typecho反序列化 环境的搭建 漏洞复现前提 <?php class Typecho_Feed {const RSS1 RSS 1.0;const RSS2 RSS 2.0;const ATOM1 ATOM 1.0;const DATE_RFC822 r;const DATE_W3CDTF c;const EOL "\n";private $_type;private $_items;public function __const…...

php程序设计的基本原则

单一职责原则&#xff08;SRP&#xff09;&#xff1a;一个类应该只有一个原因引起变化&#xff0c;即一个类应该只负责一项职责。 class User {private $name;private $email;public function __construct($name, $email) {$this->name $name;$this->email $email;}p…...

python execute() 使用%s 拼接sql 避免sql注入攻击 好于.format

1 execute(参数一:sql 语句) # 锁定当前查询结果行 cursor.execute("SELECT high, low, vol FROM table_name WHERE symbol %s FOR UPDATE;"% (symbol,)) 2 .format() cursor.execute("SELECT high, low, vol FROM table_name WHERE symbol {} FOR UPDATE;…...

RPC项目解析(1)

分布式通信框架&#xff1a;让远程方法调用和调用进程内方法一样简单 RPC通信原理 rpc&#xff1a;远程过程调用&#xff08;远程能够调用其他模块的方法&#xff09; 在rpc中需要发送时候&#xff0c;对发送的信息进行序列化&#xff0c;在服务端对接收到的信息进行反序列化…...

点云从入门到精通技术详解100篇-基于 RGB 图像与点云融合的三维点云分割算法及成像系统

目录 前言 相机和激光雷达标定研究现状 点云分割算法研究现状...

JDK8新特性

Lembda表达式 lembda表达式是一个简洁、可传递的匿名函数,实现了把代码块赋值给一个变量的功能 是我认为jdk1.8中最让人眼前一亮的特性&#xff08;我没用过其他函数式的语言&#xff09; 在了解表达式之前&#xff0c;我们先看两个概念 函数式接口 含有且仅含有一个抽象方法&…...

X86_64函数调用汇编程序分(2)

X86_64函数调用汇编程序分&#xff08;2&#xff09; 1 X86_64寄存器使用标准2 leaveq和retq指令2.1 leaveq2.2 retq 3 执行leaveq和retq之后栈的结构3.1 执行leaveq之后栈的结构3.1.1 test_fun_b函数执行leaveq之前的栈结构示意图3.1.2 test_fun_b函数执行leaveq之后的栈结构示…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...