LangChain入门学习笔记(七)—— 使用检索提高生成内容质量

大模型训练使用的数据是开放的、广泛的,因此它显得更加的通用。然而在有些应用场景下,用户需要使用自己的数据使得大模型生成的内容更加贴切,也有时候用户的数据是敏感的,无法提供出来给大模型进行通用性的训练。RAG技术就是一种解决这种问题的方法。关于RAG的简单介绍,可以看笔者的这篇文章。

一个基于RAG技术的大语言模型应用的架构示意图如下所示:

  • 用户的私有数据(这里以Document表示)经过嵌入模型转换成对应的embedding存入Vector Store中:Document --> Embedding --> Vector Store。
  • 使用者输入提示语Prompt,该Prompt也经过嵌入模型转换,然后转换后的结果作为查询条件在Vector Store中按照相似度查询出相关信息。这个结果解码后供大模型检索(Retrieve): Prompt --> Embedding --> Vector Store --> LLMs / Chat Models。
  • 将前一步查询到的上下文内容和用户的prompt一并输入大模型来生成最终输出:Prompt --> LLMs / Chat Models --> Output。

LangChain对上述的过程进行支持,除了Prompt --> LLMs / Chat Models --> Output这条线在前面的Model I/O介绍之外,还有下面跟RAG相关的内容:

  • Document Loaders:提供超过100种的文档加载器,覆盖类似PDF / Microsoft Office / JSON / CSV等等格式数据的加载。可以是本地的文档,也可以是在线的文档。
  • Text Splitters:将加载的文档进行切割,这个数据预处理操作使得切割后的数据块内容更具相关性,为后续的检索操作提供更高质量的数据。
  • Embedding Models:计算机不认识文字,它使用的是向量数据来计算相关文字的概率。因此需要将原始输入的文字转成相关向量,转换过程通过Embedding Models完成。
  • Vector Stores:Embedding的存储场所,通过向量数据库提升embedding的查询和存储的效率。
  • Retrievers:从Vector Stores中获取相关的数据,结合Prompt一块提供给大模型进行内容生成。
  • Indexing:一个辅助功能,通过记录管理器(RecordManager)跟踪文档写入Vector Store中的情况。

上面的每一部分都包含LangChain实现的或者第三方提供的类,可以根据开发者的业务需要来挑选合适的实现。由于类别很多,限于篇幅不一一介绍,大家可以先通过这里的目录确定自己需要的工具。

下面简单实现一个基于LangChain的RAG代码:

from langchain_community.chat_models import ChatOllama
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import FAISS
from langchain import hub
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough# 使用PyPDFLoader加载pdf文件内容
loader = PyPDFLoader("example_data/LayoutParser-A-Unified-Toolkit-for-DeepLearning-Based-Document-Image-Analysis.pdf")
# 加载并切割,默认splitter为:RecursiveCharacterTextSplitter
pages = loader.load_and_split()# 使用OllamaEmbeddings进行编码,本地ollama部署了phi3模型
ollama_embeddings = OllamaEmbeddings(model="phi3")# 使用FAISS作为vector store,将文档内容使用phi3模型embedding编码后存入。
faiss_index = FAISS.from_documents(pages, ollama_embeddings)# 使用Maximum Marginal Relevance search (MMR)算法搜索4个相近上下文
retriever = faiss_index.as_retriever(search_type="mmr", search_kwargs={"k": 4})def format_docs(docs):return "\n\n".join(doc.page_content for doc in docs)# LCEL语法构造chain,并调用获得答案
prompt = hub.pull("rlm/rag-prompt")example_messages = prompt.invoke({"context": "filler context", "question": "filler question"}).to_messages()llm = ChatOllama(model="phi3")rag_chain = ({"context": retriever | format_docs, "question": RunnablePassthrough()}| prompt| llm| StrOutputParser()
)for chunk in rag_chain.stream("How does LayoutParser work in document analysis?"):print(chunk, end="", flush=True)

调用获得的输出(每次执行的结果不确定一样):

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

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

相关文章

我是如何使用ai来对uwsgi与nginx的配置进行排查的

以下案例都使用英文来进行询问与排错,原因是因为中文排查结果与实际并不相符 uwsgi的配置排查 1:现在我有2个容器,第一个容器是nginx镜像制作出来的容器,用于作为代理服务器 2:第二个容器是python镜像制作出来的容器,在这个python容器里面安装了django与uwsgi,在这…

linux服务器 部署jenkins

在 Linux 服务器上部署 Jenkins 通常包括以下几个步骤: 更新系统软件包: sudo apt update sudo apt upgrade 安装 Java: Jenkins 需要 Java 运行时环境。推荐使用 OpenJDK 11。 sudo apt install openjdk-11-jdk 添加 Jenkins 软件源并导入…

真北6月小结:于旷野撒野,于轨道修道

一、跑步 1、运动数据 6月跑步111.28公里,时长13:30:48,平均配速717",共19次,其中3次十公里,分别在千灯湖、梧州、二沙岛。 早起120个仰卧起坐,12个俯卧撑,120个深蹲…

Spring boot中如何使用Thymeleaf模板

大家好,我是 网创有方。今天给大家分享下Spring boot中如何使用Thymeleaf模板。 在 IntelliJ IDEA 中使用 Thymeleaf 模板引擎来开发 Spring Boot 应用程序是相对简单的。以下是一些基本步骤,帮助你在 IDEA 中设置和使用 Thymeleaf: 创建一个…

在 CentOS 8 Stream 上直接安装 Docker CE 的方法可能会受到一些限制,但我们可以尝试使用另一种方法来安装 Docker

在 CentOS 8 Stream 上安装 Docker 由于在 CentOS 8 Stream 上直接使用官方仓库安装 Docker CE 可能会有问题,您可以尝试通过 Docker 官方提供的安装脚本来安装 Docker。以下是具体步骤: 下载 Docker 安装脚本: curl -fsSL https://get.dock…

LabVIEW项目外协时选择公司与个人兼职的比较

​在选择LabVIEW项目外协合作伙伴时,外协公司和个人兼职各有优劣。个人兼职成本较低且灵活,但在可靠性、技术覆盖面、资源和风险管理上存在不足。而外协公司拥有专业团队、丰富资源、完善的项目管理和风险控制,尽管成本较高,但能提…

基于单片机火灾自动报警系统设计

摘 要: 我国的火灾自动报警技术已经相对的较为成熟,随着信息技术的发展,网络化、信息化在火灾自动报警器上的应用也越来越多。无线通信的方式使得报警器本身可以方便的应用于大大小小的环境,例如工厂、社区和学校等等。通过对单片…

音频分离人声和伴奏可以实现吗?手机人声分离工具10款无偿分享!

随着科技的飞速发展,音频处理技术已经取得了显著的进步,其中音频分离人声和伴奏已成为现实。这一技术不仅为音乐制作人和音频工程师提供了便利,更为广大音乐爱好者提供了无限的创作可能性。本文将为大家分享10款手机人声分离工具,…

Java知识点整理 16 — Spring Bean

在之前的文章 Java知识点整理 8 — Spring 简介 中介绍了 Spring 的两大核心概念 IoC 和 AOP,但对 Spring Bean 的介绍不全面,本文将补充 Spring 中 Bean 的概念。 一. 什么是 Spring Bean 在 Spring 官方文档中,对 bean 的定义为&#xf…

JVM原理(二):JVM之HotSpot虚拟机中对象的创建寻位与定位整体流程

1. 对象的创建 遇到new指令时 当Java虚拟机遇到一个字节码new指令时。 首先会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否被加载、解析和初始化过。 如果没有,那么必须执行类的加载过程(加载、检查…

npm安装依赖报错——npm ERR gyp verb cli的解决方法

1. 问题描述 1.1 npm安装依赖报错——npm ERR! gyp verb cli npm MARN deprecated axiosQ0.18.1: critical security vuLnerability fixed in v0.21.1. For more information, npm WARN deprecated svg001.3.2: This SVGO version is no Longer supported. upgrade to v2.x.x …

Python爬虫技术与反爬虫策略

Python爬虫技术与反爬虫策略 概述User-Agent 伪造应对302重定向IP限制与代理使用Cookies和Session管理动态内容加载数据加密与混淆请求频率限制爬虫检测算法法律与道德考量结语 概述 在数字化时代,网络数据采集已成为获取信息的重要手段之一。然而,随着…

华为实训案例

案例下载 案例内包含空拓扑图、配置完整的拓扑、以及步骤脚本文档,可按需下载。 拓扑图 任务清单 (一)基础配置 根据附录1拓扑图、附录2地址规划表、附录3设备编号表,配置设备接口及主机名信息。 将所有终端超时时间设置为永不…

SOLIDWORKS卡顿反应慢怎么解决 慧德敏学

如果您的SOLIDWORKS软件运行缓慢或反应迟钝,可以尝试以下方法来提高性能和响应速度: 一、硬件检查与升级: 检查计算机硬件配置是否满足SOLIDWORKS官方推荐的要求,特别是CPU、内存和显卡。如果配置较低,考虑升级硬件以…

postgrel的SQL 的执行顺序

在 PostgreSQL 中,SQL 查询的执行顺序一般按照以下步骤进行: FROM 子句: 查询首先从 FROM 子句开始,确定要检索数据的表或视图。 WHERE 子句: 如果有 WHERE 子句,会根据 WHERE 子句中的条件来筛选数据。这…

哨兵模式--哨兵节点的功能?

哨兵节点的主要功能有: 集群监控:监控 主、从节点的健康状况;自动切换主节点:当 Master 运行故障,哨兵启动自动故障恢复流程:从 slave 中选择一台作为新 master。通知:让 slave 执行 replicaof…

社交风潮塑造者:探索用户在Facebook的影响力

在当今数字化社会中,Facebook不仅是人们社交互动的主要平台,更是塑造社交风潮和文化趋势的重要力量。本文将从另一个角度深入探讨用户在Facebook上的影响力,探索其如何通过个人行为和互动,影响和改变社会的各个方面。 个人表达和内…

Cryptographic algorithms—(Green-Book)加密算法

Cryptographic algorithms—加密算法 9.2.3 加密算法9.2.3.1 概述9.2.3.2 哈希函数9.2.3.3 对称密钥算法9.2.3.3.1 概述9.2.3.3.2 加密和解密9.2.3.3.3 高级加密标准9.2.3.3.4 加密操作模式9.2.3.3.5 消息认证码9.2.3.3.6 密钥包装9.2.3.3.7 Galois/Counter Mode9.2.3.3.7.1 概…

探索AudioLM:音频生成技术的未来

目录 2. AudioLM的基础理论 2.1. 音频生成的基本概念 2.2. 语言模型在音频生成中的应用 2.3. 深度学习在音频生成中的作用 3. AudioLM的架构与实现 3.1. AudioLM的基本架构 3.1.1 编码器 3.1.2 解码器 3.1.3 生成模块 3.2. 训练过程 3.2.1 数据预处理 3.2.2 损失函…

工业视觉笔记代码---目录

工业视觉 一(1-28) 工业视觉需要时可抄的代码---持续更新 一(1-28) 目录 1、批量访问图片,等待键盘 1.2 批量访问图像(不用提前批量重命名)--访问文件夹底下所有同类型图像 1.2.1 单独只有批量访问的 1.3 批量访问图像(也是…