AI大语言模型LLM学习-语义检索(RAG前导篇)

系列文章


1. AI大语言模型LLM学习-入门篇
2. AI大语言模型LLM学习-Token及流式响应
3. AI大语言模型LLM学习-WebAPI搭建
4.AI大语言模型LLM学习-基于Vue3的AI问答页面


前言


大语言模型中存在的过时、不准确、幻觉、一本正经的胡说八道、基于互联网数据训练这些缺点,因此,直接使用大语言模型生成的内容在商业场景中,特别是涉及到一些专业领域以及私有数据的场景,是无法提供准确或有价值的信息的。因此,大模型的应用通常需要与搜索技术相结合。
所谓语义检索(也称基于向量的检索),是指检索系统不再拘泥于用户字面本身,而是能精准捕捉到用户的真正意图并以此来搜索,从而更准确地向用户返回最符合的结果。通过使用最先进的语义索引模型找到文本的向量表示,在高维向量空间中对它们进行索引,并度量查询向量与索引文档的相似程度,从而解决了关键词索引带来的缺陷。


一、LLM的局限性


1.缺少细分领域知识

尤其缺乏专业领域以及私有数据。

2.幻觉问题

LLM可能生成看似合理但实际错误的信息,即“幻觉”。

3.信息时效性问题

比如在kimi中询问知识库的更新时间,会得到“截止日期是2023年”的答复。
在这里插入图片描述
通义千问的回复:
在这里插入图片描述
文心一言的回复:
在这里插入图片描述
对比了这三家,感觉文心一言要NB一些。

4.预训练数据不可变

LLM的性能高度依赖于训练数据的质量和规模,数据准备成本高。


二、Embedding


在自然语言处理(NLP)领域,分词和Embedding是两个基础且重要的概念。分词是将文本切分为单词或词汇单元的过程,而Embedding则是将这些词汇转换为可供机器学习模型处理的数值向量。
通过Embedding,每个单词或句子都可以用一个实数向量来表示,这个向量中包含了该单词或句子的语义信息。这样,相似的单词或句子就会在嵌入空间中被映射为相近的向量,具有相似语义的词语或句子在向量空间上的距离也会较近。这使得在进行自然语言处理任务时,可以通过计算向量之间的距离或相似度来进行词语或句子的匹配、分类、聚类等操作。
在这里插入图片描述

2.1 Embedding技术的关键特性

  • 分布式表示:每个词汇被表示为一个高维空间中的点,而不是单一的索引或符号。
  • 上下文感知:Embedding通常考虑词汇的上下文信息,即同一个词在不同的上下文中可能有不同的表示。
  • 语义相似性:在嵌入空间中,语义相近的词汇会被映射到相近的位置。

2.2 常见的Embedding模型

  • BGE:即BAAI General Embedding,是由智源研究院(BAAI)团队开发的一款文本Embedding模型。该模型可以将任何文本映射到低维密集向量,这些向量可用于检索、分类、聚类或语义搜索等任务。此外,它还可以用于LLMs的向量数据库。
  • GTE:也称为General Text Embeddings,是阿里巴巴达摩院推出的文本Embedding技术。它基于BERT框架构建,并分为三个版本:GTE-large、GTE-base和GTE-small。
  • E5 Embedding:E5-embedding是由intfloat团队研发的一款先进的Embedding模型。E5的设计初衷是为各种需要单一向量表示的任务提供高效且即用的文本Embedding,与其他Embedding模型相比,E5在需要高质量、多功能和高效的文本Embedding的场景中表现尤为出色。
  • Jina Embedding:jina-embedding-s-en-v1是Jina AI的Finetuner团队精心打造的文本Embedding模型。它基于Jina AI的Linnaeus-Clean数据集进行训练,这是一个包含了3.8亿对句子的大型数据集,涵盖了查询与文档之间的配对。这些句子对涉及多个领域,并已经经过严格的筛选和清洗。值得注意的是,Linnaeus-Clean数据集是从更大的Linnaeus-Full数据集中提炼而来,后者包含了高达16亿的句子对。
  • Instructor:Instructor是由香港大学自然语言处理实验室团队推出的一种指导微调的文本Embedding模型。该模型可以生成针对任何任务(例如分类、检索、聚类、文本评估等)和领域(例如科学、金融等)的文本Embedding,只需提供任务指导,无需任何微调。Instructor在70个不同的Embedding任务(MTEB排行榜)上都达到了最先进的性能。该模型可以轻松地与定制的sentence-transformer库一起使用。
  • XLM-Roberta:简称XLM-R,是Facebook AI推出的一种多语言版本的Roberta模型。它是在大量的多语言数据上进行预训练的,目的是为了提供一个能够处理多种语言的强大的文本表示模型。XLM-Roberta模型在多种跨语言自然语言处理任务上都表现出色,包括机器翻译、文本分类和命名实体识别等。
  • text-embedding-ada-002
    text-embedding-ada-002是一个由Xenova团队开发的文本Embedding模型。该模型提供了一个与Hugging Face库兼容的版本的text-embedding-ada-002分词器,该分词器是从openai/tiktoken适应而来的。这意味着它可以与Hugging Face的各种库一起使用,包括Transformers、Tokenizers和Transformers.js。

2.3 Embedding模型的选择

根据网友《Embedding模型的选择》一文的推荐及测试,选择了“BAAI/bge-large-zh-v1.5”模型。
当然,各位也可以尝试选择其它模型:
https://github.com/FlagOpen/FlagEmbedding/blob/master/README_zh.md


三、“BAAI/bge-large-zh-v1.5”模型下载


官网下载地址:
https://huggingface.co/BAAI/bge-large-zh-v1.5
由于大家心知肚明的原因,你可能无法正常访问并下载此模型(文件大小:1.3GB)。
幸好,国内与huggingface齐名的魔搭社区也提供了模型下载:
https://www.modelscope.cn/models/Xorbits/bge-large-zh-v1.5/files
可使用git命令进行下载

git clone https://www.modelscope.cn/Xorbits/bge-large-zh-v1.5.git

下载后,请检查文件是否完整,否则后面运行代码将报错。
在这里插入图片描述


四、基于Embedding模型进行文档内容检索


本章节将结合代码介绍文档内容检索,原始文档使用《证券法(2019修订).pdf》,可通过下面的链接进行下载。

证券法(2019修订).pdf

4.1 相关依赖安装

此示例需要安装两个依赖库:

  • langchain-community:包含由LangChain社区维护的第三方集成,其中含有向量数据库。
  • pypdf:是一个用于处理 PDF 文件的 Python 库。它提供了一组工具和功能,用于读取、解析和操作 PDF 文件的内容。
pip install -U langchain-community
pip install pypdf
pip install sentence-transformers
pip install -U langchain-huggingface

4.2 代码

from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma


# 加载pdf文档
def load_data(data_file):
    loader = PyPDFLoader(data_file)
    documents = loader.load_and_split()
    text_splitter = RecursiveCharacterTextSplitter(separators=["。"], chunk_size=512, chunk_overlap=32)
    texts_chunks = text_splitter.split_documents(documents)
    return texts_chunks

# pdf文档路径
data_file = "E:\\SoureCode\\AI\\ai-study\\pdf\\证券法(2019修订).pdf"
docs = load_data(data_file)
# embedding模型路径
embed_path = "E:\\SoureCode\\AI\\ai-study\\model\\bge-large-zh-v1.5"
embeddings = HuggingFaceEmbeddings(
        model_name=embed_path,
        model_kwargs={"device": "cuda"},
        encode_kwargs={"normalize_embeddings": True},
    )
vectordb = Chroma.from_documents(docs, embeddings)
#创建检索器,让它每次只返回1条最相关的文档:search_kwargs={"k": 1}
retriever = vectordb.as_retriever(search_kwargs={"k": 1})
while True:
    query = input("\n请输入你需要查询的内容,按q退出:")
    if query == "q":
        break
    else:
        docs = retriever.get_relevant_documents(query)
        print("找到记录数:"+str(len(docs)))
        print(docs)

4.3 问题

运行代码出现错误:
cannot import name 'is_mlu_available' from 'accelerate.utils'
解决办法:

pip install --upgrade accelerate

4.4 验证

对于我这个证券门外汉来说,检索到的内容是否准确,我也不能有个清晰的判断,于是在网上找了一篇题库,随机找了几个验证了一下。
证券市场基本法律法规部分(共68个)
在这里插入图片描述
这样的命令行输出,是不是太low?体验太差,是的,我也觉得是,使用webAPI+vue3配合在网页中使用!
在这里插入图片描述
有关实现细节请参考本专栏的如下两篇文章:
AI大语言模型LLM学习-WebAPI搭建
AI大语言模型LLM学习-基于Vue3的AI问答页面

测试下来效果还可以,需要指出的是,在本文中我们用到的retriever = vectordb.as_retriever(search_kwargs={“k”: 1}),只返回1条最相关的文档,在实际的场景中需要调整这个参数,否则有可能造成真实信息的丢失。

引用

1、在应用大模型的场景中,我们该如何使用语义搜索?
2、大模型相关技术-embedding与分词
3、开发RAG应用,你必须知道的7个Embedding模型
4、高级RAG(一):Embedding模型的选择

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值