当前位置: 首页 > news >正文

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

这里写目录标题

      • 理论
        • 问答过程的三个主要阶段
        • 传递文档片段至 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 OpenAIEmbeddingsdef 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 PromptTemplatedef 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)

相关文章:

  • 解决前端访问IIS服务器发生跨域请求报错的方法
  • Mac移动硬盘选什么格式最好 Mac怎么用ntfs移动硬盘
  • 数据恢复新宠儿:2024年新兴软件趋势与亮点解析
  • ArcGis在线地图插件Maponline(好用版)
  • ORA-01110
  • 二十二、状态模式
  • 江协科技STM32学习- P5 GPIO输出
  • 20240822 每日AI必读资讯
  • 思特科技:国家宝藏数字体验馆展现东方美学 让“文物活起来”
  • 谷歌CEO闭门讲话误开直播,AI前沿资讯令人震惊……外网视频全部下架
  • CAS-ViT实战:使用CAS-ViT实现图像分类任务(一)
  • 学习使用pymodbus模块实现Modbus通讯
  • 【JS|第25期】探索HTTP POST请求:请求体的演变与应用
  • 编程思维模式比编程语言内容等更重要也更难传授-2024-机器人篇
  • vue项目开发记录1:为v-html内的img元素添加点击放大效果
  • JS 中的深拷贝与浅拷贝
  • 10个最佳ES6特性 ES7与ES8的特性
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • DOM的那些事
  • FastReport在线报表设计器工作原理
  • js作用域和this的理解
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Redis学习笔记 - pipline(流水线、管道)
  • 彻底搞懂浏览器Event-loop
  • 如何进阶一名有竞争力的程序员?
  • 跳前端坑前,先看看这个!!
  • 微服务入门【系列视频课程】
  • 微信公众号开发小记——5.python微信红包
  • ​iOS安全加固方法及实现
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • # Redis 入门到精通(九)-- 主从复制(1)
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #pragma multi_compile #pragma shader_feature
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $refs 、$nextTic、动态组件、name的使用
  • (2)STL算法之元素计数
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (三十五)大数据实战——Superset可视化平台搭建
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • *Django中的Ajax 纯js的书写样式1
  • ./和../以及/和~之间的区别
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • :O)修改linux硬件时间
  • @Controller和@RestController的区别?
  • @PreAuthorize与@Secured注解的区别是什么?
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [.net]官方水晶报表的使用以演示下载