RAG知识库问答LangChain+LLM的二次开发:商用时的典型问题及其改进方案_langchain rag 知识库

LangChain4j 与知识库的高效整合 在构建 AI 应用时,单纯依赖 LLM(大语言模型)往往不足以满足企业级需求。知识库(Knowledge Base)提供了一种增强 LLM 能力的方法,尤其是在需要特定领域知识、长期记忆或动态更新信息的场景下。本篇文章将深入探讨。 阅读详情

前言

如之前的文章所述,我司下半年成立大模型项目团队之后,我虽兼管整个项目团队,但为让项目的推进效率更高,故分成了三大项目组(不过到了24年Q1之后,则有了AIGC、论文、RAG、机器人、agent等五大项目组了)

  1. 第一项目组由霍哥带头负责类似AIGC模特生成系统
  2. 第二项目组由阿荀带头负责论文审稿GPT
  3. 第三项目组由朝阳带头负责企业多文档的知识库问答系统,朝阳、猫药师、bingo等人贡献了本文的至少一半

对于知识库问答,现在有两种方案,一种基于llamaindex,一种基于langchain +LLM

如下图所示,整个系统流程是很清晰的,但涉及的点颇多,所以决定最终效果的关键点包括且不限于: 文本分割算法、embedding、向量的存储 搜索 匹配 召回 排序、大模型本身的生成能力
在这里插入图片描述

本文重点则阐述“如何通过基于langchain-chatchat二次开发一个知识库问答系统”,包括其商用时的典型问题以及对应的改进方案,比如

1 如何解决检索出错:embedding算法是关键之一  
2 如何解决检索到相关但不根据知识库回答而是根据模型自有的预训练知识回答  
3 如何针对结构化文档采取更好的chunk分割:基于规则  \ 
4 如何解决非结构化文档分割不够准确的问题:比如最好按照语义切分  
5 如何确保召回结果的全面性与准确性:多路召回与最后的去重/精排  
6 如何解决基于文档中表格的问答   

最后强调一下,本文及后续相关的文章(比如embedding、文本语义分割、llamaindex等)更多是入门/梳理,且本文中列举的某些例子在chatchat项目更新的版本虽已经优化,但我司第三项目组在23年10月份时面对的是其较老的版本,故本文展示的优化思路依然有较大的参考价值

至于针对chatchat项目更新版本的优化,包括其中的细节/深入暂在我司的「大模型项目开发线上营」里见

前置部分 知识库的构建:基于langchain-chatchat的V0.2.6版本(chatglm2+m3e)

将七月近两年整理的大厂面试题PDF文件作为源文件来进行知识库的构建

默认使用RapidOCRPDFLoader作为文档加载器

RapidOCR是目前已知运行速度最快、支持最广,完全开源免费并支持离线快速部署的多平台多语言OCR。由于PaddleOCR工程化不是太好,RapidOCR为了方便大家在各种端上进行OCR推理,将PaddleOCR中的模型转换为ONNX格式,使用Python/C++/Java/Swift/C# 将它移植到各个平台


更多详情参考:https://rapidai.github.io/RapidOCRDocs/docs/overview/

另,本文里的测试及二次开发主要针对langchain-chatchat的V0.2.6版本,资源及相关默认配置如下:

  • 显卡:Tesla P100,16G(显存)
  • 分词器:ChineseRecursiveTextSplitter
  • chunk_size:250 (顺带说一下,250是默认分块大小,但该系统也有个可选项,可以选择达摩院开源的语义分割模型:nlp_bert_document-segmentation_chinese-base )
  • embedding模型:默认为m3e-base
  • LLM模型:chatglm2-6b (默认为该模型,但下文会有些结果来自chatglm3)
  • 向量库:faiss

第一部分 如何解决检索的问题:比如检索出错等

1.1 如何解决检索出错:embedding算法是关键之一

1.1.1 针对「Bert的预训练过程是什么?」检索出的结果与问题不相关

使用原始的langchain-chatchat V0.2.6版本,会出现对某些问题检索不到的情况

比如问一个面试题:Bert的预训练过程是什么?

  • 其在文档中的结果如下:
![](https://img-blog.csdnimg.cn/direct/bb0fa6d953e94172bce7c00d52f19f64.png)
  • 但基于m3e的系统实际检索得到的内容如下:

    出处 [1] 2021Q2大厂面试题共121题(含答案及解析).pdf

    成. 15.6 bert 的改进版有哪些 参考答案: RoBERTa:更强大的 BERT 加大训练数据 16GB -> 160GB,更大的batch size,训练时间加长 不需要 NSP Loss: natural inference 使用更长的训练 SequenceStatic vs. Dynamic Masking 模型训练成本在 6 万美金以上(估算) ALBERT:参数更少的 BERT一个轻量级的 BERT 模型 共享层与层之间的参数 (减少模型参数)


    出处 [2] 2022Q1大厂面试题共65题(含答案及解析).pdf

    可以从预训练方法角度解答。
    … 20
    5、RoBERTa 相比 BERT 有哪些改进?
    …
    20 6、BERT 的输入有哪几种 Embedding?


    出处 [3] 2022Q2大厂面试题共92题(含答案及解析).pdf

    保证模型的训练,pre-norm 显然更好一些。 5、GPT 与 Bert 的区别 1) GPT
    是单向模型,无法利用上下文信息,只能利用上文;而 BERT 是双向模型。 2) GPT 是基于自回归模型,可以应用在 NLU 和 NLG两大任务,而原生的 BERT 采用的基于自编码模 型,只能完成 NLU 任务,无法直接应用在文本生成上面。 6、如何加速 Bert模型的训练 BERT 基线模型的训练使用 Adam with weight decay(Adam 优化器的变体)作为优化器,LAMB 是一款通用优化器,它适用于小批量和大批量,且除了学习率以外其他超参数均无需调整。LAMB 优化器支持自

    可以看出,是没有检索到相关内容的

  • 在没检索对的情况下,接下来,大模型便只能根据自己的知识去回答(下图左侧是chatglm2-6b的回答,下图右侧是chatglm3-6b的回答)

    结果就是造成了大模型所谓的编造或幻觉问题,没有答到点子上:MLM和NSP

1.1.2 可能的原因分析与优化方法

使用默认配置时,虽然上传文档可以实现基础的问答,但效果并不是最好的,通常需要考虑以下几点原因

  1. 文件解析及预处理:对于PDF文件,可能出现解析不准确的情况,导致检索召回率低;
  2. 文件切分:不同的chunk_size切分出来的粒度不一样。如果设置的粒度太小,会出现信息丢失的情况;如果设置的粒度太大,又可能会造成噪声太多,导致模型输出的结果明显错误。且单纯根据chunk_size切分比较简单粗暴,需要根据数据进行针对性优化;
  3. embedding 模型效果:embedding效果不好也会影响检索结果

优化方法:

  • 文件解析及预处理
    一方面可以尝试不同的PDF解析工具,解析更加准确
    另一方面可以考虑将解析后的内容加上标题,并保存成Markdown格式,这样可以提高召回率
  • 文件切分
    基于策略:对于特定的文档,比如有标题的,可以优先根据标题和对应内容进行划分(就是按照题目和对应答案切分成一个块),再考虑chunk_size
    基于语义分割模型:还可以考虑使用语义分割模型
  • 模型效果
    尝试使用更多embedding模型,获得更精确的检索结果。如:piccolo-large-zh 或 bge-large-zh-v1.5等等,下文很快阐述
  • 向量库
    如果知识库比较庞大(文档数量多或文件较大),推荐使用pg向量数据库
    如果文件中存在较多相似的内容,可以考虑分门别类存放数据,减少文件中冲突的内容
  • 多路召回
    结合传统方法进行多路召回
  • 精排
    对多路召回得到的结果进行精排
1.1.3 embedding优化:针对「Bert的预训练过程是什么?」把m3e替换成bge

考虑到bge在各方面的表现不错,所以接下来,我们把m3e替换成bge再试下(至于如何更换embedding模型? 1 找到condigs下的model_config.py文件;2 修改所用embedding模型的路径,即MODEL_PATH下的embed_model中的模型对应的路径,如:“bge-large-zh”: “/data/datasets/bge-large-zh”,3 修改选用的embedding模型:EMBEDDING_MODEL = “bge-large-zh”),得到的结果是:

  • bge-large-zh检索到了与问题最相关的结果,但最相关的结果并没有排在第一位
  • 而m3e是没有检索到最相关的结果的

如下图所示

最终大模型也正常答出来了(答到了点子上:MLM和NSP)

第二部分 如何解决检索到相关但不根据相关结果回答

2.1 开源LLM并没有完全根据文档内容来回答,而是根据模型自有的预训练知识回答

LLM问题主要有以下几点:

  1. LLM的回答会出现遗漏信息或补充多余信息的情况
  2. chatglm2-6b还会出现回答明显错误的情况
2.1.1 针对「用通俗的语言介绍下强化学习?」检索到部分相关

比如问一个面试题:用通俗的语言介绍下强化学习?

  1. 该问题在文档中的结果如下:

  2. m3e检索得到的内容如下:

    出处 [1] 2022Q2大厂面试题共92题(含答案及解析).pdf

    CART 树算法的核心是在生成过程中用基尼指数来选择特征。 **4、用通俗的语言介绍下强化学习(Reinforcement Learning)**监督学习的特点是有一个“老师”来“监督”我们,告诉我们正确的结果是什么。在我们在小的时候,会有老师来教我们,本质上监督学习是一种知识的传递,但不能发现新的知识。对于人类整体而言,真正(甚至唯一)的知识来源是实践——也就是强化学习。比如神农尝百草,最早人类并不知道哪些草能治病,但是通 过尝试,就能学到新的知识。学习与决策者被称为智能体,与智能体交互的部分则称为环境。智能体与环境不断进行交互,具体而言,这一交互的过程可以看做是多个时刻,每一时刻,智能体根据环境的状态,依据一定的策略选择一个动作(这


    出处 [2] 2021Q3大厂面试题共107题(含答案及解析).pdf

    20.2 集成学习的方式,随机森林讲一下,boost 讲一下, XGBOOST 是怎么回事讲一下。 集成学习的方式主要有 bagging,boosting,stacking 等,随机森林主要是采用了 bagging 的思想,通过自助法(bootstrap)重采样技术,从原始训练样本集 N 中有放回地重复随机抽取 n 个样本生成新的训练样本集合训练决策树,然后按以上步骤生成 m 棵决策树组成随机森林,新数据的分类结果按分类树 投票多少形成的分数而定。 boosting是分步学习每个弱分类器,最终的强分类器由分步产生的分类器组合而成,根据每步学习到的分类器去改变各个样本的权重(被错分的样本权重加大,反之减小) 它是一种基于 boosting增强策略的加法模型,训练的时候采用前向分布算法进行贪婪的学习,每次迭代


    出处 [3] 2022Q2大厂面试题共92题(含答案及解析).pdf

    特征工程可以并行开发,大大加快开发的速度。 训练速度较快。分类的时候,计算量仅仅只和特征的数目相关。 缺点:准确率欠佳。因为形式非常的简单,而现实中的数据非常复杂,因此,很难达到很高的准确性。很难处理 数据不平衡的问题。 3、介绍下决策树算法常见的决策树算法有三种:ID3、C4.5、CART 树 ID3 算法的核心是在决策树的每个节点上应用信息增益准则选择特征,递归地构架决策树。C4.5 算法的核心是在生成过程中用信息增益比来选择特征。 CART 树算法的核心是在生成过程中用基尼指数来选择特征。4、用通俗的语言介绍下强化学习(Reinforcement Learning)

    可以看出
    第一个检索结果和问题是相关的
    第二个检索结果和问题是完全没关系的
    而第三个检索结果的最后一句话是和问题相关的

    顺带提一下,如果把m3e替换成bge-large-zh,则其检索到的第1个结果和m3e的第1个结果是一致的,第2个结果则和m3e的第3个结果一样(只最后一句话是和问题相关),第3个结果则检索到的SVM(和问题完全无关),详见我司的「大模型项目开发线上营」之“bge-large-zh模型例子”

  3. 最终,m3e + chatglm2基于知识库给的答案如下图左侧所示,bge-large-zh + chatglm2则如下图右侧所示:

    可以看出,m3e + chatglm2并没有完全根据文档内容来回答,而是基于自己的知识进行了相应回答,而对于回答的第三段话,强化学习算法主要有三种:ID3、C4.5和CART树。可以看出,这段话的表达是完全错误的

2.1.2 针对「生成式模型和判别式模型的区别并举一些例子」检索到的全是相关的

再看一个例子,即提问:生成式模型和判别式模型的区别并举一些例子

  1. 其在文档(知识库)中的答案如下

  2. m3e检索到的结果如下,很明显,三个检索结果都精准匹配到了问题

  3. 但,系统最终实际生成的答案如下(下图左侧是chatglm2-6b,下图右侧是chatglm3-6b)

    相当于即便在上步骤中,系统检索到的三个结果的内容都是和问题相关的,但大模型还是根据自己的知识进行了回答

2.2 LLM不按照知识库回答的优化方法

  • 优先使用最新的6B/7B模型:ChatGLM3-6B、Baichuan2-7B、Qwen-7B

    当然,即便有的模型换成到了能力更强的最新版,也不一定听话(依然不严格按照知识库中的回答),例如“2.1.1 针对「用通俗的语言介绍下强化学习?」”中,把chatglm2替换成最新的chatglm3,也未完全严格按照文档中的答案来回答(但GLM3这个结果相比GLM2的结果 至少是进步了,没有出现毫不相干的决策树之类的内容)

    所以,如果资源可以支持48G以上的显卡,可以考虑使用Qwen-14B-Chat 或 Baichuan-13B-Chat,13B的模型通常好于6B/7B模型

  • 优化prompt,可能会有一定效果的。但由于随机性,结果并不能得到保证

  • PDF文档解析优化方案,下文详述

第三部分 结构化文档与非结构化文档的典型问题:如何更好分割

3.1 针对结构化文档本身的特点:基于规则针对性分割

首先确定咱们的目标和步骤,我们需要先解析PDF,然后分别获取文本内容和图片内容,最后拼接文本内容和图片内容

而Langchian-Chatchat中对于不同类型的文件提供了不同的处理方式,从项目server/knoledge_base/utils.py文件中可以看到对于不同类型文件的加载方式,大体有HTML,Markdown,json,PDF,图片及其他类型等

LOADER_DICT = {"UnstructuredHTMLLoader": ['.html'],
               "UnstructuredMarkdownLoader": ['.md'],
               "CustomJSONLoader": [".json"],
               "CSVLoader": [".csv"],
               # "FilteredCSVLoader": [".csv"], # 需要自己指定,目前还没有支持
               "RapidOCRPDFLoader": [".pdf"],
               "RapidOCRLoader": ['.png', '.jpg', '.jpeg', '.bmp'],
               "UnstructuredFileLoader": ['.eml', '.msg', '.rst',
                                          '.rtf', '.txt', '.xml',
                                          '.docx', '.epub', '.odt',
                                          '.ppt', '.pptx', '.tsv'],
               }

这里,我们重点关注PDF文件的解析方式,并探究其可能的优化方案

从上面的文件加载字典中可以看出,PDF文件使用的加载器为RapidOCRPDFLoader,该文件的方法在项目document_loaders/mypdfloader.py中

其对应的处理步骤为:

  1. 首先使用fitz(即pyMuPDF)的open方法解析PDF文件;
  2. 对于每一页的文本内容,通过get_text方法进行获取,而对于图片内容通过get_images方法进行获取,获取后通过RapidOCR对图片中的文本内容进行提取
  3. 最后将从图片中提取的文本和原始的文本内容进行拼接,得到最终的所有文本内容
    再之后,进行下一步的分词和文本切割

如你所见,chatchat原系统V0.2.6中默认的这种处理方式的

  • 优点是简单粗暴,基本上对于任何排版的PDF文件都能够提取到有效信息
  • 但缺点也很明显,就是无差别,如果我们的文档本身就有较好的结构,提取出来的内容也无法将这种较好的结构反映出来

所以,通常情况下需要根据文档的具体情况对文档定制化处理,那下面,咱们就来根据文档固有的特点针对性优化下吧

3.1.1 特定PDF解析方案一:根据书签定位
  1. 首先,分析七月在线大厂面试题PDF文档特点
    以「七月在线大厂面试题PDF文档」为例,有以下特点:

    1. 文档具有书签,可以直接根据书签对应到具体的页码
    2. 文档结构不复杂,共有两级标题,一级标题表示一个大的章节,二级标题表示面试题的问题,文本内容为每道面试题对应的答案
    3. 每道面试题是独立的,和其前后的面试题并没有明显的相关性
    4. 面试题题目的长度长短不一,短的有几个词组成,长的基本一句话
    5. 文档中除中文外,还有大量模型或算法英文词,且文档中包含部分公式和代码

    因此,可以考虑根据文档的标题进行分割,即将文档中的标题和标题对应的内容分为一块,在放入向量库的时候可以尝试两种方式
    一种是只将题目进行向量化表示存入向量库
    另一种是将题目和答案一起进行向量化表示存入向量库

  2. 然后考虑PDF文档解析可选方案
    对此,常见的几种PDF解析工具包都可以尝试下,比如pdfplumber、PyPDF2、fitz(PyMuPDF)


    “PyPDF2、pdfplumber、fitz(PyMuPDF)都是用于解析 PDF 文件的 Python 库,但它们在实现和功能上有一些本质区别

    PyPDF2
    描述:PyPDF2 是一个用于操作 PDF 文件的库,它提供了一些基本的功能,如合并、拆分和旋转 PDF 页面等
    特点:PyPDF2 的主要目的是处理 PDF 文件的基本操作,而不是从 PDF 中提取高级内容。它提供了对页面、书签等基本元素的简单控制。
    适用场景:PyPDF2 适用于对 PDF 文件进行简单的编辑和处理,例如合并多个 PDF 文件或旋转页面

    pdfplumber
    描述:pdfplumber 是基于 PDFMiner.six 构建的,它提供了更高级的接口,使得从 PDF 中提取文本、表格和图像等信息更加容易
    特点:pdfplumber 提供了易于使用的API,使得从 PDF 中提取文本、表格等内容变得相对简单。它还允许通过页面对象来获取页面级别的信息
    适用场景:pdfplumber 适用于需要从 PDF 中提取结构化数据的任务,如文本和表格,比如下面这个例子,先提取表格(主要用到 extract_table 这个函数),后保存为excel文件
    import pdfplumber
    from openpyxl import Workbook #保存表格,需要安装openpyxl
    with pdfplumber.open(“D:\\pdffiles\\人力资源部岗位编制.pdf”) as pdf:
    page01 = pdf.pages[0]
    table = page01.extract_table()
    workbook = Workbook()
    sheet = workbook.active
    for row in table:
    sheet.append(row)
    workbook.save(filename=“D:\\pdffiles\\人力资源部岗位编制.xlsx”)

    fitz之PyMuPDF
    描述:PyMuPDF 是对 MuPDF 渲染引擎的 Python 封装,MuPDF 是一个用于渲染 PDF、XPS、EPUB 和 CBZ 等格式的高性能库。
    特点:PyMuPDF 提供了对 PDF 文件的低级别访问,允许直接访问页面内容,支持文本、图像等的提取。它的速度较快,适合对 PDF 进行高级处理
    适用场景:PyMuPDF 适用于需要对 PDF 文件进行深度分析、提取详细信息或执行高级操作的应用场景

    总的来说,选择使用哪个库取决于任务的性质
    如果只需要基本的 PDF 文件处理,可以选择 PyPDF2
    如果需要从 PDF 中提取结构化数据,pdfplumber 是一个不错的选择
    如果需要进行更高级的处理、分析以及对 PDF 文件进行详细操作,PyMuPDF 可能更适合

    当然,pdf解析工具远远不止以上三种,更多见下图

    暂以上”


    回到我们当前的问题上
    \rightarrow 首先,通过fitz(get_toc函数)获取书签信息,得到面试题题目与其所在的页码,保存为一个字典

    import fitz
    with fitz.open(data_path) as doc:
        # 通过get_toc获取书签内容
        toc = doc.get_toc()  # [[lvl, title, page, …], …]
        for level, title, page in toc:
            print(level, title, page)
    

    \rightarrow 其次,分别尝试用PyPDF2、pdfplumber、fitz(pymupdf)抽取每一页的文本信息(分别通过extract_text、extract_text、get_text),然后与字典中的标题进行匹配(使用find方法)

    \rightarrow 接着,通过面试题当前位置和下一个面试题位置(这里的位置指的是索引),对面试题进行分块
    \rightarrow 最后,输出面试题与其对应的答案
    至于以上4个步骤对应的完整代码见七月的「大模型项目开发线上营」

  3. 当然,PDF文档解析会存在一些问题
    比如
    a) 书签中的标题内容和文档中的标题内容并不完全一致,这种情况可能是解析后出现多余的空格导致的
    b) 需要考虑一道面试题可能存在跨页的情况,一般是会出现一道面试题出现在两页的情况,但也需要考虑一道面试跨三页或多页的情况
    c) 由于一级标题是有分页符的,每个一级标题会另起一页,因此在处理时也需要考虑此种情况
    d) 解析的文本中带有页脚,如:第 4 页 共 46 页,由于页脚的内容对面试题是没有意义的,因此也需要考虑去掉

  4. 最终确定PDF文档解析的解决方案
    解决方案:
    ①对于书签中的标题内容和文档中的标题内容并不完全一致的问题
    \rightarrow 一种方式有考虑去除文档中标题的空格,实现困难在于无法精确定位,如果全去掉就会出现一些英文单词拼接在一块的情况,可能对语义或后续的检索产生影响
    \rightarrow 一种方式是不去除,如果出现这种情况,则将标题所在页的信息都提取出来;

    ②对于一道面试题可能存在跨页的情况,可以通过设置起始页和终止页,对相邻标题(主要是下一个标题)所在页进行判断的方式来处理
    ③对于每个一级标题会另起一页的情况,可以通过添加对特殊字符“1、”判断的方式来处理;
    ④对于页脚,可以使用正则表达式进行匹配去除

以上方案更多针对文档的书签是准确的,和对应的标题完全对应,那如果书签不够准确或者没有书签呢,则需要另寻办法,详见下节

3.1.2 特定PDF解析方案二:通过字体大小或字体类型

由于通过fiz(pymupdf)的get_toc函数获取书签信息与解析出的文中面试题的题目差别较大,匹配率较低,因此,考虑不使用书签信息,直接对每一页中的标题根据一定的规则进行识别。如可以通过字体的大小或字体类型进行规则设定

注意,本方案二中只用了fiz(pymupdf)解析器,这样可以保证面试题题目的获取与正文信息获取的一致性,而不会出现使用不同解析器可能导致匹配效果差的情况

3.1.2.1 通过字体大小获取标题
  1. 通过get_text方法获取表的相关信息
    该方法通过查看PDF文件中不同大小的字体,设置一定的规则获取面试题的题目
    通过_page_toc.get_text(“dict”)[“blocks”]_方法可以得到每一行的相关信息,然后查看其中一个block中的具体信息如下:```
    {‘number’: 1,
    ‘type’: 0,
    ‘bbox’: (45.35900115966797,
    83.10362243652344,
    475.92999267578125,
    101.64714813232422),
    ‘lines’: [{‘spans’: [{‘size’: 14.050000190734863,
    ‘flags’: 20,
    ‘font’: ‘MicrosoftYaHei-Bold’,
    ‘color’: 0,
    ‘ascender’: 1.05810546875,
    ‘descender’: -0.26171875,
    ‘text’: ‘第十七篇:2022 年 4 月 10 日百度机器学习方向暑期实习面试题 6 道’,
    ‘origin’: (45.35900115966797, 97.97000122070312),
    ‘bbox’: (45.35900115966797,
    83.10362243652344,
    475.92999267578125,
    101.64714813232422)}],
    ‘wmode’: 0,
    ‘dir’: (1.0, 0.0),
    ‘bbox’: (45.35900115966797,
    83.10362243652344,
    475.92999267578125,
    101.64714813232422)}]}

    其中,_number表示行的索引  
    font 表示的是文本的字体  
    text 表示的文本内容  
    bbox 包含:x0, y0, x1, y1,即文本块的左下角和右上角的坐标,这表示文本块在页面上的位置_
    
  2. 计算文本字体高度,获取标题高度范围
    分别查看第1,25,21行的关键信息:bbox,text,number,并根据bbox的坐标计算文本字体高度```
    (45.35900115966797, 83.10362243652344, 475.92999267578125, 101.64714813232422)
    第十七篇:2022 年 4 月 10 日百度机器学习方向暑期实习面试题 6 道
    1
    height:18.54352569580078

    (45.35900115966797, 135.19273376464844, 159.0, 151.03062438964844)
    1、介绍下 SVM 算法
    2
    height:15.837890625

    (67.31999969482422, 223.91693115234375, 161.88865661621094, 238.50099182128906)
    SVM 可分为三种:
    5
    height:14.584060668945312

    (45.35900115966797, 671.832763671875, 172.8000030517578, 687.670654296875)
    2、介绍下逻辑回归算法
    21
    height:15.837890625

    从结果可知,标题的高度介于15到18之间,从而可以根据这点定位出来的标题实现精准分割
    
  3. 知道了怎么获取到标题,那便可以通过字体大小获取标题,并进行分块(具体处理的代码见七月的大模型项目开发线上营)

3.1.2.2 通过字体类型和规则获取标题
  • 查看只包含标点符号“、”的文本

    通过结果可以看到,只通过标点符号“、”是不能准确将所有标题找到,因此还可以从字体的角度出发来解决
  • 通过标点符号“、”且结合字体类型获取标题

    可以看出,通过标点符号、和字体MicrosoftYaHei-Bold,可以将所有的标题匹配出来,但对于多行标题来讲,与获取的题目并不能完全匹配(这个对多行标题额外处理下即可,具体怎么处理,详见大模型项目开发线上营)
  • 最后,便可以通过字体类型和规则获取标题,并进行分块

3.2 如何解决非结构化文档分割不够准确的问题:比如最好按照语义切分

第四部分 让召回结果更全面、准确,及基于表格的问答

4.1 如何确保召回结果的全面性与准确性:多路召回与最后的去重/精排

主要任务为非对称召回任务,即一个相对较短的问句和一个相对较长的答案(文本块),进行匹配

4.1.1 常规召回方法:Embedding召回

将用户问题和本地知识进行embedding,通过向量相似度实现召回。

问题:通过语义向量相似度匹配度不够准确,故可以通过倒排索引召回出知识语料进行补充

4.1.2 多路召回方法:关键词提取、倒排召回、embedding召回、同一问题多样表达

在文本的召回中,倒排的召回方式也非常实用,它具备精确匹配、索引效率和可解释的优势

在目前的全文检索系统中

  • 基于倒排的 BM25 相关性打分中依然是核心机制
  • 当然随着近些年深度学习的发展,语义召回表现了强大的检索效果

这两路召回在不同场景下都具备自己独立的优势,在知识召回中的互补性很强

  1. 关键词提取召回
    直接使用 jieba 分词的方式,将名词部分抽取出来作为关键词,根据关键词在文本块中出现的次数进行打分

  2. 倒排召回(基于BM25)
    基本原理
    倒排这个名字是与正排相对的
    \rightarrow 如果索引是“文档 ID → 文档内容”,则索引被称作正排索引
    \rightarrow 如果索引是“文档内容 → 文档 ID”,则索引被称作倒排索引

    a) 离线索引构建时,通过分词器对文档进行切词,得到一系列的**关键词(Term)**集合,然后以 Term 为 key 构建它与相关文档的映射关系
    b) 在线搜索流程中,首先通过切词器对用户输入进行切词,得到 Term 列表,然后根据如下
    BM25 打分公式进行打分排序返回给用户(关于公式的详细解释,见大模型线上营)
    \operatorname{BM} 25(D, Q)=\sum_{i=1}^n \operatorname{idf}\left(q_i\right) \cdot \frac{f\left(q_i, D\right) \cdot\left(k_1+1\right)}{f\left(q_i, D\right)+k_1 \cdot\left(1-b+b \cdot \frac{|D|}{\text { avgdl }}\right)}
    使用BM25需要考虑去除停用词

    倒排召回的优缺点
    优势:发展成熟,易达到非常好的 baseline 性能
    1)支持自定义停用词表,同义词表
    2)精确匹配能力强
    3)可解释能力强
    4)检索速度更快
    劣势:没有语义信息,对“一词多义”现象解决的不好
    \rightarrow 语义偏移问题, 即使关键词在字面上与文档中的词汇匹配,但如果命中的顺序与用户输入的顺序不一致,那么实际上这些词汇在语义上可能完全不相关
    这种情况下,搜索引擎需要更深层次地理解词汇的语义信息,以确保返回的结果在语义上与用户的查询意图相匹配
    \rightarrow 关键词不匹配,即用户进行搜索时,可能不知道文档中确切使用的关键词术语(terms),因此他们输入的关键词可能无法直接命中文档中的相关词汇
    为了解决这个问题,可以采用术语扩展(term expansion,例如使用同义词)、和查询改写(query rewriting)的方法。这意味着通过扩展查询词汇或改写查询,使得搜索引擎能够识别和匹配到用户可能未直接输入但与查询意图相关的词汇
    至于BM25模型代码见我司七月在线的大模型线上营

  3. embedding 召回
    使用已有的开源 embedding:
    基于已有领域数据,基于embedding 进行标注和微调,即用 QQ 和 QD 语料对向量模型进行 Finetune

    embedding 召回的优缺点
    优势:考虑语义相似性,更加智能
    a)语义相近即可召回,无需 term 命中
    b)无需考虑复杂的传统倒排的调优手段
    c)具备支持跨模态召回的潜力
    劣势:需要模型训练,对垂直领域落地支持有限
    预训练模型对于公开数据集的 benchmark 参考性不足,对垂直领域泛化性不足,可能出现以下情况:
    i) 容易出现语义相似但主题不相似的情况
    ii)不理解专有词汇
    iii)对精准匹配支持不足,难以用专业词汇精准召回
    iv)对”多词一义”情况的支持不如倒排召回中的同义词表简单直接
    v) 可解释能力弱
    vi) 需要更多的计算资源

  4. 同一问题多样化
    利用 LLM 尝试生成多个不同视角的问题,然后分别用这些问题做召回,然后再汇总
    比如下面实验的这个问题 “xx有哪些最新的功能?”,就比如生成了这样一系列的问题:
    xx有哪些最新的功能?
    最新的xx功能有哪些?
    xx有什么最新的功能可以使用?
    最新的功能是否已经在xx中推出?
    xx的新功能有哪些值得关注?
    将新生成的问题和原问题放到一个列表中,分别进行召回,得到最终的召回结果

最终的代码实现见大模型线上营

4.1.3 对召回结果的评估

对召回的结果排序前 k 个 文本块中包含正确答案即可,即 TopK 的准确率

  1. 需要构建数据集,如从所有面试题中构建20个样本进行评估
  2. Retrieval (检索):每个数据集由语料库、查询query和每个查询到语料库中相关文档的映射组成,检索的目的是找到与query相关的文件
  3. 所提供的模型用于嵌入所有查询和所有语料库文档,并使用余弦相似度计算相似度分数。根据分数对每个查询的语料库文档进行排序后,分别计算nDCG@k, MRR@k,MAP@k、precision@k和recall@k

至于各路评估指标的详细介绍见大模型线上营

4.1.4 Rerank(重排)

对于多路召回产生的结果进行重排,重排可以有三种方式选择

  1. 一种是去重取并集;
  2. 一种是直接使用重排模型;
  3. 如果效果不好,还可以基于数据进行微调
4.1.4.1 重排模型

Reranking(重新排序):输入是一个查询query和文本的列表(列表中是与query相关或不相关的文本),其目的是根据与查询的相关性对结果进行排序

  1. 文本和query通过模型进行嵌入
  2. 然后使用余弦相似度将其与查询进行比较
  3. 对每个查询进行评分,并在所有查询中取平均值。指标是平均MRR@k和MAP,后者是主要指标

交叉编码器将对查询和答案实时计算相关性分数,这比向量模型(即双编码器)更准确,但比向量模型更耗时。 因此,它可以用来对嵌入模型返回的前k个文档重新排序。

与嵌入模型不同的是,reranker使用问题和文档作为输入,直接输出相似度,而不是嵌入模型。且其是基于交叉熵损失进行优化的,因此相关分数不局限于特定的范围

  • 使用FlagEmbedding
    安装所需的包```
    pip install -U FlagEmbedding

    获得相关性得分```
    from FlagEmbedding import FlagReranker
    reranker = FlagReranker('BAAI/bge-reranker-large', use_fp16=True) # Setting use_fp16 to True speeds up computation with a slight performance degradation
    
    
    score = reranker.compute_score(['query', 'passage'])
    print(score)
    
    
    scores = reranker.compute_score([['what is panda?', 'hi'], ['what is panda?', 'The giant panda (Ailuropoda melanoleuca), sometimes called a panda bear or simply panda, is a bear species endemic to China.']])
    print(scores)
    
  • 使用 Huggingface的transformers```
    import torch
    from transformers import AutoModelForSequenceClassification, AutoTokenizer

    tokenizer = AutoTokenizer.from_pretrained(‘BAAI/bge-reranker-large’)
    model = AutoModelForSequenceClassification.from_pretrained(‘BAAI/bge-reranker-large’)
    model.eval()

    pairs = [[‘what is panda?’, ‘hi’], [‘what is panda?’, ‘The giant panda (Ailuropoda melanoleuca), sometimes called a panda bear or simply panda, is a bear species endemic to China.’]]
    with torch.no_grad():
    inputs = tokenizer(pairs, padding=True, truncation=True, return_tensors=‘pt’, max_length=512)
    scores = model(**inputs, return_dict=True).logits.view(-1, ).float()
    print(scores)

    
    
    
4.1.4.2 reranker的微调

https://github.com/FlagOpen/FlagEmbedding/tree/master/examples/reranker

4.2 如何解决基于文档中表格的问答

4.2.1 对表格的识别:通过OCR提取

对于以下这种表格

可以通过OCR的方法把表格的内容提取出三元组,即根据表格格式(合并单元格、行列关系、图片)提取知识和结构化数据,比如先通过一些工具把表格的内容先识别出来

4.2.2 把Excel文档转化成HTML,再做问答

Excel文件有2种思路,导入到SQL或者转成JSON,针对这2种格式做问答相对容易些

或者把Excel再转成HTML表格源代码,这些源代码是包含表格结构信息的,然后再扔给大模型,基本可以做问答了

为证实上面的想法,通过如下例子验证一下

4.2.3 把PDF转化成XML并解析之后,再做问答

解析PDF的关键在于,解析后能否较精准地保留原始PDF中的各项元素和排版信息。保留信息越准确,越容易通过代码把想要的部分提取出来

一般来说,各大解析器会把PDF转化成HTML或XML格式,因为这2种格式能保留足够丰富的信息,而且容易提取。当然,不管是哪种格式,都依赖于解析器本身对PDF的解析能力

比如说,同样是有合并单元格和跨页的表格,如果解析器能正确识别这是表格,那么不管是html还是xml,都会加上对应的标签方便后续提取;但如果解析器理解成了这是一个文本段落,那么不管转化成什么格式,都无法把文本和表格正确分离开来

在下面这个例子中,使用pdf2docx的Converter类把pdf转化成docx文件,再把docx解压缩得到xml文件,可用于后续的解析

以上三节都只是初步简单的思路,更多细节的处理及代码实现,详见我司的大模型项目开发线上营

​

如何学习大模型

现在社会上大模型越来越普及了,已经有很多人都想往这里面扎,但是却找不到适合的方法去学习。

作为一名资深码农,初入大模型时也吃了很多亏,踩了无数坑。现在我想把我的经验和知识分享给你们,帮助你们学习AI大模型,能够解决你们学习中的困难。

我已将重要的AI大模型资料包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来,需要的小伙伴可以扫取。

一、AGI大模型系统学习路线

很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,我下面分享的这个学习路线希望能够帮助到你们学习AI大模型。

在这里插入图片描述

二、AI大模型视频教程

在这里插入图片描述

三、AI大模型各大学习书籍

在这里插入图片描述

四、AI大模型各大场景实战案例

在这里插入图片描述

五、结束语

学习AI大模型是当前科技发展的趋势,它不仅能够为我们提供更多的机会和挑战,还能够让我们更好地理解和应用人工智能技术。通过学习AI大模型,我们可以深入了解深度学习、神经网络等核心概念,并将其应用于自然语言处理、计算机视觉、语音识别等领域。同时,掌握AI大模型还能够为我们的职业发展增添竞争力,成为未来技术领域的领导者。

再者,学习AI大模型也能为我们自己创造更多的价值,提供更多的岗位以及副业创收,让自己的生活更上一层楼。

因此,学习AI大模型是一项有前景且值得投入的时间和精力的重要选择。

【使用 langchain 创建RAG知识库完整教程】 安装对应的库导入工具包初始化一些东西(向量库,模板,模型LLM)构建chain, 使用LCEL技术开始使用。 阅读详情

相关推荐

【langchain入门】使用​​langchain​​搭建自己的本地知识库系统

RAG是的缩写,翻译为中文的意思就检索增强,以基于最新,最准确的数据建立LLM的语料知识库。LLMLangChain是一个用于开发由语言模型驱动的应用程序的框架。具有上下文感知能力:将语言模型与上下文源(提示说明、少量镜头示例、基于其响应的内容等)联系起来。原因:依靠语言模型进行推理(关于如何根据提供的上下文回答,采取什么行动等)更多的介绍可以去官网:Introduction | 🦜️🔗 Langchain代码语言:javascriptimport os。

梅花寺 1051

100行代码实现自己的RAG知识库

RAG是一种结合了检索和生成的混合式深度学习模型,常用于处理复杂的自然语言处理任务。RAG模型通过将外部知识库中的信息与生成模型结合在一起,可以提供更准确和上下文相关的答案。检索模块:负责从预先建立的知识库中检索与输入问题最相关的文档或信息片段。这通常通过向量检索技术实现,向量检索能够支持语义匹配,而不仅仅是关键词匹配,从而提高了检索的准确性。生成模块:接收检索到的内容并生成最终的自然语言响应。这个模块通常基于大型生成模型(如 GPT-4),能够理解和生成复杂的自然语言。

CoderJia的学习之路 2530

Python识别PDF扫描版PDF纯图PDF,OCR提取汉字的10大方法,力推RapidOCRPDF 可识别纯图PDF 加密签名的PDF 重点是开源免费,某些方面准确度比百度OCR高

翻了很久GitHub 最推荐RapidOCRPDF 可识别纯图PDF 加密签名的PDF 重点是开源免费,准确程度比百度OCR高,缺点是不支持还原版面格式

朴拙科技的博客 7299

RAG知识库问答LangChain+LLM的二次开发:商用时的典型问题及其改进方案

如之前的文章所述,我司下半年成立大模型项目团队之后,我兼管整个项目团队,但为让项目的推进效率更高,故分成了三大项目组对于知识库问答,现在有两种方案,一种基于llamaindex,一种基于langchain +LLM,考虑到我已在此文《基于LangChain+LLM的本地知识库问答:从企业单文档问答到批量文档问答》中详细介绍了langchain、以及langchain-ChatGLM项目的源码剖析,本文重点则阐述如何通过基于langchain-chatchat二次开发一个知识库问答系统,包括其商用时的典型问题

结构之法 算法之道 2万+

AI知识库实战:如何用LangChain构建智能问答系统?

当你面对企业海量的产品文档、内部政策,或是个人积累的数千条笔记时,是否曾希望有一个“智能助手”能像人类专家一样,快速准确地回答你的问题?比如:“我们公司的年假政策是怎样的?”“这个API接口的参数格式是什么?”“我去年写的关于LangChain的笔记里提到了哪些核心组件?传统搜索工具(如Elasticsearch)只能返回关键词匹配的文档片段,而纯大语言模型(如GPT-4)则可能生成“幻觉”答案(即没有事实依据的内容)。检索增强生成(RAG)

AI算力网络与通信的博客 1198

本地知识库问答系统搭建(基于langchain+LLM)

本地知识库问答系统是一种能够针对特定领域或企业内部数据提供精准答案的智能系统。这种系统通常需要整合多种技术,包括自然语言处理(NLP)、信息检索、机器学习等。在构建此类系统时,LangChain 和 LLM(大型语言模型)发挥着至关重要的作用。RAG 是一种结合了检索(Retrieval)和生成(Generation)的技术,它通过引入外部知识源来增强语言模型的回答能力。RAG 特别适合于构建需要引用特定领域知识的问答系统。

fengbeely的博客 900

【RAG】基于 RAG 的知识库问答系统设计与实现

基于 Retrieval-Augmented Generation (RAG) 的知识库问答系统通过结合信息检索与生成式模型,为知识库问答提供了一种高效且智能的解决方案。传统问答系统在面对动态知识更新和复杂问题时,往往存在响应不准确、更新不及时等问题,而 RAG 系统通过将知识检索与自然语言生成相结合,显著提升了回答的精准性和上下文相关性。为此,本文设计了一种基于 RAG 的知识库问答系统 Demo,采用前后端分离的架构设计,

技术改变世界 1万+

RAG实战:解锁企业知识,用LangChain + Pinecone 构建智能问答系统

RAG 的核心思想是:在 LLM 生成答案之前,先从知识库中检索出与用户问题最相关的上下文信息,然后将这些信息与用户问题一起作为 Prompt 输入给 LLM,从而确保 LLM 的回答基于可靠的、最新的企业内部知识。这些向量在多维空间中捕捉文本的语义信息,相似的文本具有相近的向量。Pinecone: 作为一家领先的托管式向量数据库服务商,Pinecone 提供了高性能、高可用、可大规模扩展的解决方案,能够高效地存储和检索海量企业知识的向量表示,非常适合满足企业级应用对性能、易用性和管理的需求。

WSHAN_GEO的博客 845

基于langchain实现LLM基础RAG金融知识问答

文章介绍了基于LangChain框架实现的基础RAG流程,让用户快速掌握大模型的知识库问答实现逻辑

qq_42735683的博客 2959

基于LangChain-Chatchat实现的RAG-本地知识库的问答应用[1]-最新版快速实践并部署(检索增强生成RAG大模型)

基于LangChain-Chatchat实现的RAG-本地知识库的问答应用[1]-最新版快速实践并部署(检索增强生成RAG大模型)

丨汀、的博客 5603

PCB之AD层次化原理图设计

PCB之AD层次化(模块化)原理图设计 软件版本:AD17.1.9(bBuild 592) 先上效果图: 可以看到,图中有RS485和W5500这两个部分是复用了原理图,当项目中需要多个功能相同的电路时,这种设计就可以大大节约PCB布局布线的时间,方法后面介绍; 1.首先确定好项目中个部分电路的功能模块 不同功能的电路分开不同原理图画,然后给出输入输出端口,这样方便复用,下面是实例项目的功能划分 2.单个模块电路的接口设计 这里以W5500以太网接口电路为例说明: 主要就分为通讯接口和电源接口:

洋洋洋的博客 3万+

Web开发者实战LangChain RAG:构建企业级知识库问答系统

在Web开发中,我们熟悉“数据 → 处理 → 展示”的经典流程:从前端表单收集用户输入,后端查询数据库,再将结果渲染成页面。而如今,当企业希望用自然语言查询内部文档(如产品手册、技术规范、HR政策),这套逻辑依然成立——只是“数据库”换成了向量数据库,“SQL查询”换成了语义搜索。 这就是 RAG(Retrieval-Augmented Generation) 的核心思想: 先从海量文档中检索出与问题最相关的片段,再将这些片段作为上下文喂给大模型,生成精准回答。对于Web开发者而言,RAG 并非全新

沛哥儿的专栏 1931

Python经常遇到导入xlwings就出错,如何解决

Python经常在导入xlwings时遇到错误。有人建议尝试重装或升级xlwings,但这些操作后仍然无法解决导入错误问题。

felix_8的博客 1740

基于LangChain构建高效RAG问答系统:向量检索与LLM集成实战

本文详细介绍了使用LangChain框架构建RAG问答系统的全流程。首先配置向量检索环境,包括Redis向量数据库和DashScope嵌入模型;然后设计提示模板整合检索结果与用户问题;接着调用通义千问模型生成基于上下文的回答;最后通过LangChain链式处理实现端到端问答流程。该系统有效结合了向量检索的准确性和大语言模型的生成能力,适用于企业知识问答等场景,避免了模型幻觉问题,同时具备良好的可扩展性和灵活性。

一次次探索代码无限可能的旅程,专注于前端、后端、服务器及AI大模型的分享和交流。与我一起踏上这段无尽的技术之旅吧! 3931

基于卷积神经网络的人脸识别算法

摘要:近年来,随着科学技术的不断发展,人脸识别技术日渐成熟,使得人脸识别技术的使用率不断增大。例如:门禁、ATM机、公安系统以及新兴起的人机交互等领域,都应用到了人脸识别系统。在人脸识别研究领域中,深度学习扮演着重要的角色。由于深度学习的人脸识别技术凭借其识别率高、识别快等特点,逐渐成为整个领域的主流技术。在众多深度学习算法中,以卷积神经网络为代表的人脸识别系统得到了广泛应用,主要研究内容如下:首先,通过对经典损失函数进行研究,对比每种损失函数的特点,然后根据A-Softmax函数进行改进,借助Margin

yyq2263511327的博客 1万+

单片机笔记十二:华大HC32L136超低功耗设计实战

本文详细介绍了华大HC32L136单片机的超低功耗设计实战,包括深度睡眠模式下仅0.5μA的电流消耗、五种功耗模式的对比与配置、外设使用技巧及硬件级优化方法。通过实际项目案例,展示了如何利用ARM Cortex-M0+内核的HC32L136显著延长电池寿命,适用于智能门锁、额温枪等低功耗设备。

weixin_29189373的博客 396

使用LangChain实现基于LLM和RAG的PDF问答系统

本篇主要介绍了通过Langchain工具包,来构造基于检索增强生成和大语言模型的PDF问答系统。由此可见,Langchain真的很强大,应用场景广泛。它的模块化设计、灵活性和扩展性使得它成为构建复杂 LLM 应用的理想选择。

weixin_45861152的博客 1689

rk3588s-摄像头适配gc8034

若还打开失败,需要看下XML中文件配置是否与DTS配置信息一致,或者XML参数配置是否有异常;MIPI摄像头是有上电时序要求,具体时序要查看sensor芯片对应的datasheet进行修改,如果时序不满足,sensor无法正常,此时用i2ctool去查看设备可能无法扫面到设备,即是i2c设备找不到。RK3588或者RK3588S有路MIPI-PHY,驱动开发工程师需要根据对应的硬件原图进行配置,以下会讲解分别使用MIPI-DPHY和MIPI-D/CPHY如何在DTS配置mipi摄像头的回环链路。

Yxx8066的博客 2200

RAG 示例:使用 langchain、Redis、llama.cpp 构建一个 kubernetes 知识库问答

RAG系统通过引入知识库,扩展了LLM对专业领域和实时信息的支持能力,使其在回答专业问题时更加准确高效。

凌虚Blog 1281

华为OD机试双机位C卷-几何平均值最大子数组(Py/Java/C/C++/Js/Go)

华为OD机试(机考)2026双机位C卷 【几何平均值最大子数组】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【几何平均值最大子数组】。

qq_45776114的博客 1367

【Unity 实用工具篇】✨| 使用Fungus插件制作一个对话系统,简单好学易上手

今天带来的是Unity中一款简单易用的对话插件Fungus,它是一个免费的交互式的对话系统。 Fungus是Unity免费的一款开源的插件,它可以无代码的实现玩家与NPC之间的对话,并且支持本地化,对相机、Sprite及音乐音效的控制。 学会使用该插件就可以做一些对话剧情类的游戏了,还是非常好用的,下面就来学习一下Fungus具体怎么使用吧!

努力前行,总会成为自己心中的那道光 1万+

基于LangChain+LLM的本地知识库问答:从企业单文档问答到批量文档问答_langchain 本地知识库

LangChain官方文档假如我们想要用openai api对一段文本进行总结,我们通常的做法就是直接发给 api 让他总结。但是如果文本超过了 api 最大的 token 限制就会报错。这时,我们一般会进行对文章进行分段,比如通过tiktoken计算并分割,然后将各段发送给 api 进行总结,最后将各段的总结再进行一个全部的总结。LangChain可以很好的帮我们处理这个过程,代码也很简单。# 导入文本# 将文本转成 Document 对象# 初始化文本分割器# 切分文本# 加载 llm 模型。

2401_85116933的博客 1000

端到端自动驾驶的精准测试场景开发

1. 背景介绍 自动驾驶技术的发展正在改变交通运输的未来,然而,要实现安全可靠的自动驾驶,需要进行大量的测试和验证。端到端自动驾驶系统的测试场景开发是实现这一目标的关键。本文将详细介绍端到端自动驾驶的精准测试场景开发,包括核心概念、算法原理、数学模型、项目实践,以及未来发展趋势。 2. 核心概念与联系

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 1319

解决 LLM 幻觉问题!RAG 技术原理、4 大检索策略及 AI 知识库问答系统实战(附代码)

解决 LLM 幻觉问题!RAG 技术原理、4 大检索策略及 AI 知识库问答系统实战(附代码)

youmaob的博客 1106

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【大模型实战】LangChain+RAG实战:从零构建大模型知识库问答系统!

本文介绍了使用LangChain框架构建RAG系统解决大模型幻觉问题的方法。教程涵盖环境配置、文档处理、向量数据库构建、大模型接入和问答链构建等步骤,通过LangChain组件与向量数据库结合,实现端到端问答任务,提升大模型回答准确性,包含具体代码实现和效果展示,适合开发者参考学习。

Trb701012的博客 862

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

产品视角的大模型RAG应用-知识库问答(一):LangChain初体验

从0到1开始做的过程中,参考了很多网上的教程和分享文章,其中绝大部分都是技术向的分享。感谢各位热爱总结和分享的开发大佬,让我在没有太多技术背景的情况下快速补齐了项目落地实践所需的基础知识。

pythonhy的博客 794

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 一文说清:大模型AI Agent在企业应用中的6种基础类型
下一篇: 用通俗易懂的方式讲解:一文详解大模型 RAG 模块
AI程序猿人
博客等级 码龄3年 6517粉丝 561原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值