第六届字节跳动青训营第二课(ai_文档QA系统) | 豆包MarsCode AI 刷题

159 阅读5分钟

Langchain快速入门对比了直接调用Openai和使用Langchain调用openai的textmodel和chatmodel,没啥可说的。

LangChain 实战课: DocQA.py - MarsCode

前言

框架的三个部分

  • 数据源(Data Sources):数据可以有很多种,包括PDF在内的非结构化的数据(Unstructured Data)、SQL在内的结构化的数据(Structured Data),以及Python、Java之类的代码(Code)。在这个示例中,我们聚焦于对非结构化数据的处理。
  • 大模型应用(Application,即LLM App):以大模型为逻辑引擎,生成我们所需要的回答。
  • 用例(Use-Cases):大模型生成的回答可以构建出QA/聊天机器人等系统。

具体流程

  1. Loading:文档加载器把Documents 加载为以LangChain能够读取的形式。
  2. Splitting:文本分割器把Documents 切分为指定大小的分割,我把它们称为“文档块”或者“文档片”。
  3. Storage:将上一步中分割好的“文档块”以“嵌入”(Embedding)的形式存储到向量数据库(Vector DB)中,形成一个个的“嵌入片”。
  4. Retrieval:应用程序从存储中检索分割后的文档(例如通过比较余弦相似度,找到与输入问题类似的嵌入片)。
  5. Output:把问题和相似的嵌入片传递给语言模型(LLM),使用包含问题和检索到的分割的提示生成答案

import

from langchain_community.document_loaders import PyPDFLoader
from langchain_community.document_loaders import Docx2txtLoader
from langchain_community.document_loaders import TextLoader
from langchain.embeddings.base import Embeddings
from langchain.pydantic_v1 import BaseModel
from volcenginesdkarkruntime import Ark
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Qdrant
from langchain.retrievers.multi_query import (
    MultiQueryRetriever,
)  # MultiQueryRetriever工具
from langchain.chains import RetrievalQA  # RetrievalQA链

导入不同类型的文档阅读器、导入嵌入模型容易理解。

  • langchain.pydantic_v1模块中导入BaseModel类。BaseModel是Pydantic库中的一个基础模型类,用于定义数据模型和数据验证。

  • 火山引擎相关的ai服务。

  • RecursiveCharacterTextSplitter是LangChain库中的一个文本分割器,它可以根据指定的字符和分割大小来递归地分割文本。这个类通常用于将长文本分割成较小的块,以便于后续的处理,比如嵌入和存储在向量数据库中。

  • 导入向量数据库Qdrant

  • MultiQueryRetriever提供了一种从多个查询中检索信息的方法。它可以根据一个初始查询生成多个不同的查询,然后从检索器中获取最相关的结果。这种方法可以提高检索的准确性和全面性。

  • RetrievalQA提供了一种基于检索的问答链。它可以从给定的文档集合中检索相关信息,并使用这些信息来回答问题。这种方法可以用于构建问答系统,其中问题的答案是从文档中提取的,而不是通过生成模型生成的。

Loading

读取各类文件,没啥说的。

Splitting

Loading步骤的文件拆分,chunk_size=chunk_overlap分别表示每个片段的最大长度和每个片段之间的重叠长度。

Storage

向量存储库中,location=":memory:" 表示in-memory 存储,数据库将被存储在内存中,而不是存储在磁盘上的文件中。这种方式通常用于临时存储或测试目的,因为它不需要创建或管理物理文件,并且数据在程序结束后会被自动清除。

词嵌入(Word Embedding)是自然语言处理和机器学习中的一个概念,它将文字或词语转换为一系列数字,通常是一个向量。提供了一种将文本数据转化为计算机可以理解和处理的形式,同时保留了词语之间的语义关系。

在众多的机器学习和人工智能应用中,尤其是自然语言处理和图像识别这类涉及大量非结构化数据的领域,将数据转化为高维度的向量是常见的处理方式。这些向量可能拥有数百甚至数千个维度,是对复杂的非结构化数据如文本、图像的一种数学表述,从而使这些数据能被机器理解和处理。

向量数据库具备高效存储和处理高维向量数据的能力,从而更好地支持涉及非结构化数据处理的人工智能应用。

Retrieval

先检索,后实例化问答链。

关心数量等大小差异时用欧氏距离,关心文本等语义差异时用余弦相似度。

具体来说,欧氏距离度量的是绝对距离,它能很好地反映出向量的绝对差异。当我们关心数据的绝对大小,例如在物品推荐系统中,用户的购买量可能反映他们的偏好强度,此时可以考虑使用欧氏距离。同样,在数据集中各个向量的大小相似,且数据分布大致均匀时,使用欧氏距离也比较适合。

余弦相似度度量的是方向的相似性,它更关心的是两个向量的角度差异,而不是它们的大小差异。在处理文本数据或者其他高维稀疏数据的时候,余弦相似度特别有用。比如在信息检索和文本分类等任务中,文本数据往往被表示为高维的词向量,词向量的方向更能反映其语义相似性,此时可以使用余弦相似度。

image.png

Output

使用flask轻量级后端框架开发,调用问答链输入问题即可实现。

(豆包Marscode连部署都做了,确实好用,赞👍!)

image.png