langchain+RAG的一个小demo

1.首先安装依赖

pip install --upgrade --quiet  langchain-core langchain-community langchain-openai

2.设置chatOpenAI的模型

1.ChatOpenAI:这是一个用于处理对话式文本的类。它专门设计用于处理对话,并且可以用于构建对话系统、聊天机器人等。ChatOpenAI 类通常用于与用户进行自然语言交互回答问题提供建议或执行对话任务。
2.OpenAI:这是一个通用的文本生成类。它提供了一个接口,可以使用 OpenAIGPT 模型来生成各种类型的文本,包括文章、故事、代码等。OpenAI 类可以用于广泛的文本生成任务,而不仅限于对话或聊天
3.总结: 因此,主要的区别在于它们的设计和用途。ChatOpenAI 更适合处理对话式文本和构建对话系统,而 OpenAI 则更通用,可以用于各种文本生成任务。

from langchain_openai import ChatOpenAI

model = ChatOpenAI(model="gpt-3.5-turbo-0125")

3.对上下文数据进行文档向量存储

利用DocArrayInMemorySearch进行向量存储,设置向量的嵌入OpenAIEmbeddings()

vectorstore = DocArrayInMemorySearch.from_texts(
    ["Fairy是一个英俊无比的男生,即便他身高不高但依旧有很多女生追他",
     "Fairy今年21了,硕士毕业后他将达到24岁,不出意外他想留在上海广州深圳长沙这四个地方",
     "Fairy擅长写Java代码,即便他已经一年没有写相关代码了,但写起接口来还是比较专注的",
     "Fairy的弱点在于他对于前端代码的编写十分薄弱",
     "Fairy毕业于长沙理工大学城南学院",
     "Fairy在2022年中国大学生计算机设计大赛夺得了省二",
     "Fairy夺得中国服创大赛全国三等奖是在2023年10月份",
     "Fairy的LeetCode刷了有近300道,但是灌水比较多"],
    embedding=OpenAIEmbeddings(),
)

4.将文档向量转为检索器

将**【文档向量】存储转换为【检索器】(retriever),以便后续查询(【后续的上下文】就从我们的这个【检索器retriever】**中进行检索)

retriever = vectorstore.as_retriever()

5.创建语义模板,并设置字符串输出解析器

  1. 利用ChatPromptTemplate生成语义模板
  2. 利用StrOutputParser()创建字符串解析器
# 4.这段代码创建了一个【提示模板template】,并利用【chatPromptTemplate】进行创建该模板。
template = """请根据以下上下文回答问题:
{context}

问题:{question}
"""
prompt = ChatPromptTemplate.from_template(template)

# 5.【StrOutputParser()】旨在创建一个【字符串输出解析器】
output_parser = StrOutputParser()

6.创建一个并行任务链

创建一个并行任务链,一是从检索器retriever获取上下文,二是将问题传给模型模板prompt

# 6.这行代码创建了一个【并行运行的任务链】,其中包括两个任务:1.一个是【从检索器】中获取【上下文】;2.另一个是将【问题】传递给【模型】
setup_and_retrieval = RunnableParallel(
    {"context": retriever, "question": RunnablePassthrough()}
)

7.组成处理链处理上下文和问题

# 7.将上下文【检索器中的上下文和问题】——>提示词模板——>模型——>字符串输出链:组合成一个处理链
chain = setup_and_retrieval | prompt | model | output_parser

8.调用处理链,传递一个问题进行处理

# 8.调用处理链,传递了一个问题
response = chain.invoke("Fairy的LeetCode是否灌水?")
print("RAG回答问题:"+response.__str__())

9.所有代码

import getpass
import os
from langchain_openai import ChatOpenAI, OpenAI
from langchain_community.vectorstores import DocArrayInMemorySearch
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
from langchain_openai import OpenAIEmbeddings

# 1.这行代码创建了一个 ChatOpenAI 的实例,使用的是 GPT-3.5 模型。
model = OpenAI(model="gpt-3.5-turbo-instruct")

# 2.创建了一个【文档向量存储】(vectorstore),使用 【DocArrayInMemorySearch】 类从提供的文本列表中创建,
# 【向量的嵌入】使用了 OpenAIEmbeddings()
vectorstore = DocArrayInMemorySearch.from_texts(
    ["Fairy是一个英俊无比的男生,即便他身高不高但依旧有很多女生追他",
     "Fairy今年21了,硕士毕业后他将达到24岁,不出意外他想留在上海广州深圳长沙这四个地方",
     "Fairy擅长写Java代码,即便他已经一年没有写相关代码了,但写起接口来还是比较专注的",
     "Fairy的弱点在于他对于前端代码的编写十分薄弱",
     "Fairy毕业于长沙理工大学城南学院",
     "Fairy在2022年中国大学生计算机设计大赛夺得了省二",
     "Fairy夺得中国服创大赛全国三等奖是在2023年10月份",
     "Fairy的LeetCode刷了有近300道,但是灌水比较多"],
    embedding=OpenAIEmbeddings(),
)

# 3.这行代码将【文档向量】存储转换为【检索器】(retriever),以便后续查询(【后续的上下文】就从我们的这个【检索器retriever】中进行检索)
retriever = vectorstore.as_retriever()

# 4.这段代码创建了一个【提示模板template】,并利用【chatPromptTemplate】进行创建该模板。
template = """请根据以下上下文回答问题:
{context}

问题:{question}
"""
prompt = ChatPromptTemplate.from_template(template)

# 5.【StrOutputParser()】旨在创建一个【字符串输出解析器】
output_parser = StrOutputParser()

# 6.这行代码创建了一个【并行运行的任务链】,其中包括两个任务:1.一个是【从检索器】中获取【上下文】;2.另一个是将【问题】传递给【模型】
setup_and_retrieval = RunnableParallel(
    {"context": retriever, "question": RunnablePassthrough()}
)

# 7.将上下文【检索器中的上下文和问题】——>提示词模板——>模型——>字符串输出链:组合成一个处理链
chain = setup_and_retrieval | prompt | model | output_parser

# 8.调用处理链,传递了一个问题
response = chain.invoke("Fairy的LeetCode是否灌水?")
print("RAG回答问题:"+response.__str__())

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快速入门基础控制台API

目录 一、什么是win32API 二、API基础函数介绍 2.1控制台基础命令 2.1.1标题修改 2.1.2长宽修改 2.1.3坐标 2.2GetStdHandle 2.3GetConsoleCursorInfo 2.4SetConsoleCursorInfo 2.5SetConsoleCursorPosition 2.6GetAsyncKeyState 三、API函数综合应用 3.1设置光标…

Facebook的魅力魔法:探访数字社交的奇妙世界

1. 社交媒体的演变与Facebook的角色 在数字化时代,社交媒体已经成为我们日常生活中不可或缺的一部分。而在众多的社交媒体平台中,Facebook 以其深厚的历史和广泛的影响力,成为了全球数亿用户沟通、分享和互动的主要场所。从其初创之时起&…

雅特力AT32F435学习——3.PWM实验

PWM实验 定时器浑身都是包其中PWM占大头,因为PWM应用太广了:呼吸灯、电机、蜂鸣器,生日火炬里的声音都是PWM干的,接下来就让我们学一下雅特力AT32F435单片机的PWM吧。 基础知识 老样子对于PWM的基础了解那肯定直接从数据手册学…

动手学深度学习14 数值稳定性+模型初始化和激活函数

动手学深度学习14 数值稳定性模型初始化和激活函数 1. 数值稳定性2. 模型初始化和激活函数3. QA **视频:**https://www.bilibili.com/video/BV1u64y1i75a/?spm_id_fromautoNext&vd_sourceeb04c9a33e87ceba9c9a2e5f09752ef8 **电子书:**https://zh-v…

azure云服务器学生认证优惠100刀续订永久必过方法记录

前面的话 前几天在隔壁网站搞了个美国edu邮箱,可以自定义用户名。今天就直接认证Azure,本来打算等GitHub学生包过期后用这个edu邮箱重新认证白嫖Azure的。在昨天无意中看到续期,就把原本那个Azure账号续了一年,所以这个美国edu邮…

25计算机考研院校数据分析 | 浙江大学

浙江大学(Zhejiang University),简称“浙大”,坐落于“人间天堂”杭州。前身是1897年创建的求是书院,是中国人自己最早创办的新式高等学校之一。 浙江大学由教育部直属、中央直管(副部级建制)&a…

一文掌握Vue3:深度解读Vue3新特性、Vue2与Vue3核心差异以及Vue2到Vue3转型迭代迁移重点梳理与实战

每次技术革新均推动着应用性能与开发体验的提升。Vue3 的迭代进步体现在性能优化、API重构与增强型TypeScript支持等方面,从而实现更高效开发、更优运行表现,促使升级成为保持竞争力与跟进现代前端趋势的必然选择。本文深度解读Vue3 响应式数据data、生命…

常用的JDK9-JDK17的一些新增语法特性

目录 1.前言2.一些新增的特性2.1 yield关键字2.2 var关键字2.3 空指针异常2.4 密封类2.5 接口中的私有方法2.6 instanceof2.7 其他 1.前言 从springboot3.0开始,已经不⽀持JDK8了。参考资料 :Spring官方博客。从3.0开始,转变为JDK17。 官方…

使用windows端MySQL创建数据库

1.命令行登录数据库 命令:mysql -u用户名 -p密码; 切记命令后面要以分号结尾 2. 查看和创建数据库 查看数据库命令:show database; 创建数据库命令:mysql> create database db_classes; 创建一个名为db_classes的…

【漏洞复现】WebLogic XMLDecoder反序列化(CVE-2017-10271)

1、漏洞描述 CVE-2017-10271漏洞产生的原因大致是Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。攻击者发送精心构造的xml数据甚至能…

AIGC算法3:Attention及其变体

1.Attention Attention是Transformer的核心部分,Attention机制帮助模型进行信息筛选,通过Q,K,V,对信息进行加工 1.1 attention计算公式 Attention ⁡ ( Q , K , V ) softmax ⁡ ( Q K T d k ) V \operatorname{Attention}(Q, K…

找不到mfc140.dll如何解决?mfc140.dll丢失的几种解决方法分享

在我们启动并开始利用电脑进行日常工作的过程中,如果遭遇了操作系统提示“mfc140.dll文件丢失”的错误信息,导致某些应用程序无法正常运行,这究竟是何种情况呢?小编将介绍计算机缺失mfc140.dll文件的5种解决方法,帮助大…

二叉树数据结构详解及java使用二叉树示例代码

二叉树详解: 二叉树是一种常见的树形数据结构,它由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。 二叉树组成: 节点(Node): 每个节点包含三个要素:数…

【AI学习】RAG与推荐系统

一、《双塔模型的瓶颈究竟在哪?》 文章介绍了谷歌的一篇论文,《Large Dual Encoders Are Generalizable Retrievers》 文章主要在讲,稠密检索模型在OOD(Out-Of-Distribution,即域外)泛化能力不行&#xff…

【Pytorch】(十五)模型部署:ONNX和ONNX Runtime

文章目录 (十五)模型部署:ONNX和ONNX RuntimeONNX 和 ONNX Runtime的关系将PyTorch模型导出为ONNX格式使用Netron可视化ONNX模型图检查ONNX模型验证ONNX Runtime推理结果使用ONNX Runtime运行超分模型 (十五)模型部署&…

外贸干货|真正的销售高手,都很会提问

你的产品性价比很高,为什么客户没有买单呢? 最重要的原因是你没有了解到他真正的需求。 真正的销售高手,应该是一个提问高手,至少要连续问对方6个问题,问出客户的真实需求。 假如他回答你的问题,你有一种&a…

git 冲突与解决冲突

目录 1.使用 git 解决冲突 GIT 常用命令 制造冲突 解决冲突 2.使用 IDEA 解决冲突 产生冲突 解决冲突 1.使用 git 解决冲突 GIT 常用命令 命令作用git clone克隆git init初始化git add 文件名添加到暂存区git commit -m " 日志信息" 文件名提交到本地库git st…

【运维自动化-配置平台】如何通过模板创建集群和模块

通过【每天掌握一个功能点】配置平台如何创建业务机拓扑(集群-模块)我们知道了直接创建集群和模块的操作方法,直接创建的方式适合各集群模块都相对独立的场景,那大量的、标准规范的集群模块如何快速创建呢,这里就引入了…

条件生成对抗网络(cGAN)在AI去衣技术中的应用探索

随着深度学习技术的飞速发展,生成对抗网络(GAN)作为其中的一个重要分支,在图像生成、图像修复等领域展现出了强大的能力。其中,条件生成对抗网络(cGAN)通过引入条件变量来控制生成模型的输出&am…

面试十五 容器

一、vector容器 template<typename T> class Allocator{ public:T* allocator(size_t size){// 负责内存开辟return (T*)malloc(sizeof(T) * size);}void deallocate(void * p){free(p);}void construct(T*p,const T&val){// 定位newnew (p) T(val);}void destroy(…