深化理解:RAG应用搭建进阶指南

news2024/11/23 11:58:32

大型语言模型(LLM)的文本推理能力,宛如一位博学的公民,其智慧之源来自于互联网上公开的文献宝库。想象一下,这位名为LLM的公民,如同一位勤奋的学者,借阅了图书馆中所有的书籍,并将这些知识深深地烙印在自己的记忆之中。然而,若有一本新书问世,尚未公开发行,那么LLM自然无法将其纳入自己的知识体系。因此,当我向LLM询问我的新书内容时,它显然无法给出答案。

解决之道显而易见——将我的新书“喂”给LLM,让它成为LLM知识库的一部分。这一过程,如同将新知注入智慧之泉,只能由我亲自完成。关键在于,何时将这份知识传递给LLM。

以考试为例,当被问及“1+1等于多少?”时,我们会在脑海中搜寻以往学过的知识,得出答案是3。或者,我们可能会偷偷翻阅书籍,现场查找答案。这两种方法都能帮助我们回答问题,同样地,让LLM回答问题也需要这样的过程。我们需要确保LLM能够获取最新的知识,以便它能够准确无误地回答问题,就像我们在考试中运用所学知识一样。

在大型语言模型(如GPT系列)的背景下,"预训练"和"知识提示"是两种不同的方法,用于准备模型以回答问题或执行特定任务。

    • 预训练(Pre-training):

预训练是指在大量文本数据上训练模型,使其学习语言的通用模式和结构。这个过程不针对特定任务,而是让模型掌握语言的一般知识。预训练通常涉及一个大规模的神经网络,如Transformer,它在无监督的情况下学习预测文本中的下一个词或掩盖的词。预训练的模型可以捕捉到丰富的语言表示,包括语法、常见的短语、事实知识等。

预训练完成后,模型可以通过微调(Fine-tuning)来适应特定任务,如问答、文本分类或翻译。微调是在特定任务的数据集上进行的,目的是调整模型的参数,使其更好地适应这些任务的要求。

    • 检索增强生成(Retrieval-augmented Generation【RAG】):

RAG是一种在推理或回答问题时向模型提供额外信息的技术。这通常涉及将相关知识或上下文信息作为输入的一部分提供给模型。例如,如果模型需要回答一个关于特定历史事件的问题,可以将该事件的摘要或关键事实作为提示输入给模型。

RAG可以是在线查询外部知识库,也可以是预先准备的知识片段,如维基百科文章的摘要。这种方法允许模型在回答问题时利用外部知识,即使这些知识没有在预训练过程中直接学习到。

总结来说,预训练是让模型学习通用语言知识的过程,而RAG是在特定任务中为模型提供额外信息的方法。两者可以结合使用,以提高模型在特定任务上的性能。预训练提供了基础的语言理解能力,而知识提示则提供了任务相关的具体信息,帮助模型做出更准确的回答。

确实,预训练模型方案对于个人和大多数企业而言,无疑是一座高耸的技术山峰,其难度和成本令人望而却步。它不仅需要巨额的算力资源和专业人才的投入,还对数据的数量与质量有着近乎苛刻的要求。此外,模型的调优过程漫长而复杂,如同在迷雾中寻找正确的航道,需要耐心和细致的探索。对于那些有志于深入这一领域的小伙伴们,这无疑是一场智力和耐力的双重考验。

然而,在技术的海洋中,我们并非只有一条航道。面对预训练模型的重重困难,我们可以选择一条更为平坦的道路前行。正如在知识的海洋中,我们更倾向于在有参考资料的情况下答题,而不是在没有任何辅助的闭卷考试中挣扎。因此,我们转向了“知识提示”方案,这是一种更为灵活、成本更低的方法。

实际上,几乎所有的个人问答聊天系统都采用了“RAG”方案。这种方法通过提供关键信息或提示,引导模型生成更准确的回答。它不需要庞大的预训练模型,也不需要海量的数据和长时间的调优,而是通过巧妙的提示设计,让模型在有限的资源下发挥出最大的效能。这种方法的灵活性和实用性,使其成为了个人和企业构建智能问答系统的理想选择。

在技术的探索之路上,我们不必拘泥于一种方法,而是要根据实际情况,选择最适合自己的道路。无论是攀登预训练模型的高峰,还是选择“知识提示”的平坦小径,我们的目标始终是让技术更好地服务于人类。

from zhipuai import ZhipuAI

from info import key

client = ZhipuAI(api_key=key)  # 请填写您自己的APIKey
response = client.chat.completions.create(
    model="glm-4",  # 填写需要调用的模型名称
    messages=[
        {"role": "system", "content": "你是一个乐于解答各种问题的助手,你的任务是为用户提供专业、准确、有见地的建议。"},
        {"role": "user","content": "已知小头的爸爸叫做大头,大头的爸爸叫做老王。请问小头的爷爷叫什么名字?"},
    ],
    stream=True,
)
for chunk in response:
    print(chunk.choices[0].delta.content,end='')

所以,作弊的老王你慌了么?

向量数据库

设想一下,若您的著作洋洋洒洒,涵盖两千万字的浩瀚篇章,共分2000章。此刻,您好奇地探询:“第1000章究竟描绘了何种精彩?”显然,我们无法将整部巨著作为提示,一股脑儿地输入系统。这不仅会使理解过程变得繁琐,而且冗余的信息可能会扰乱分析,更不用说,过长的提示将触及模型的长度限制,可能导致信息截断,使得答案失去意义,同时,这也意味着成本的急剧上升,经费在无声中燃烧。理想的做法就是只要把第1000章检索出来,当做提示词喂给llm即可。

文档格式的无规则,大体量导致了不能使用常用的数据库存储检索,这时候就需要用到向量数据库(Vector Database),也叫矢量数据库,主要用来存储和处理向量数据。图像、文本及音视频这类非结构化数据,皆可通过特定的转换或嵌入学习技术,被映射为向量形式,进而存储于向量数据库之中。这一过程使得我们能够对这些数据进行基于相似性的搜索与检索。

简言之,向量数据库赋予了我们依据数据的语义或上下文关联性,而非传统的精确匹配或固定标准,来发现最接近或最相关信息的能力。

向量数据库的核心优势在于其卓越的存储与检索效率。通过采用先进的索引策略和向量搜索算法,它能够在高维数据海洋中迅速定位所需信息。尽管向量数据库以管理向量数据见长,它同样能够处理传统的结构化数据。在实际应用中,许多场景要求同时对向量和结构化字段进行筛选与检索,这对向量数据库而言,既是其功能的展现,也是对其性能的考验。

把一份文档存进向量数据库主要是分为四步(ps:上图来自langchain,下面的也会大量使用langchain的包,langchain后面再说)

    1. LOAD:加载文件
from langchain_community.document_loaders import TextLoader
loader = TextLoader("./index.md")
loader.load()

    1. SPLIT:分割,选择合适的[分割器]将大文本分割Documents成更小的文本块。这对于索引数据和将其传递到模型都很有用,因为大块更难搜索并且不适合模型的有限上下文窗口。
    2. ENBED:嵌入,需用用到向量化模型,把上面分割出来的小文本块处理为数字向量。嵌入技术之所以至关重要,是因为它能够捕捉并表达词汇或句子的深层语义。通过将单词映射到连续的实值向量空间,嵌入模型能够揭示单词之间的内在联系。这种映射是基于单词在大量文本语料库中的共现模式来学习的,即单词如何频繁地在相似的语境中一同出现。例如,如果两个单词在多种语境中常常相伴出现,它们的嵌入向量在多维空间中将彼此靠近。这种空间上的邻近性反映了它们在语义上的相似性,表明这两个单词共享相近的意义和语境关联。因此,嵌入向量不仅代表了单个单词的含义,还揭示了单词间复杂的语义关系,为自然语言处理任务提供了强大的语义理解基础。

一个好的embed模型对后续的检索至关重要,下面是一张目前对中文语义的模型排行榜

下面的模型都能在[魔搭社区]找到

    1. STORE:存储,常用向量数据库有的有Faiss,Milvus,vectorstore,通过pip命令安装即可

基于文档提问

把文档切分,向量化后存储在向量数据库中的目的就是为了在提问的时候,检索相似的文档,把文档组装成为提示器,给到llm推理。

送给llm的提示词结构大概的语法就是:

根据历史会话和新已知:{检索出来的文档}。回答以下问题:" + {问题}

  1. Retrieve :给定用户输入,使用Retriever(检索器)从存储中检索相关的分割文档,也叫召回。
  2. PROMPT:把文档和问题组装成为提示词,让llm使用包含问题和检索到的数据的提示生成答案

案例

把[📎招聘信息.docx]进行嵌入并保存在Faiss中,根据提问的问题检索出对应的文档当做提示词,发送给llm模型回答

  1. 下载embedding模型
# 大文件通过git命令可能无法下载,或需自己去仓库中下载
git clone https://www.modelscope.cn/maidalun/bce-embedding-base_v1.git

  1. 让llm基于文档回答问题
import os

from docx import Document
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
from pypinyin import pinyin, Style

from LlmClient import LlmClient

# 第一步:割分文档
filepath = '/Users/yy/Downloads/招聘信息.docx'
# 打开Word文档
doc = Document(filepath)

# 读取文档内容
content = ' '.join([paragraph.text for paragraph in doc.paragraphs])

# 创建文本分割器
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=30)
# 分割文本
splits = text_splitter.split_text(content)

# 第二步:文档嵌入
# 获取文件名
file_name = os.path.basename(filepath)
# 将文件名转换为拼音
pinyin_names = pinyin(file_name, style=Style.NORMAL)
# 生成数据库id
kb_id = ''.join([item[0] for item in pinyin_names]).replace('.', '_')

faiss_index_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), kb_id, 'faiss_index')

# 创建嵌入模型
embedding_path = "/Users/yy/Documents/yy_work/pywork/bce-embedding-base_v1"
embeddings = HuggingFaceEmbeddings(model_name=embedding_path)

if os.path.exists(faiss_index_path):
    print("Index loaded from:", faiss_index_path)
    index = FAISS.load_local(folder_path=faiss_index_path, embeddings=embeddings, allow_dangerous_deserialization=True)
else:
    # 创建索引
    index = FAISS.from_texts(
        texts=[doc for doc in splits],
        embedding=embeddings
    )
    # 保存索引
    index.save_local(folder_path=faiss_index_path)
    print("Index saved to:", faiss_index_path)

# 基于问题检索出类似的文档段落,喂给llm,llm经过推理后获取答案
llm_client = LlmClient()
while True:
    user_input = input("请输入文字,按回车键确认:")
    # 检查用户是否想要退出
    if user_input.lower() == 'exit':
        print("程序退出。")
        break
    # 执行相似性搜索,并返回与给定查询最相似的前k个结果。
    result_list = index.similarity_search(user_input, k=3)
    llm_client.query(prompt=';'.join(doc.page_content for doc in result_list),
                     user_input=user_input)

在这里插入图片描述

如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

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

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

相关文章

杀疯了深度解析chatGPT和NLP底层技术——复旦大学新版《自然语言处理导论》

在今年的2月28号,复旦张琦教授放出了自己的大招,发布了自己历时近三年之久,即自身对自然语言处理20年研究的著作 全文共 600页, 涉及了 787 篇参考文献, 全面且深度的解析了与NLP的底层知识。 内容介绍: …

【C++ Primer Plus】4

2 字符串 字符串是存储在内存的连续字节中的一系列字符;C处理字符串的方式有两种, c-风格字符串(C-Style string)string 类 2.1 c-风格字符串(C-Style string) 2.1.1 char数组存储字符串(c-…

网 络 安 全

网络安全是指保护网络系统及其所存储或传输的数据免遭未经授权访问、使用、揭露、破坏、修改或破坏的实践和技术措施。网络安全涉及多个方面,包括但不限于以下几个方面: 1. 数据保护:确保数据在传输和存储过程中的完整性和保密性,…

微服务es+Kibana解析部署使用全流程

1、介绍 ElasticSearch是Java开发的一款开源的,分布式的搜索引擎。 它的搜索采用内存中检索的方式,大大提高了检索的效率,es是基于REST API的方式对数据操作的,可以让存储、检索、索引效率更高。 1、es可以做什么 网站检索数据…

python爬虫 - 深入requests模块

🌈个人主页:https://blog.csdn.net/2401_86688088?typeblog 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html 目录 ​编辑 前言 一、下载网络文件 (一)基本步骤 &#xff0…

【AIGC】如何选择AI绘画工具?Midjourney VS Stable Diffusion

前言 文章目录 💯如何选择合适的AI绘画工具 个人需求选择比较工具特点社区和资源 💯 Midjourney VS Stable Diffusion:深度对比与剖析 使用费用对比使用便捷性与系统兼容性对比开源与闭源对比图片质量对比上手难易对比学习资源对比作品版权问…

Vue入门-指令学习-v-else和v-else-if

v-else和v-else-if 作用&#xff1a;辅助v-if进行判断渲染 语法&#xff1a;v-else v-else-if"表达式" 注意&#xff1a;需要紧挨着v-if一起使用 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><m…

九大排序之插入排序

1.前言 插入排序是把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。实际中我们玩扑克牌时&#xff0c;就用了插入排序的思想。 本章重点&#xff1a;主要着重的介绍两种插入排序…

【JavaEE】【多线程】进程与线程的概念

目录 进程系统管理进程系统操作进程进程控制块PCB关键属性cpu对进程的操作进程调度 线程线程与进程线程资源分配线程调度 线程与进程区别线程简单操作代码创建线程查看线程 进程 进程是操作系统对一个正在运行的程序的一种抽象&#xff0c;可以把进程看做程序的一次运行过程&a…

开发自定义starter

环境&#xff1a;Spring Cloud Gateway 需求&#xff1a;防止用户绕过网关直接访问服务器&#xff0c;用户只需引入依赖即可。 1、创建项目 首先创建一个spring boot项目 2、配置pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xm…

国外电商系统开发-运维系统文件上传

文件上传&#xff0c;是指您把您当前的PC电脑上的文件批量的上传到远程服务器上&#xff0c;在这里&#xff0c;您可以很轻松的通过拖动方式上传&#xff0c;只需要动动鼠标就搞定。 第一步&#xff0c;您应该选择要上传的服务器&#xff1a; 选择好了以后&#xff0c;点击【确…

SpringBoot框架下的教育系统开发全解析

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理微服务在线教育系统的相关信息成为必然。开…

毕业设计项目——基于transformer的中文医疗领域命名实体识别(论文/代码)

完整的论文代码见文章末尾 以下为核心内容 摘要 近年来&#xff0c;随着深度学习技术的发展&#xff0c;基于Transformer和BERT的模型在自然语言处理领域取得了显著进展。在中文医疗领域&#xff0c;命名实体识别(Named Entity Recognition, NER)是一项重要任务&#xff0c;旨…

ArkUI中的状态管理

一、MVVM ArkUI提供了一系列装饰器实现ViewModel的能力,如@Prop、@Link、@Provide、LocalStorage等。当自定义组件内变量被装饰器装饰时变为状态变量,状态变量的改变会引起UI的渲染刷新。 在ArkUI的开发过程中,如果没有选择合适的装饰器或合理的控制状态更新范围,可能会导…

《大规模语言模型从理论到实践》第一轮学习笔记

第一章 绪论 本章主要介绍大规模语言模型基本概念、发展历程和构建流程。 大规模语言模型&#xff08;Large Language Models&#xff0c;LLM&#xff09;&#xff0c;也称大语言模型 或大型语言模型。 1.1 大规模语言模型基本概念 1.语言模型&#xff08;Language Model&a…

重学SpringBoot3-集成Redis(五)之布隆过滤器

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;五&#xff09;之布隆过滤器 1. 什么是布隆过滤器&#xff1f;基本概念适用场景 2. 使用 Redis 实现布隆过滤器项目依赖Redis 配置…

Spring开发最佳实践之跨域处理

1. 跨域处理 1.1 异常现象 1.2 异常原因分析 跨源资源共享的官方定义如下&#xff1a; 跨源资源共享&#xff08;CORS&#xff0c;Cross Origin Resource Sharing。或通俗地译为跨域资源共享&#xff09;是一种基于 HTTP 头的机制&#xff0c;该机制通过允许服务器标示除了它自…

上海理工大学《2023年+2019年867自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《上海理工大学867自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2023年真题 2019年真题 Part1&#xff1a;2023年2019年完整版真题 2023年真题 2019年…

Java使用线程池创建线程

一、线程前言 首先我们知道&#xff0c;线程的概念如果不知道可以去看这一篇Java中的线程&#xff0c;我们这篇主要讲述的是Java怎么使用线程池创建线程&#xff0c;首先我们要对线程池有点概念&#xff0c;其实顾名思义&#xff0c;线程池就是有喝多线程的一个池子类似于&…

一书讲透LLM大语言模型,《掌握大型语言模型》,看完我都懵了!

《掌握大型语言模型》 &#xff08;Mastering Large Language Models&#xff09;由Sanket Subhash Khandare撰写&#xff0c;是一本关于大型语言模型&#xff08;LLMs&#xff09;的高级技术、应用、前沿方法和顶尖模型的指南。 这本大模型书已经上传CSDN&#xff0c;朋友们如…