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

news2024/12/25 9:18:58

大模型训练使用的数据是开放的、广泛的,因此它显得更加的通用。然而在有些应用场景下,用户需要使用自己的数据使得大模型生成的内容更加贴切,也有时候用户的数据是敏感的,无法提供出来给大模型进行通用性的训练。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.coloradmin.cn/o/1885443.html

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

相关文章

mysql mgr集群断电重启

一、前言 mysql mgr集群所有节点都断电重启时,就会面临一个问题,应该怎么重新构建mgr集群 二、操作 查询所有节点的master状态 show master status; 查看同步状态,可以通过uuid知道是通过哪个节点进行同步的数据 查看所有节点的uuid&#x…

【CT】LeetCode手撕—82. 删除排序链表中的重复元素 II

题目 原题连接:82. 删除排序链表中的重复元素 II 1- 思路 模式识别1:已排序链表 ——> 判重逻辑 ,涉及到 while 2- 实现 ⭐82. 删除排序链表中的重复元素 II——题解思路 class Solution {public ListNode deleteDuplicates(ListNode h…

2019:Cornfields

网址如下: OpenJudge - 2019:Cornfields 唉,最近沉迷法环,都没怎么学习了 话说这题的名字让我想起了《星际穿越》了(玉米地呀玉米地) 这是翻译过后的版本,题目要求我们帮助FJ找到放置玉米地的最佳位置&am…

深入STM32的ADC世界:从理论到实践,打造精准数据采集系统

摘要: 在嵌入式系统中,模拟信号的采集与处理至关重要。本文将深入浅出地介绍STM32的ADC模块,结合实际项目,详细阐述ADC的工作原理、配置方法以及数据处理技巧,并辅以Mermaid图表和代码示例,助你轻松掌握ADC应用开发。 …

回流焊常见缺陷

不润湿(Nonwetting)/润湿不良(Poor Wetting) 通常润湿不良是指焊点焊锡合金没有很好的铺展开来,从而无法得到良好的焊点并直接影响到焊点的可靠性。 产生原因: 1. 焊盘或引脚表面的镀层被氧化,氧化层的存在阻挡了焊锡与镀层之间的接触; 2. 镀层厚度不够或是加工不良,很…

arm-linux-gnueabihf-gcc:Command not found 解决办法

问题描述 使用虚拟机交叉编译程序,当使用了sudo去编译, 出现arm-linux-gnueabihf-gcc:Command not found的问题。明明已经安装并配置好环境了,发现还是提示找不到编译器。 原因分析: 特意去查了一下sudo方法,我们在sud…

chunk-vendors.js 优化

问题背景 在 App.vue 加入 web-vitals 性能监控指标并打印 import {onLCP, onINP, onCLS, onTTFB} from web-vitals/attribution;// Measure and log LCP as soon as its available. onLCP(console.log); onINP(console.log); onCLS(console.log); onTTFB(console.log);网页的…

linux开发常用工具和命令

文章目录 服务器文件挂载服务器终端挂载vscode编辑服务器代码linux开发常用命令dulnllobjdump 服务器文件挂载 在本地操作服务器文件。 在文件夹右侧‘其他位置‘’—>‘链接到服务器s’ sftp://usernameip/目录,回车后输入密码即可在左侧看到映射的服务器文件夹…

网络基础-RIP协议

RIP(Routing Information Protocol)是一个基于距离矢量的动态路由协议,常用于小型到中型网络。RIP是较早的路由协议之一,具有简单易用的特点。以下是关于RIP协议的详细介绍: RIP的主要特点 ①使用跳数(ho…

自己分析的逆向案例八——中国新烟商盟登录密码加密

网址:会员登录 - 新商盟 登陆界面分析,找到登录接口,跟栈分析。 没有异步,也没有webpack,很简单的跟栈 打上断点,逐步网上找,找到$ajax老朋友 上面就有对密码加密的部分,是一个RSA加密。 b 被…

认识100种电路之耦合电路

在电子电路的世界中,耦合电路宛如一座精巧的桥梁,连接着各个功能模块,发挥着至关重要的作用。 【为什么电路需要耦合】 在复杂的电子系统中,不同的电路模块往往需要协同工作,以实现特定的功能。然而,这些模…

C++ STL unique_ptr智能指针源码剖析

由于上一篇博客将shared_ptr,weak_ptr,enable_shared_form_this的源码实现整理了一遍,想着cpp智能指针还差个unique_ptr故写下此篇博客,以供学习 源码剖析 一,模板参数 首先,我们先看unique_ptr的模板参数,第一个参数_TP自是不用说表示对象类型,第二个模板参数定义了unique_p…

新书速览|Adobe Firefly:萤火虫:AI绘画快速创意设计

《Adobe Firefly:萤火虫:AI绘画快速创意设计》 本书内容 人工智能(Artificial Intelligence,AI)浪潮的席卷已经变成不可阻挡的趋势,伴随着这种变化,在图形设计、图像制作、绘画领域也相应发生了…

程序员鱼皮的写简历指南(保姆级)1、基本写法

大家好,我是程序员鱼皮。做知识分享这些年来,我看过太多简历、也帮忙修改过很多的简历,发现很多同学是完全不会写简历的、会犯很多常见的问题,不能把自己的优势充分展示出来,导致错失了很多面试机会,实在是…

一篇搞懂!LinuxCentos中部署KVM虚拟化平台(文字+图片)

🏡作者主页:点击! 👨‍💻Linux高级管理专栏:点击! ⏰️创作时间:2024年6月28日15点11分 🀄️文章质量:94分 目录 ————前言———— KVM的优点 KVM…

人脸特征68点识别 C++

1、加载一张图片 main函数&#xff1a; cv::Mat img cv::imread("5.jpg");vector<Point2f> points_vec dectectFace68(img);2、人脸68特征识别函数 在这里vector<Point2f> dectectFace68(Mat src) {vector<Point2f> points_vec;int* pResults …

数据开源|GigaSpeech 2:三万小时东南亚多语种语音识别开源数据集发布

“Giga”一词源于“gigantic”&#xff0c;互联网上具有海量音频资源&#xff0c;但语音质量良莠不齐&#xff0c;高质量音频文本对数据十分稀缺且标注成本高昂&#xff0c;特别是在小语种领域。GigaSpeech 是一个非常成功的英文开源数据集&#xff0c;以 YouTube 和 Podcast 为…

JavaScript——数组的应用内排序

目录 任务描述 相关知识 冒泡排序 一趟冒泡排序 冒泡排序全过程 选择排序 一趟选择排序 选择排序全过程 编程要求 任务描述 本关任务&#xff1a;掌握冒泡排序和选择排序。 相关知识 所谓排序是指将一组数据按照从小到大&#xff08;或从大到小&#xff09;的顺序重…

windows USB 驱动开发-URB结构

通用串行总线 (USB) 客户端驱动程序无法直接与其设备通信。 相反&#xff0c;客户端驱动程序会创建请求并将其提交到 USB 驱动程序堆栈进行处理。 在每个请求中&#xff0c;客户端驱动程序提供一个可变长度的数据结构&#xff0c;称为 USB 请求块 (URB) &#xff0c;URB 结构描…

C# 验证PDF数字签名的有效性

数字签名作为PDF文档中的重要安全机制&#xff0c;不仅能够验证文件的来源&#xff0c;还能确保文件内容在传输过程中未被篡改。然而&#xff0c;如何正确验证PDF文件的数字签名&#xff0c;是确保文件完整性和可信度的关键。本文将详细介绍如何使用免费.NET控件通过C#验证PDF签…