【大模型从入门到精通33】开源库框架LangChain RAG 系统中的问答技术3

news2024/11/24 9:29:14

这里写目录标题

      • 理论
        • 问答过程的三个主要阶段
        • 传递文档片段至 LM 上下文窗口的局限性及策略
        • 向量数据库的重要性
        • RetrievalQA 链的作用
        • MapReduce 与 Refine 的区别
        • 分布式系统中的实际考量
        • 实验的重要性
        • RetrievalQA 链的主要限制
        • 对话记忆的重要性
      • 实践
        • 初始化向量数据库
        • 设置 RetrievalQA 链
        • 使用 MapReduce 和 Refine 技术
        • 处理对话上下文

在这里插入图片描述

理论

问答过程的三个主要阶段

问答增强(RAG)系统中的问答过程涉及三个主要阶段:

  1. 查询接收(Query Reception):接收用户的自然语言查询。
  2. 文档检索(Document Retrieval):基于查询内容从文档集合中检索相关文档。
  3. 答案生成(Answer Generation):利用语言模型从检索到的文档中生成答案。
传递文档片段至 LM 上下文窗口的局限性及策略

传递所有检索到的文档片段到语言模型(LM)上下文窗口的局限性包括上下文窗口大小的限制,这可能导致相关信息的丢失。为了克服这一限制,可以采用以下两种策略:

  • MapReduce:用于快速聚合来自多个文档的信息。
  • Refine:允许按顺序逐步完善答案,适用于需要高度准确性的情况。
向量数据库的重要性

在 RAG 系统中使用向量数据库(VectorDB)进行文档检索的重要性在于它能高效地存储和检索文档嵌入,从而实现对用户查询相关文档的快速准确检索。

RetrievalQA 链的作用

RetrievalQA 链通过结合文档检索与问答来工作,它利用语言模型根据检索到的文档内容生成答案,提高了答案的相关性和准确性。

MapReduce 与 Refine 的区别
  • MapReduce:专为从多个文档中快速聚合信息设计。
  • Refine:允许答案的逐步完善,适用于需要高度准确性的任务。
    选择哪种技术取决于具体任务的需求。
分布式系统中的实际考量

当在分布式系统中实施 MapReduce 或 Refine 技术时,需要注意网络延迟和数据序列化成本等因素,以确保高效的数据传输和处理。

实验的重要性

在 RAG 系统中实验 MapReduce 和 Refine 技术至关重要,因为它们的有效性会根据数据特性和问答任务的不同而变化。实验可以帮助确定哪种技术最适合特定的应用场景。

RetrievalQA 链的主要限制

RetrievalQA 链的一个主要限制是无法保留对话历史记录,这会影响后续查询的流程,使得维持对话上下文和连贯性变得困难。

对话记忆的重要性

将对话记忆集成到 RAG 系统中非常重要,因为它能让系统记住之前的交互,提高系统与用户进行有意义对话的能力,提供情境感知的回答。

实践

初始化向量数据库
from langchain.vectorstores import Chroma
from langchain.embeddings.openai import OpenAIEmbeddings

def initialize_vector_database(directory_path):
    # 初始化使用 OpenAI 嵌入的嵌入生成器
    embeddings_generator = OpenAIEmbeddings()

    # 使用指定的存储目录和嵌入函数初始化向量数据库
    vector_database = Chroma(persist_directory=directory_path, embedding_function=embeddings_generator)

    # 显示向量数据库中的当前文档计数以验证初始化
    document_count = vector_database._collection.count()  # 假设 Chroma 实现提供了 count 方法
    print(f"向量数据库中的文档数量: {document_count}")

# 示例使用:
documents_storage_directory = 'path/to/your/directory'
initialize_vector_database(documents_storage_directory)
设置 RetrievalQA 链
from langchain.vectorstores import Chroma
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate

def setup_retrieval_qa_chain(model_name, documents_storage_directory):
    # 初始化嵌入生成器和向量数据库
    embeddings_generator = OpenAIEmbeddings()
    vector_database = Chroma(persist_directory=documents_storage_directory, embedding_function=embeddings_generator)

    # 初始化语言模型
    language_model = ChatOpenAI(model_name=model_name, temperature=0)

    # 自定义提示模板
    custom_prompt_template = """为了更好地回答询问,请考虑下面提供的细节作为参考...
{context}
询问: {question}
洞察性的回答: """

    # 初始化 RetrievalQA 链
    question_answering_chain = RetrievalQA.from_chain_type(
        language_model,
        retriever=vector_database.as_retriever(),
        return_source_documents=True,
        chain_type_kwargs={"prompt": PromptTemplate.from_template(custom_prompt_template)}
    )

    return question_answering_chain

# 示例使用:
model_name = "gpt-3.5-turbo"
documents_storage_directory = 'path/to/your/documents'
qa_chain = setup_retrieval_qa_chain(model_name, documents_storage_directory)
使用 MapReduce 和 Refine 技术
# 假设 `setup_retrieval_qa_chain` 函数已在同一脚本中定义或被导入

# 使用相同模型和文档存储目录设置两种技术
model_name = "gpt-3.5-turbo"
documents_storage_directory = 'path/to/your/documents'
qa_chain = setup_retrieval_qa_chain(model_name, documents_storage_directory)

# 配置 MapReduce 和 Refine 的问答链
question_answering_chain_map_reduce = RetrievalQA.from_chain_type(
    qa_chain.language_model,
    retriever=qa_chain.retriever,
    chain_type="map_reduce"
)

question_answering_chain_refine = RetrievalQA.from_chain_type(
    qa_chain.language_model,
    retriever=qa_chain.retriever,
    chain_type="refine"
)

# 示例查询
query = "概率在机器学习中的重要性是什么?"

# 执行 MapReduce 技术
response_map_reduce = question_answering_chain_map_reduce({"query": query})
print("MapReduce 答案:", response_map_reduce["result"])

# 执行 Refine 技术
response_refine = question_answering_chain_refine({"query": query})
print("Refine 答案:", response_refine["result"])
处理对话上下文
def handle_conversational_context(initial_query, follow_up_query, qa_chain):
    """
    模拟处理后续问题的情境。

    参数:
    - initial_query: 第一个用户查询。
    - follow_up_query: 后续用户查询。
    - qa_chain: 已初始化的问答链。

    返回: 无。打印两个查询的答案。
    """
    # 生成对初始查询的回答
    initial_response = qa_chain({"query": initial_query})
    print("对初始查询的回答:", initial_response["result"])

    # 生成对后续查询的回答
    follow_up_response = qa_chain({"query": follow_up_query})
    print("对后续查询的回答:", follow_up_response["result"])

# 示例使用 (假设已设置 question_answering_chain):
initial_query = "概率在统计学中的重要性是什么?"
follow_up_query = "它是如何应用于现实世界问题的?"
# handle_conversational_context(initial_query, follow_up_query, qa_chain)

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

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

相关文章

GD32双路CAN踩坑记录

GD32双路CAN踩坑记录 目录 GD32双路CAN踩坑记录1 问题描述2 原因分析3 解决办法4 CAN配置参考代码 1 问题描述 GD32的CAN1无法进入接收中断,收不到数据。 注:MCU使用的是GD32E50x,其他型号不确定是否一样,本文只以GD32E50x举例说…

【Docker】gitea的ssh容器直通

本文首发于 ❄️慕雪的寒舍 1.跟着文档走 gitea的安装比较简单,直接使用官方文档中的docker-compose文件即可。如果想实现ssh容器直通,需要对这个docker-compose文件做一定修改。 如果你还没有安装docker,参考本站教程 linux安装docker&…

QT-贪吃蛇小游戏

QT-贪吃蛇小游戏 一、演示效果二、核心代码三、下载链接 一、演示效果 二、核心代码 #include "Food.h" #include <QTime> #include <time.h> #include "Snake.h"Food::Food(int foodSize):foodSize(foodSize) {coordinate.x -1;coordinate.…

多线程(4)——单例模式、阻塞队列、线程池、定时器

1. 多线程案例 1.1 单例模式 单例模式能保证某个类在程序中只存在唯一一份实例&#xff0c;不会创建出多个实例&#xff08;这一点在很多场景上都需要&#xff0c;比如 JDBC 中的 DataSource 实例就只需要一个 tip&#xff1a;设计模式就是编写代码过程中的 “软性约束”&am…

系统稳定性建设的深度剖析与未来展望

一、系统稳定性的重要意义 系统稳定性是系统正常运行的关键&#xff0c;其缺失会导致严重后果&#xff0c;如经济损失、用户流失等。 以在线学习平台为例&#xff0c;如果系统频繁出现卡顿、掉线等问题&#xff0c;影响用户的学习体验&#xff0c;导致用户流失&#xff0c;平…

【HTML】从0开始构建HTML页面

1、HTML文档基本格式 1.1、!DOCTYPE:文档类型声明 1.2、html:根标签 1.3、head:头部标签 1.4、body:主体标签 2、头部相关标签 2.1、< title> < title>标签用于定义HTML页面的标题&#xff0c;即给网页取一个名字&#xff0c;必须位于< head>标签之内。 …

Programmatically add website content to OpenAI with C#

题意&#xff1a;使用 C# 以编程方式将网站内容添加到 OpenAI。 问题背景&#xff1a; Our goal is to have a ChatGPT answer questions about our websites content. 我们的目标是让 ChatGPT 回答关于我们网站内容的问题。 We are trying to integrate something similar t…

设计模式笔记01(java版)

文章目录 设计模式概述学习设计模式的必要性设计模式分类创建型模式结构型模式行为型模式 UML类图概述类图的作用类图表示法类的表示方式类与类之间关系的表示方式1&#xff0c;单向关联2&#xff0c;双向关联3&#xff0c;自关联聚合关系组合关系依赖关系继承关系实现关系 软件…

【hot100篇-python刷题记录】【买卖股票的最佳时机】

摆烂几天,又来了。 R5-贪心篇(不像) 贪心的常规思路是找到贪心切入点,例如最经典的算法是安排最多活动问题,需要以结束时间排序,然后遍历不冲突,计算最大数即可(每次都选择最早结束的活动)。 贪心算法的使用需要满足贪心特征。即局部最优解等于全局最优解。 对于本…

Docker 修改容器端口映射(以 Portainer 为例)

文章目录 背景解决第1步:找到容器id第2步:查找docker根目录第3步:停止docker服务第4步:修改容器的hostconfig.json配置文件第5步:启动docker服务第6步:验证参考背景 项目中有个服务也使用了9000端口,而Portainer的默认端口也是9000。结果可想而知,端口冲突,肯定有一个…

stable diffusion inpainting(img2img+inpaint/inpaint-model)

https://zhuanlan.zhihu.com/p/681250295https://zhuanlan.zhihu.com/p/681250295AIGC专栏4——Stable Diffusion原理解析-inpaint修复图片为例_diffusion inpaint-CSDN博客文章浏览阅读1.7w次,点赞42次,收藏79次。Inpaint是Stable Diffusion中的常用方法,一起简单学习一下。…

CAS-ViT实战:使用CAS-ViT实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

springer 投稿系统中返修注意点

初次提交 初次提交时&#xff0c; manuscript 提交的是 pdf 文件 返修后提交 在经过返修之后需要提交的是注意一下几点&#xff1a; 此时提交的Blined manuscript &#xff0c;虽然名字没变&#xff0c;但不能再提交pdf 文件&#xff0c; 而需要提交的是可编辑的源文件 .te…

Sketch-gen模型部署教程

一、介绍 SketchGen: 一种图像转草图工具&#xff0c;主要用于制作合成数据集或生成参考图。它能够帮助研究人员和开发者快速地从真实图像中提取出线稿轮廓&#xff0c;这对于计算机视觉任务如物体识别、场景理解等非常有用。通过使用这种工具&#xff0c;可以更方便地创建训练…

【科技赋能教育】电路仿真软件:解锁电路教学新篇章,让知识触手可及!

教育领域正经历着一场前所未有的变革。电路学&#xff0c;作为理工科学生必修的一门基础课程&#xff0c;其抽象性、复杂性和实验条件的高要求&#xff0c;曾让无数学生望而却步。然而&#xff0c;随着电路仿真软件的出现&#xff0c;这一切正悄然发生着变化&#xff0c;它不仅…

Java面试-基础

1. 面向对象 什么是面向对象 什么是面向对象&#xff1f; 对比面向过程&#xff0c;是两种不同的处理问题的角度 面向过程更注重事情的每一个步骤及顺序&#xff0c;面向对象更注重事情有哪些参与者 &#xff08;对象&#xff09;、及各自需要做什么 封装、继承、多态 2. …

yum 安装 MySQL 8.0【2024最新教程】

文章目录 第 1 步:添加 MySQL Yum Repository第 2 步:【可选】选择 MySQL 版本第 3 步:安装 MySQL Community Server第 4 步:启动 MySQL第 5 步:修改 root 密码第 6 步:【可选】修改配置文件默认配置修改数据目录和日志文件添加更多配置第 7 步:【可选】修改 root 可外部…

【应急响应】-linux日志被删除?

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; 网络安全、 Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 在 Linux 应急响应中&#xff0c;攻击者清理日志的行为给追踪和分析带来了巨大挑战。本文将介绍在日志被…

【STM32项目】在FreeRtos背景下的实战项目的实现过程(三)

个人主页~ 实战项目的实现过程&#xff08;一&#xff09;~ 实战项目的实现过程&#xff08;二&#xff09;~ 实战项目的实现过程 五、读例程1、初始化函数2、while函数3、头文件4、源文件 六、移植程序 五、读例程 将一些特定的模块调试好&#xff0c;就是那些使用别的软件…

在Windows Server上安装typecho博客程序(基于IIS)

Typecho Typecho是由type和echo两个词合成的&#xff0c;来自于开发团队的头脑风暴。Typecho基于PHP5开发&#xff0c;支持多种数据库&#xff0c;是一款内核强健﹑扩展方便﹑体验友好﹑运行流畅的轻量级开源博客程序。 网上大多在Windows下安装Typecho的教程都是基于Apache服…