Chatglm3+langchain智能对话,本地文本库构建问答,图片文本库构建与问答搜索

news2024/11/20 16:33:21

Chatglm3+langchain

主要功能:

  • 调用语言模型
  • 将不同数据源接入到语言模型的交互中
  • 允许语言模型与运行环境交互

Langchain应用场景

**1. 文档问答:**常见的Langchain用例。在特定文档上回答问题,仅利用这些文档中的信息来构建问答答案(本次验证已实现,俗称打造自己的chatGPT问答库)。
**2. 个人助理:**主要用例之一。个人助理采取行动,记住互动,并了解您的数据。
**3. 查询表格数据:**使用语言模型查询表类型结构化数据(csv,SQL,DataFrame)
**4. 与API交互:**使用语言模型与API交互非常强大。它允许他们访问最新信息,并允许他们采取行动。
**5. 信息提取:**从文本中提取结构化数据。
**6. 文档总结:**压缩较长文档,一种数据增强生成。

Langchain中提供的关键模块

Modules: 支持的模型类型和集成。
Prompt:提示词管理、优化和序列化。
Memory:内存是只在链/代理调用之间持续存在的状态。
Indexes:当语言模型与特定于应用程序的数据相结合时,会变得更加强大-此模型包含用于加载、查询、更新外部数据的接口和集成。
Chain:链是结构化的调用序列【对LLM或其他使用程序】
Agents:代理是一个链,其中LLM在给定高级指令和一组工具的情况下,反复决定操作,执行操作并观察结果,直到高级指令完成。
Callbacks:回调允许您记录和流式传输任何链的中间步骤,从而轻松观察、调试、评估应用程序的内部。

硬件需求

在这里插入图片描述

ChatGLM3简介

ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的新一代对话预训练模型。ChatGLM3-6B 是 ChatGLM3 系列中的开源模型,ChatGLM3-6B 引入了如下特性:

  1. 更强大的基础模型: ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base
    采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。在语义、数学、推理、代码、知识等不同角度的数据集上测评显示,ChatGLM3-6B-Base
    具有在 10B 以下的基础模型中最强的性能。

  2. 更完整的功能支持: ChatGLM3-6B 采用了全新设计的 Prompt
    格式,除正常的多轮对话外。同时原生支持工具调用(Function Call)、代码执行(Code Interpreter)和 Agent
    任务等复杂场景。

  3. 更全面的开源序列: 除了对话模型 ChatGLM3-6B 外,还开源了基础模型 ChatGLM3-6B-Base、长文本对话模型ChatGLM3-6B-32K。

主要功能:

  1. 调用语言模型对话。
  2. 可以执行各种工具调用,如搜索、翻译、计算、绘图等。
  3. 支持多种语言和多种模式,如中文、英文、日文等。

推理的GPU资源要求

在这里插入图片描述

langchain数据连接组件data connection

  • 文档加载器:从许多不同的来源加载文档

  • 文档转换器:分割文档,删除多余的文档等

  • 文本嵌入模型:采取非结构化文本,并把它变成一个浮点数的列表 矢量存储:存储和搜索嵌入式数据

  • 检索器:查询你的数据

langchain-ChatGLM3 本地知识库搭建的流程

在这里插入图片描述
如上图,本地知识库搭建的流程如下:
(1-2)准备本地知识库文档目前支持 txt、docx、md、pdf 格式文件;
(3-4)对文本进行分割,将大量文本信息切分为chunks;
(5)选择一种embedding算法,对文本向量化;
(6)将知识库得到的embedding结果保存到数据库,就不用每次应用都进行前面的步骤;
(7)向量相似度计算方式;
(8-9)将问题也用同样的embedding算法,对问题向量化;
(10)从数据库中查找和问题向量最相似的N个文本信息;
(11)得到和问题相关的上下文文本信息;
(12)获取提示模板;
(13)得到输入大模型的prompt比如:问题:,通过以下信息汇总得到答案;
(14)将prompt输入到LLM得到答案;
(15)结果输出。

**总结:**过程包括加载文件 -> 读取文本 -> 文本分割 -> 文本向量化 -> 问句向量化 -> 在文本向量中匹配出与问句向量最相似的 top k个 -> 匹配出的文本作为上下文和问题一起添加到 prompt中 -> 提交给 LLM生成回答。

软件环境

主要包含以下功能模块与推荐版本

  •  确保Python 3.8 - 3.11。
    
  • pytorch 2.01,推荐2.0及以上版本。

  • CUDA 12.0,驱动525,建议使用11.4及以上版本。

  • Transformers,推荐版本4.30.2 及以上版本。

  • faiss-gpu, 推荐版本1.7.2及以上。

  • langchain,推荐版本0.1.1及以上。

  • langchain-community,推荐版本0.0.15及以上。

  • langchain-core,推荐版本0.1.15及以上。

  • langdetect,推荐版本1.0.9及以上。

  • langsmith,推荐版本0.0.83及以上。

  • prompt-toolkit,推荐版本3.0.43及以上。

  • semantic-version,推荐版本2.10.0及以上。

  • sentence-transformers,推荐版本2.2.2及以上。

  • sentencepiece,推荐版本0.1.99及以上。

  • tiktoken,推荐版本0.5.2及以上。

  • timm,推荐版本0.9.12及以上。

  • tokenizers,推荐版本0.15.0及以上。

  • typing_extensions,推荐版本4.9.0及以上。

  • unstructured,推荐版本0.11.8及以上。

  • unstructured-client,推荐版本0.15.2及以上。

  • unstructured-inference,推荐版本0.7.18及以上。

  • unstructured.pytesseract,推荐版本0.3.12及以上。

遇到错误与解决方案

该部分内容体量很大,错误很多,需自行百度与google等方式修改参数、环境与代码等解决。

难点与关键点

Split(切割文档)
因为大模型提示词有最大token限制,我们不能把太多的文档内容传给AI,通常是把相关的文档片段传过去就行,所以这里需要对文档切片处理。
Langchain虽然提供了很多文本切割的工具,其中langchain默认使用RecursiveCharacterTextSplitter。

  • RecursiveCharacterTextSplitter():按字符串分割文本,递归地尝试按不同的分隔符进行分割文本。
  • CharacterTextSplitter():按字符来分割文本。
  • MarkdownHeaderTextSplitter():基于指定的标题来分割markdown 文件。
  • TokenTextSplitter():按token来分割文本。
  • SentenceTransformersTokenTextSplitter() : 按token来分割文本
  • Language() - 用于 CPP、Python、Ruby、Markdown 等。
  • NLTKTextSplitter():使用 NLTK(自然语言工具包)按句子分割文本。
  • SpacyTextSplitter() - 使用 Spacy按句子的切割文本。
    但是文本的切割依然是难点,切割结果直接影响到最后的问答结果,因此该部分的大量调参和方法需进一步深入研究

实现情况

目前已经完全实现Chatglm3+langchain 的整体功能流程与框架,所有流程借助Chatglm+langchain官方文档、百度、google等方式修改参数、环境与代码等实现。
目前已经实现本地文库加载的文件类型:

  • .Txt
  • .Doc
  • .Docx
  • .Pdf
  • .Md
  • .Html
  • .Csv
  • .odt
  • .json(目前中文解析乱码,需进一步处理)
  • .ppt、.pptx
  • .jpg、.png、.tif等图片格式(该部分需要引入OCR图片文字识别»【自然语言处理技术】)
  • 扫描件文档
  • 网络端信息(借助爬虫等技术)(尚未实现)
    实现方式为:文件批量处理加载

模型大小

Chatgml3:11G
Langchain base:1.3G bge-large-zh

文本成果截图

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

图片支持结果示例一(图像文本识别)

图片支持主要是实现图片文字的识别与提取,目前主要流行的方式为OCR模型算法识别

OCR简单介绍

OCR(Optical Character Recognition)是光学字符识别的缩写,是一种把纸质文件中的文字和图形信息转化成计算机可以处理的电子文件的技术。随着人工智能和深度学习技术的发展,OCR技术也得以快速发展和更新。
从原理上讲,OCR技术可以分为两个部分:图像处理和字符识别。图像处理部分对输入的图像进行预处理,包括图像旋转、裁剪、灰度化、二值化、噪声去除等。字符识别部分则是识别处理过后图像中的字符信息,并将识别结果输出。

图片OCR + langchain + chatglm3 框架图

图片OCR + langchain + chatglm3 框架图如下所示

在这里插入图片描述
OCR + langchain + chatglm3框架图

该部分主要流程是图片文字识别算法

  1. 首先载入图片:如jpg、jpeg、png、tif等;
  2. 利用CNN 和RNN技术实现图片中文字定位;
  3. 对定位区域图片文字进行识别;
  4. 对识别结果进行文本话处理;
  5. 将处理结果接入langchain + chatglm3框架。

OCR算法选择RapidOCR算法原因

  • 多语言支持
    RapidOCR支持多达70种语言的OCR识别,覆盖了世界上大部分主要语言,可适应全球性的应用需求,例如中文、英语、日语、韩语和阿拉伯语等。
  • 高精度识别
    RapidOCR基于深度学习算法进行OCR识别,其精度比传统的基于规则的方法和传统基于特征的方法更高,有更好的适应性。
  • 高效识别
    RapidOCR的名字已经表明了其速度优势,它不仅能够快速识别文字字符,还可以快速预处理图像文件。对于大型图像文件,也可提供高效处理能力,提高程序的执行效率。
  • 易于使用
    RapidOCR设计简单易用,遵循易用性、稳定性和可扩展性原则,兼容Linux、Windows和MacOSX等多个操作系统平台,支持命令行和API两种方式,并提供详细的文档和示例代码供用户参考使用。

OCR 文字识别代码源

https://github.com/PaddlePaddle/PaddleOCR.git
https://gitee.com/owenwdx/RapidOCR#rapidocr

OCR 各算法性能对比

在这里插入图片描述

OCR的整体的框架图

在这里插入图片描述

OCR的整体的框架关键点

  • 检测模块
    LK-PAN:大感受野的PAN结构
    DML:教师模型互学习策略
    RSE-FPN:残差注意力机制的FPN结构
  • 识别模块
    SVTR_LCNet:轻量级文本识别网络
    GTC:Attention指导CTC训练策略
    TextConAug:挖掘文字上下文信息的数据增广策略
    TextRotNet:自监督的预训练模型
    UDML:联合互学习策略
    UIM:无标注数据挖掘方案

关键技术与应用场景统计

在这里插入图片描述

OCR + langchain + chatglm3识别结果问答示例

  • 示例一、图片文字OCR 算法提取,创建矢量库并问答结果:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 示例二、扫面件情况
    在这里插入图片描述
    扫描件识别结果
    在这里插入图片描述
    提问结果
    在这里插入图片描述
  • 示例三、英文支持情况

在这里插入图片描述

英文检测结果

在这里插入图片描述
提问回答结果
在这里插入图片描述

扩展

OCR + langchain + chatglm3 框架完全支持视频内容文字识别与问答。

图片支持结果示例二(图像内容文本描述—文本提问搜图)

对于图片描述任务,应该尽可能写实,即不需要华丽的语句,只需要陈述图片所展现的事实即可。任务分为两个部分,一是图片编码,二是文本生成,基于此后续的模型也都是encoder-decoder的结构。
中文和英文的语言区别比较大,中文语义更加丰富且灵活多变,而当前针对中文的图像描述生成研究相对较少,大多模型借鉴于英文的IC技术,本次以中文为基础测试研发。

在这里插入图片描述

主要任务

1)检测图像中的目标;
2)目标的属性,比如颜色、尺寸等;
3)目标之间的关联;
4)语言模型,用于把上面的信息表述成句子;

Image Caption的实现方法

实现ImageCaption需要以下步骤:

  1. 数据准备:对原始图像添加标注信息,生成图像-标注对,并将其拆分为训练、验证和测试数据集。
  2. 模型构建:建立CNN和LSTM网络模型,训练 CNN 来从图像中提取特征,然后使用 LSTM 从这些特征中生成每张图片对应的文本描述。
  3. 模型训练:对模型进行训练,调整模型的超参数,使其生成更好的图像标注结果。
  4. 模型评估:使用BLEU、ROUGE等指标来评估模型的性能,并根据评估结果进行进一步的优化

算法选型

Chinese-IC-Baseline 是目前中文图像描述中非常经典的算法框架,Chinese-IC-Baseline 实现了CNN-LSTM-Attention结构,这是图像描述生成方向非常典型的基线模型,因此基于此项目学习基础并展开研究。

Chinese-IC-Baseline + langchain + chatglm3 框架图

在这里插入图片描述
该部分主要流程是图片文字识别算法

  1. 首先载入图片:如jpg、jpeg、png、tif等;
  2. 利用CNN 和RNN技术对图片进行encoder操作生成特征;
  3. 利用RNN技术将特征进行decoder处理,生成图片描述文本;
  4. 对文本进行非结构化载入,然后接入langchain + chatglm3框架;
  5. 用户输入需要搜索的描述图片,利用langchain + chatglm3回答提问结果,输出对应图片描述文本,然后关联到对应图像,输出搜索图像,如图中(16)。

图文描述的整体的框架图

在这里插入图片描述

Image Caption算法主要包含两部分:一个用于提取图片信息的Visual Model模型,一个用户提取文本信息的Language Mode模型。Visual Model模型可以由CNN、Transformer、GCN等组成,Lanquage Mode模型可以由LSTM、CNN+RNN、Beat、Transformer等组成。

图文描述难点与关键点

  • 任务复杂:
    生成自然语言描述需要结合考虑图片的信息,而图片则可能涉及到更加复杂的情境,包括图像中每个像素的颜色、位置。大小以及物体之间的关系等。因此,lmage Caption算法需要在复杂的多元数据中寻找关联性和必要细节。
  • 结构变体:
    即便是同一类目的图片,其内容也可能非常不同。比如拍摄地点、拍摄时间、光线、角度等的差别都会让一张具有相似场景的图片变得截然不同。这种结构变体的存在,使得生成准确的描述变得更加困难。
  • 视觉与语言之间的关联:
    由于文本和视觉表示有很大的不同,机器学习算法需要通过学习到的特征来获取两种不同表示之间的联系。因此,图像和文本语言之间的联系不可能只是简单的像素到单词的一一映射,而是一个复杂的和很多层次的关联。
  • 数据集大小和精度:
    为了训练和评估lmae Caption算法,需要大量的图片和相应的描述数据。然而,这些数据集往往存在噪声、错误或者缺失信息。而这些问题会影响深度学习模型的训练和泛化能力。
  • 实时性:
    Image Caption任务需要处理大量的视觉和语言信息,因此需要消耗大量的计算资源。因此,对于实时性任务来说,算法的性能和效率是非常重要的挑战。

Chinese-IC-Baseline 图文描述代码源

https://github.com/Lieberk/Chinese-IC-Baseline.git
https://blog.csdn.net/lihuanyu520/article/details/131153219

Chinese-IC-Baseline + langchain + chatglm3 图文问答示例

在这里插入图片描述
Image Caption 结果
在这里插入图片描述
在这里插入图片描述
Image Caption 结果
在这里插入图片描述
提问回答结果

在这里插入图片描述
提问推荐图片
在这里插入图片描述

扩展

Chinese-IC-Baseline + langchain + chatglm3 框架完全支持视频内容图文描述与问答。

技术流程总结图

在这里插入图片描述

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

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

相关文章

KNIME 节点之战(Game of Nodes)锦标赛

“Hark! I summon thee to a contest of nodes. Art thou endowed with the courage for the encounter?” “听着!我在此邀请你加入一场节点之战。你有勇气面对吗?” 官方链接 活动概要与参赛守则 诚邀您加入 KNIME 节点之战 —— 首届全球工作流挑战大…

无心剑小诗《致敬任正非》

致敬任正非 您是时代的勇者 科技海洋中砥砺前行 目光如炬,坚定而深邃 照亮了华为的路 引领着创新的方向 您是一颗璀璨的星 商业星空中熠熠生辉 您智慧如奔涌之泉 激荡无穷的力量 驱动着华为的发展 创造了无数奇迹 您是一位无畏的勇士 面对困难挑战,永…

MySQL的ACID、死锁、MVCC问题

1 ACID ACID代表原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。一个确保数据安全的事务处理系统,必须满足这些密切相关的标准。 原…

02 - python入门篇

1. python入门 1.1 认识标识符 标识符是由字母、数字和下划线组成标识符的首字符必须是字母或下划线标识符区分大小写 1.2 认识保留字 简单来说就是python把一些字符串在系统中用过了,你后面定义就不能使用人家已经使用过的了。 保留字有哪些 import keyword …

记录一次k8s集群镜像恢复到harbor的过程

之前由于harbor的存储空间不够了,同事干掉了好多镜像,结果把现网生产的镜像也搞掉了。进行了找回操作,这里做下记录。 环境是k8s集群,容器引擎用的containerd。 最初发现这个问题是在增加节点的时候,发现有的节点主机…

蓝桥杯备战——11.NE555测频

1.分析原理图 我们可以看到,上图就是一个NE555构建的方波发生电路,输出方波频率1.44/2(R8Rb3)C,如果有不懂NE555内部结构,工作原理的,可以到B站学习。实在不懂仿真也行,比如我下面就是仿真结果: 然后就是下…

洛谷 P1803 凌乱的yyy / 线段覆盖

本聪明帅气文武双全的史上无敌代码猿来发题解了. 题目背景 快 noip 了,yyy 很紧张! 题目描述 现在各大 oj 上有 n 个比赛,每个比赛的开始、结束的时间点是知道的。 yyy 认为,参加越多的比赛,noip 就能考的越好&…

企业架构TOGAF?

企业架构 企业架构(Enterprise architecture)是指整个公司或企业中软件和其他技术的整体视图和方法。 通常,企业架构不仅仅是组织各种内部基础设施的结构。相反,我们的目标是通过以正确的方式分析、设计、规划和实施正确的技术&…

数据结构—动态查找

动态查找介绍 1. 动态查找的引入:当查找表以线性表的形式组织时,若对查找表进行插入、删除或排序操作,就必须移动大量的记录,当记录数很多时,这种移动的代价很大。 2. 动态查找表的设计思想:表结构本身是…

ffmpeg合成mp3音频,解决音频属性不一致问题

1. 需求,amr转成mp3,再将此mp3和其他mp3合成 2. 问题:拼接后的第一段音频可以播放,第二段自动跳过,无法播放。 3. 解决: 3.1 查看各文件属性 # 查看amr转为mp3文件的属性:ffprobe 文件名&am…

Java基础 反射详解

目录 简介 反射的基本使用 获取 Class 对象的四种方式 基本使用示例 常用方法 生产中的常用方式 获取注解 SpringIoc容器的制作 反射 抽象工厂模式 双亲委派 反射缺点 前言-与正文无关 生活远不止眼前的苦劳与奔波,它还充满了无数值得我们去体验和珍…

认识文件和目录

单用户&多用户操作系统(科普) 单用户操作系统:指一台计算机在同一时间 只能由一个用户 使用,一个用户独自享用系统的全部硬件和软件资源Windows XP 之前的版本都是单用户操作系统 多用户操作系统:指一台计算机在同一时间可以由 多个用户 使用,多个用户共同享用系统的全…

syntax error: expected ‘:‘ | ‘IDENT‘ | ‘INT‘, got ‘(‘

问题 使用 go-zero时,执行api命令报错user.api 55:9 syntax error: expected : | IDENT | INT, got (。报错信息提醒文件55行有错,但是源文件55行没有问题。 解决 这里我的goctl版本是1.6.1 执行如下命令,将版本改为1.6.0,即可解…

Maven的安装以及配置(超级详细版)

前言 至于什么是Maven,大家可以理解为之前的Vue一样,也是通过操控对象映射来使用的 他内部还有很多的插件用于实现对应的功能,例如打包插件,或是测试 maven下载 Maven – Download Apache Maven apache下的开源项目&#xff0…

基于C/C++的MFC的IDC_MFCEDITBROWSE2控件不显示ico问题记录

打开资源文件 *.rc文件 ,在最上方添加 #if !defined(_AFXDLL) #include "afxribbon.rc" // MFC ribbon and control bar resources #endif 如下图所示:

SpringBoot security 安全认证(二)——登录拦截器

本节内容:实现登录拦截器,除了登录接口之外所有接口访问都要携带Token,并且对Token合法性进行验证,实现登录状态的保持。 核心内容: 1、要实现登录拦截器,从Request请求中获取token,从缓存中获…

liunx服务器下vim无法:wq解决方案

当你vim某一个文件是,由于其他人在操作,或者上次操作中断,造成的 解决方案,不要,vim -r /etc/****,不然你会得到 正确方案 然后在,直接sudo vim /ect/xxx,还出现第一幅图就直接选…

QML自定义ComboBox组件,支持动态筛选

QtQuick.Controls提供了ComboBox组件,该组件能够满足日常的下拉选择框的需求,但当需要用户在ComboBox中通过输入关键字进行自动匹配时,原生的组件虽然提供了editable属性用于输入关键字,但是匹配内容不弹出下拉框,无法…

winform冒泡排序和快速排序实现

winform冒泡排序和快速排序实现 冒泡排序和快速排序是两种常用的排序算法,可以在Winform程序中实现以提高排序效率。冒泡排序是一种简单但效率较低的排序算法,它通过相邻元素间的比较和交换来实现排序。它的基本思想是每一轮比较相邻两个元素的大小&…

浅析Redis③:命令处理之数据返回Client(下)

写在前面 Redis作为我们日常工作中最常使用的缓存数据库,其重要性不言而喻,作为普通开发者,我们在日常开发中使用Redis,主要聚焦于Redis的基层数据结构的命令使用,很少会有人对Redis的内部实现机制进行了解&#xff0c…