NLP(六十九)智能文档问答助手升级
本文在笔者之前研发的大模型智能文档问答项目中,开发更进一步,支持多种类型文档和URL链接,支持多种大模型接入,且使用更方便、高效。
项目介绍
在文章NLP(六十一)使用Baichuan-13B-Chat模型构建智能文档中,笔者详细介绍了如何使用Baichuan-13B-Chat模型来构建智能文档问答助手。
一般,使用大模型来实现文档问答功能的流程图如下:

本次,笔者在之前的项目中更进一步,支持的功能如下:
- 支持多种格式文档(包括txt, pdf, docx)和URL链接
- 问答可视化页面
- 问答可追溯,加入高亮显示
- 单/多模型调用
- 模型效果对比
说明如下:
- 支持的文档格式由
LangChain提供,URL链接的解析由LangChain中的 selenium 和 unstructured,可支持JavaScript渲染的页面。但网页解析(或者说爬虫)是一项复杂而艰巨的任务,不可能在本项目中实现所有的网页解析。 - 可视化问答页面由Gradio模块实现
- 支持单模型或多模型调用,并且可以提供问答溯源。同时,还支持不同模型回答结果的比对,该想法来源于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中的表格不支持单元格内文本高亮,因此,我们所用它自带的高亮文本控件对问答溯源中的引用文本进行文本高亮,方便我们对回答内容在原文中的位置进行确认,避免大模型幻觉问题。
问答溯源中的文本高亮算法如下:
- 找到问答所在的引用文本列表,由ES和Milvus产生
- 对引用文本拆分成列表
- 得到与回答相似度最高的文本,相似度采用Jaccard系数
- 将相似度最高文本中与回答重合的部分,进行高亮显示

总结
本项目在之前开源的基础上,加入了更丰富的功能,包括支持多种格式文档解析和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程序设计的基本原则
单一职责原则(SRP):一个类应该只有一个原因引起变化,即一个类应该只负责一项职责。 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)
分布式通信框架:让远程方法调用和调用进程内方法一样简单 RPC通信原理 rpc:远程过程调用(远程能够调用其他模块的方法) 在rpc中需要发送时候,对发送的信息进行序列化,在服务端对接收到的信息进行反序列化…...
点云从入门到精通技术详解100篇-基于 RGB 图像与点云融合的三维点云分割算法及成像系统
目录 前言 相机和激光雷达标定研究现状 点云分割算法研究现状...
JDK8新特性
Lembda表达式 lembda表达式是一个简洁、可传递的匿名函数,实现了把代码块赋值给一个变量的功能 是我认为jdk1.8中最让人眼前一亮的特性(我没用过其他函数式的语言) 在了解表达式之前,我们先看两个概念 函数式接口 含有且仅含有一个抽象方法&…...
X86_64函数调用汇编程序分(2)
X86_64函数调用汇编程序分(2) 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之后的栈结构示…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
