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

news2024/11/15 2:06:37

这里写目录标题

      • 引言
      • 问答与语言模型
        • 一般流程
        • 整合方法
      • 通过高级问答技术增强 RAG 系统
      • 利用 VectorDB 进行文档检索
      • 实现问答链
        • 初始化语言模型
        • 配置 RetrievalQA 链
      • 问答实战

在这里插入图片描述

引言

检索增强生成 (RAG) 系统已经革新了我们与大型数据集互动的方式,使得开发高度复杂的聊天机器人和问答模型成为可能。这些系统的一个关键阶段是将检索到的文档与原始查询一起传递给语言模型 (LM),以生成答案。本章探讨了各种策略以优化这一流程,确保生成的答案准确而全面。

问答与语言模型

一旦相关文档被检索出来,它们必须被有效地整合为连贯的答案。这包括将文档内容与查询上下文相结合,并利用语言模型的能力。

一般流程
  1. 查询接收:接收用户的查询。
  2. 文档检索:从语料库中获取相关文档。
  3. 答案生成:将文档和查询传递给语言模型,该模型生成答案。
整合方法

默认情况下,所有检索到的文档片段都会被传递进语言模型的上下文窗口。然而,由于上下文窗口的大小限制,需要采用诸如 MapReduce、Refine 和 MapRerank 等策略来解决这一约束。

通过高级问答技术增强 RAG 系统

在深入探讨具体问答方法之前,请确保你的开发环境已正确配置。这个设置包括导入必要的库、设置 API 密钥,并调整以适应任何语言模型版本的更新。

import os
import openai
from dotenv import load_dotenv
import datetime

# 加载环境变量并配置 OpenAI API 密钥
load_dotenv()
openai.api_key = os.environ['OPENAI_API_KEY']

# 调整以适应语言模型版本
current_date = datetime.datetime.now().date()
llm_name = "gpt-3.5-turbo"
print(f"正在使用语言模型版本: {llm_name}")

利用 VectorDB 进行文档检索

RAG 系统中的一个重要步骤是从用户的查询中检索相关文档。这可以通过使用向量数据库 (VectorDB) 来实现,它存储文档的嵌入向量。

# 导入用于向量数据库和嵌入向量生成的必要库
from langchain.vectorstores import Chroma
from langchain.embeddings.openai import OpenAIEmbeddings

# 指定向量数据库将持久化其数据的目录
documents_storage_directory = 'docs/chroma/'

# 初始化嵌入向量生成器,使用 OpenAI 的嵌入向量
embeddings_generator = OpenAIEmbeddings()

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

# 显示向量数据库中的当前文档数量以验证初始化是否成功
print(f"向量数据库中的文档数量: {vector_database._collection.count()}")

实现问答链

RetrievalQA 链是一种结合文档检索与问答的方法,它利用语言模型的能力根据检索到的文档生成响应。

初始化语言模型
from langchain.chat_models import ChatOpenAI

# 初始化聊天模型,选择指定的语言模型版本
language_model = ChatOpenAI(model_name=llm_name, temperature=0)
配置 RetrievalQA 链
# 导入 langchain 库中的必要模块
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate

# 创建一个自定义提示模板以指导语言模型有效地使用提供的上下文来回答问题
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)}
)

问答实战

# 向系统提出一个问题
query = "概率是不是一门课程的主题?"
response = question_answering_chain({"query": query})
print("答案:", response["result"])

请注意,上述代码示例中使用的 qa_chain 变量未被定义,因此在实际运行时应该替换为 question_answering_chain

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

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

相关文章

深入探索MyBatis的动态代理模式

文章目录 深入探索MyBatis的动态代理模式引言一、 MyBatis动态代理概述动态代理的优势 二、准备工作文件存放结构视图1、Mybatis的主配置文件 mybatis-config.xml2、db.properties文件:3、mybatis-config.xml引用properties文件: 三、MyBatis动态代理的实现原理1. Mapper接口定…

基于STM32F103的FreeRTOS系列(十)·消息队列的使用详细介绍以及代码编写

目录 1. 消息队列简介 1.1 概念 1.2 数据存储 1.3 阻塞机制 1.3.1 出队阻塞 1.3.2 入队阻塞 1.4 操作示意图 1.4.1 创建队列 1.4.2 向队列发送第一个消息 1.4.3 向队列发送第二个消息 1.4.4 从队列读取消息 1.5 消息队列的控制块 2. 常用API函数介绍…

android13顶部状态栏里面调节背光,不隐藏状态栏面板

总纲 android13 rom 开发总纲说明 目录 1.前言 2.代码分析 3.修改方法 4.编译运行 5.彩蛋 1.前言 android13顶部状态栏里面调节背光,这个时候状态栏面板会被隐藏掉,有些需求就需要不隐藏这个面板。 2.代码分析 查找亮度条属性 id/brightness_slider ./frameworks/b…

Vue 3 + 天地图 + D3.js 绘制行政区划

​🌈个人主页:前端青山 🔥系列专栏:组件封装篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来组件封装篇专栏内容:组件封装-天地图 目录 引入天地图 API 初始化地图 引入 D3.js 加载行政区划数据 添…

k8s高版本(1,28)部署NodePort模式下的ingress-nginx的详细过程及应用案例

文章目录 前言环境ingress安装应用案例(ingress-http案例: 基于名称的负载均衡) 前言 这个是nodeport模式下的,如果需要loadbalancer模式下的,看看博主下面以前的博客 链接: k8s学习–负载均衡器matelLB的详细解释与安装 链接: k8s学习–ing…

机器学习 之 使用逻辑回归 进行银行贷款预测(请帮忙点点赞谢谢,这对我很重要)

目录 一、逻辑回归简介 逻辑回归的基本原理 线性组合: Sigmoid函数: 二、实战案例 1.导入数据 2.准备环境 混淆矩阵的基本概念 混淆矩阵的作用 3.加载数据 4.数据预处理 什么是标准化? 标准化的计算公式 划分数据集 5.逻辑回归模…

19.缓存的认识和基本使用

缓存介绍 缓存是数据交换的缓冲区Cache,是临时存储数据的地方,一般读写性能较高。 数据库的缓存就是建立索引。 缓存的作用 1.降低后端负载。 2.提高读写效率,降低响应时间。 缓存的问题 1.保证数据的一致性。 2.增加代码维护成本。解…

Kafka运行机制(二):消息确认,消息日志的存储和回收

前置知识 Kafka基本概念https://blog.csdn.net/dxh9231028/article/details/141270920?spm1001.2014.3001.5501Kafka运行机制(一):Kafka集群启动,controller选举,生产消费流程https://blog.csdn.net/dxh9231028/arti…

Qt 0816作业

一、思维导图 二、将day1做的登录界面升级优化【资源文件的添加】 三、在登录界面的登录取消按钮进行一下设置 使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到…

C++ | Leetcode C++题解之第350题两个数组的交集II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {sort(nums1.begin(), nums1.end());sort(nums2.begin(), nums2.end());int length1 nums1.size(), length2 nums2…

函数递归VS操作符深入?

1>>前言 函数递归函数递归&#xff0c;当小白听到这样的词会感到无比陌生&#xff0c;请不要惊慌&#xff0c;这是正常的&#xff0c;以至于都不是很经常用到&#xff0c;但是它的算法&#xff0c;它的思想是值得我们深入思考的。还有一些复杂操作符&#xff0c;如按位与…

【原创】java+swing+mysql共享充电宝管理系统设计与实现

个人主页&#xff1a;程序员杨工 个人简介&#xff1a;从事软件开发多年&#xff0c;前后端均有涉猎&#xff0c;具有丰富的开发经验 博客内容&#xff1a;全栈开发&#xff0c;分享Java、Python、Php、小程序、前后端、数据库经验和实战 文末有本人名片&#xff0c;希望和大家…

PyTorch之TensorBoard使用

接回上一篇&#xff1a;PyTorch深度学习框架-CSDN博客 在学习这篇之前建议先按照上一篇搭建好整个PyTorch环境 然后这一篇讲怎么用TensorBoard&#xff0c;这个玩意是Tensorflow官方推出的一个可视化工具&#xff0c;当使用Tensorflow训练大量深层的神经网络时&#xff0c;我们…

全局锁、表级锁、行级锁

锁的作用和特点 WHY&#xff1a;锁的出现是为了解决并发场景下不同用户同时对共享资源进行操作&#xff0c;而可能引发的并发问题。 HOW&#xff1a;控制不同线程对资源访问的规则。 全局锁 顾名思义&#xff0c;全局锁就是对整个数据库实例加锁。一般在进行全库备份的时候…

prometheus + grafana + 告警

配置环境 准备三台主机&#xff0c;将三台主机的信息分别写入/etc/hosts文件中 192.168.100.115 server.example.com server 192.168.100.116 agent1.example.com agent1 192.168.100.117 grafana.example.com grafana [rootserver ~]# cat /etc/hosts 127.0.0.1 localhos…

【MySQL 08】内置函数 (带思维导图)

文章目录 &#x1f308; 一、日期函数⭐ 1. 常见日期函数⭐ 2. 日期函数使用示例⭐ 3. 日期函数综合案例 &#x1f308; 二、字符串函数⭐ 1. 常见字符串函数⭐ 2. 字符串函数使用示例⭐ 3. 字符串函数综合案例 &#x1f308; 三、数值函数⭐ 1. 常见数值函数⭐ 2. 数值函数使用…

探索GitHub的无限可能:从注册到Linux环境下的库分支链接

在这个数字化时代&#xff0c;GitHub已成为开发者们不可或缺的宝藏库。无论你是编程新手还是资深开发者&#xff0c;GitHub都能为你打开一扇通往无限创意与协作的大门。今天&#xff0c;就让我们一起踏上这段探索之旅&#xff0c;从GitHub的注册开始&#xff0c;再到如何在Linu…

google transalte api的使用,V2服务账户方式(google-cloud-java)

Google Cloud Translation API 有几个不同的使用方式&#xff0c;其中之一是使用最新的 Google Cloud Client Library。这些库提供了简化的 API&#xff0c;使得与 Google Cloud 服务的交互变得更加容易。 对于gcp平台的创建方式&#xff0c;我记得得绑定真信用卡了&#xff0c…

Debug-021-el-table实现分页多选的效果(切换分页,仍可以保持前一页的选中效果)

前情提要&#xff1a; 这个功能实现很久了&#xff0c;但是一直没有留意如何实现&#xff0c;今天想分享一下。具体就是我们展示table数据的时候&#xff0c;表格中的数据多数情况是分页展示&#xff0c;毕竟数据量太多&#xff0c;分页的确是有必要的。那么我们有业务需要给表…

portswigger的Exploiting DOM clobbering to enable XSS

目录 尝试一下看看可不可以XSS DOM破坏 查看源码确定DOM破坏漏洞点以及代码分析 首先查看/resources/labheader/js/labHeader.js&#xff0c;没有什么作用 然后domPurify这东西是一个过滤框架也没啥子用 看/resources/js/loadCommentsWithDomClobbering.js尝试分析代码(对…