Langchain框架深度剖析:解锁大模型-RAG技术的无限潜能,引领AI应用新纪元

在这里插入图片描述

文章目录

  • 前言
  • 一、Langchain 框架概述
  • 二、大模型-RAG技术原理
  • 三、应用示例
    • 1.RAG案例一(私有文档直接读取-问答)
    • 2.RAG案例二(Vue上传文件+结合文件内容回答问题)
    • 3.RAG案例三(Vue秒传文件+结合文件内容回答问题)


前言

    LangChain 是一个基于语言模型开发应用程序的强大框架,旨在帮助开发人员简化与大模型交互、数据检索以及将不同功能模块串联起来以完成复杂任务的过程。而 RAG(Retrieval-Augmented Generation,检索增强生成)技术则是 LangChain 框架中一项重要的技术,它结合了检索和生成两种能力,以提高自然语言处理任务的效率和质量。 本文将对 LangChain RAG 技术从原理及应用进行详细介绍。


一、Langchain 框架概述

    LangChain 是一个由 Lang.AI(语言人工智能)开发的开源框架,用于开发基于大语言模型(LLM)的应用程序。它提供了丰富的工具、组件和接口,使开发人员能够轻松构建上下文感知和具备逻辑推理能力的应用程序。LangChain 的核心架构主要包括基础层、能力层和应用层,其中基础层包括 Models、LLM、Index 三层,能力层包括 Chains、Memory、Tool 三部分,应用层则构建各种有价值的服务。


二、大模型-RAG技术原理

RAG 技术结合了 信息检索(Retrieval)和自然语言生成(Generation) 两种能力,以提高文本处理任务的效率和质量。其核心原理如下:

  • 信息检索: RAG 通过检索模块从大规模语料库中检索与查询相关的文本片段。这些文本片段是生成高质量输出的基础。
  • 自然语言生成: 基于检索到的文本片段,RAG 的生成模块利用自然语言生成模型(如大型语言模型)进行推理和生成,从而产生符合用户需求的自然语言文本。

RAG(检索增强生成技术) 通过整合外部信息检索来提升大型语言模型的回答质量和知识覆盖。RAG技术可以解决大语言模型的幻觉问题时效性问题数据安全问题


RAG技术的应用分为两个主要阶段:

  • 数据准备阶段
  • 检索生成阶段

数据准备阶段涉及将私有数据向量化并构建索引存入数据库;

检索生成阶段则包括问题向量化、查询匹配数据、获取索引数据、将数据注入Prompt和LLM生成答案。
在这里插入图片描述

RAG技术的优势

  • 减少大模型的幻觉问题,提升生成文本的准确性和权威性。
  • 即时更新检索库,提供最新的信息,满足高时效性的需求。
  • RAG模型的答案来源可查,其回复具有高度的解释性和透明度,这有助于减少误解和提高用户信任。
  • 可以通过私有化部署,确保企业敏感数据的安全。

三、应用示例

1.RAG案例一(私有文档直接读取-问答)

# 1.加载文档
from langchain_community.document_loaders import TextLoader
# 2.导入分割类
from langchain.text_splitter import CharacterTextSplitter
# 3.引入向量化的类
from langchain_community.vectorstores import Chroma
from langchain.embeddings.dashscope import DashScopeEmbeddings
# 5.检索问答
from langchain.chains import RetrievalQA
from langchain_community.llms import Tongyi# 1.加载文档
# 实例化TextLoader对象
loader = TextLoader("SJDJYBM-01-data.txt",encoding="utf-8")
#loader = TextLoader("NBA新闻.txt",encoding="utf-8")
# 加载文档
docs = loader.load()
print(docs)# 2.分割文档
# 实例化
text_splitter = CharacterTextSplitter(separator="\n",chunk_size=200, chunk_overlap=0)
doc = text_splitter.split_documents(docs)
print(doc)# 3.实现文档向量化
# 实例化
embeddings = DashScopeEmbeddings()# 4.构建知识库
# 创建向量数据库,向量化文档
db = Chroma.from_documents(doc,embeddings, persist_directory="./chroma123")
db.persist()# 5.引入大模型 - TongYi
llm = Tongyi()# 6.基于知识库,使用大模型问答
# 实例化
qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever())ret = qa.invoke("火龙果 SJDJYBM-01 风格密文是多少?")
# ret = qa.invoke("2025年NBA冠军是哪支队伍,介绍一下情况?")
# ret = qa.invoke("2025年NBA获胜的队伍是哪个,介绍一下情况?")
#ret = qa.invoke("2025年NBA获胜的队伍是哪个,最有价值球员MVP 是谁,简短回答,不要回答其他的?")print(ret)
# 输出:
#{'query': '火龙果 SJDJYBM-01 风格密文是多少?', 'result': '火龙果的密文是 huolongguo689。根据给定的格式,火龙果 SJDJYBM-01 风格密文表示为:\n\n火龙果 - huolongguo689'}

SJDJYBM-01-data.txt

这是一个物品的加密字典对照表,以"明文-密文"的形式呈现。
以下的加密风格为SJDJYBM-01形式。
比如:
橙子加密后的密文是chengzi102,表示为:橙子-chengzi102
苹果加密后的密文是pingguo357,表示为:苹果-pingguo357
苹果-pingguo357
香蕉-xiangjiao849
橙子-chengzi102
西瓜-xigua561
葡萄-putao473
柠檬-ningmeng298
......

2.RAG案例二(Vue上传文件+结合文件内容回答问题)

上传文件配置步骤:
1.在项目根目录下创建media文件夹
2.settings.py配置

#settings.py
...
import os
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

3.urls.py配置

from django.contrib import admin
from django.urls import path,includefrom django.conf import settings
from django.conf.urls.static import staticurlpatterns = [path('admin/', admin.site.urls),path('', include('app.urls')),path('', include('news.urls'))]urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

核心逻辑代码:

class RagView(APIView):def post(self, request):print(request.FILES)description = request.data.get('description')if 'filename' in request.FILES:myfile = request.FILES['filename']# 将文件保存到MEDIA_ROOT目录下# file_path = os.path.join('uploads', myfile.name)with open(f'{settings.MEDIA_ROOT}/{myfile.name}', 'wb+') as destination:for chunk in myfile.chunks():destination.write(chunk)# 获取文件的绝对路径file_path = f'{settings.MEDIA_ROOT}/{myfile.name}'print(file_path)# 1.加载文档# 实例化TextLoader对象loader = TextLoader(file_path, encoding="utf-8")# 加载文档docs = loader.load()print(docs)# 2.分割文档# 实例化text_splitter = CharacterTextSplitter(separator="\n", chunk_size=200, chunk_overlap=0)doc = text_splitter.split_documents(docs)print(doc)# 3.实现文档向量化# 实例化embeddings = DashScopeEmbeddings()# 4.构建知识库# 创建向量数据库,向量化文档db = Chroma.from_documents(doc, embeddings, persist_directory="./chroma123")db.persist()# 5.引入大模型 - TongYillm = Tongyi()# 6.基于知识库,使用大模型问答# 实例化qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever())ret = qa.invoke(description)print(ret)return Response({'file_path': file_path,'result':ret}, status=200)else:return Response({'error': 'No file was uploaded.'}, status=400)

Vue页面:

<template><div><input type="file" @change="uploadFile" /><input type="text" v-model="description" placeholder="请输入文件描述" /><button @click="submitFile">上传</button></div>{{ret}}
</template><script>
import http from "../http";
export default {data() {return {myfile: null,description: "",ret:'',};},methods: {uploadFile(event) {this.myfile = event.target.files[0];},submitFile() {if (!this.myfile) {alert("请选择一个文件");return;}const formData = new FormData();formData.append("filename", this.myfile);formData.append("description", this.description);http.post("/upload/", formData, {headers: {"Content-Type": "multipart/form-data",},}).then((response) => {alert("文件上传成功");this.ret = response.data.result;}).catch((error) => {alert("文件上传失败");});},},
};
</script>

效果图:
在这里插入图片描述
在这里插入图片描述

3.RAG案例三(Vue秒传文件+结合文件内容回答问题)

通过比对哈希值判断是否是已经上传过的文件,是-则不需要重新上传,否-正常上传文件,以此来实现用户层面的秒传效果。

核心逻辑代码:

class RAGMCView(APIView):def post(self, request):print(request.FILES)description = request.data.get('description')hash_code = request.data.get('hashcode')myfile = FileModel.objects.filter(hash_code=hash_code).first()if myfile:print("111")# 获取文件的绝对路径file_path = myfile.file_pathloader = TextLoader(file_path, encoding="utf-8")docs = loader.load()text_splitter = CharacterTextSplitter(separator="\n", chunk_size=200, chunk_overlap=0)doc = text_splitter.split_documents(docs)embeddings = DashScopeEmbeddings()db = Chroma.from_documents(doc, embeddings, persist_directory="./chroma123")db.persist()llm = Tongyi()qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever())ret = qa.invoke(description)print(ret)return Response({"message":"RAG实现秒传效果,hash值相同不必重新上传文件","result":ret,"code":200})else:print("222")if 'filename' in request.FILES:file_name = request.FILES['filename']with open(f'{settings.MEDIA_ROOT}/{file_name.name}', 'wb+') as destination:for chunk in file_name.chunks():destination.write(chunk)# 获取文件的绝对路径file_path = f'{settings.MEDIA_ROOT}/{file_name.name}'# 存到数据库file_model = FileModel.objects.create(file_path=file_path, hash_code=hash_code, name=file_name.name)file_model.save()loader = TextLoader(file_path, encoding="utf-8")docs = loader.load()text_splitter = CharacterTextSplitter(separator="\n", chunk_size=200, chunk_overlap=0)doc = text_splitter.split_documents(docs)embeddings = DashScopeEmbeddings()db = Chroma.from_documents(doc, embeddings, persist_directory="./chroma123")db.persist()llm = Tongyi()qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever())ret = qa.invoke(description)return Response({"message":"RAG实现秒传效果,hash值不同要重新上传文件","result":ret,"code":200})else:print("333")return Response({"message": "No file was uploaded", "code": 400})

Vue页面:

<template><div><input type="file" @change="onFileChange" ref="fileInput"><input type="text" v-model="description" placeholder="请输入文件描述" /><button @click="calculateHash">计算哈希值</button><button style="margin-left: 10px;" @click="submitFile">上传</button><p v-if="hashResult">文件的SHA-256哈希值: {{ hashResult }}</p></div>
</template><script>
import http from "../http";
export default {data() {return {file: null,description: "",hashResult: null,};},  methods: {onFileChange(e) {this.file = e.target.files[0];},submitFile() {if (!this.file) {alert("请选择一个文件");return;}console.log("this.file.size---->");// 1364B / 1024 = 1.36KB,实际需要 2KB 大小的空间,规则盘块console.log(this.file.size);const formData = new FormData();formData.append("filename", this.file);// formData.append("filename", this.file.size);formData.append("description", this.description);formData.append("hashcode", this.hashResult);http.post("/uploadmc/", formData, {headers: {"Content-Type": "multipart/form-data",},}).then((response) => {alert("文件上传成功");this.ret = response.data.result;}).catch((error) => {alert("文件上传失败");});},async calculateHash() {if (!this.file) {alert('请选择一个文件');return;}try {const hash = await this.getFileSha256(this.file);this.hashResult = hash;} catch (error) {console.error('Error calculating SHA-256 hash:', error);}},async getFileSha256(file) {return new Promise((resolve, reject) => {const reader = new FileReader();reader.onload = async () => {try {const fileContent = new Uint8Array(reader.result);const hashBuffer = await crypto.subtle.digest('SHA-256', fileContent);const hashArray = Array.from(new Uint8Array(hashBuffer));const hashHex = hashArray.map(b => ('00' + b.toString(16)).slice(-2)).join('');resolve(hashHex);} catch (error) {reject(error);}};reader.readAsArrayBuffer(file);});}}
};
</script>

效果图:
在这里插入图片描述


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无字母数字webshell命令执行

<?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$code)){die("NO.");}eval($code); }else{highlight_file(__FILE__); }限制&#xff1a; 1.webshell长度不超过…

【海思SS626 | 内存管理】海思芯片的OS内存、MMZ内存设置

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

基于jsp的宠物领养与服务管理系统(源码+论文+部署讲解等)

博主介绍&#xff1a;✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍&#xff1a;我是程序员阿龙&#xff…

【SpringBoot】自定义注解<约定式i18n国际化>终极升级版方案源码Copy

零、前言 在后端对于 SpringBoot 的 数据库数据&#xff0c;需要国际化的字段和主要显示字段是分离的&#xff0c;为了避免大耦合性&#xff0c;与用户端的国际化字段处理问题&#xff0c;统一采用主要显示数据的实体字段。为此&#xff0c;我设计了一套解决方案&#xff0c;通…

el-form-item,label在上方显示,输入框在下方展示

本来是两排展示去写&#xff0c;设计要求一排展示&#xff0c;label再上方&#xff0c;输入框、勾选框在下方&#xff1b;只能调整样式去修改&#xff1b;参考label-position这个属性 代码如下&#xff1a; <el-form ref"form" :model"formData" clas…

React应用(基于react脚手架)

react脚手架 1.xxx脚手架&#xff1a;用来帮助程序员快速创建一个基于xxx库的模板项目 包含了所有需要的配置&#xff08;语法检查&#xff0c;jsx编译&#xff0c;devServer&#xff09;下载好了所有相关的依赖可以直接运行一个简单结果 2.react提供了一个用于创建react项目…

AWVS——Web 应用漏洞扫描的强大工具

一、引言 在网络安全日益重要的今天&#xff0c;Web 应用的安全性备受关注。Acunetix Web Vulnerability Scanner&#xff08;简称 AWVS&#xff09;作为一款知名的 Web 应用漏洞扫描工具&#xff0c;为保障 Web 应用的安全发挥了重要作用。本文将详细介绍 AWVS 的功能、特点、…

【vulhub靶场之spring】——

简介&#xff1a; Spring是Java EE编程领域的一个轻量级开源框架&#xff0c;该框架由一个叫Rod Johnson的程序员在2002年最早提出并随后创建&#xff0c;是为了解决企业级编程开发中的复杂性&#xff0c;业务逻辑层和其他各层的松耦合问题&#xff0c;因此它将面向接口的编程思…

【Postman工具】

一.接口扫盲 1.什么是接口&#xff1f; 接口是系统之间数据交互的通道。拿小红到沙县点餐为例&#xff1a;小红想吃鸭腿饭。她要用什么语言来表达&#xff1f;跟谁表达&#xff1f;通过什么表达&#xff1f;按照生活习惯应该是&#xff1a;小红根据菜单对服务员用中文表达她想要…

联通数科如何基于Apache DolphinScheduler构建DataOps一体化能力平台

各位小伙伴晚上好&#xff0c;我是联通数字科技有限公司数据智能事业部的王兴杰。 更好的阅读体验可前往原文阅读:巨人肩膀 | 联通数科如何基于Apache DolphinScheduler构建DataOps一体化能力平台 今天&#xff0c;我将和大家聊一聊联通数字科技有限公司是如何基于Apache Dol…

k8s创建secret并在container中获取secret

k8s创建secret并在container中获取secret 本文使用的deployment和service与我的上一篇文章一样。link也放在下面了&#xff0c;如果不懂什么事deployment和service&#xff0c;可以先看我的上一篇文章。 k8s使用kustomize来部署应用 下面我们将通过创建secret开始。secret是我…

保姆教程篇:手把手教你从零开始本地部署Dify

本教程将指导您在个人电脑上安装和配置 Dify。 为什么需要Dify 在开始具体的教程之前&#xff0c;先搞清楚为什么要选择 Dify。 6 月份&#xff0c;阿里巴巴全球数学竞赛中&#xff0c;首次接受AI参赛。结果令人大跌眼镜&#xff1a;AI选手们的表现完全无法与人类选手相提并…

萌啦数据软件价格多少,萌啦数据软件价格是多少

在当今这个数据驱动的时代&#xff0c;无论是企业运营、市场分析还是个人研究&#xff0c;都离不开高效、准确的数据处理与分析工具。萌啦数据软件&#xff0c;作为业界一颗璀璨的新星&#xff0c;凭借其强大的功能、友好的用户界面以及灵活的数据处理能力&#xff0c;赢得了众…

[SWPUCTF 2021 新生赛]PseudoProtocols(构造伪协议)

打开题目所给的环境我们可以看到这样一句话&#xff1a; 这里我先尝试访问/hint.php &#xff0c;但是发现什么都没有发生&#xff0c; F12查看源代码也并没有发现什么&#xff0c;到这里来看的话似乎没有思路了&#xff0c;但是这个题的题目已经给了我们很明显的提示&#xff…

类和对象(中)(1)

类和对象&#xff08;中&#xff09;(1) 类的默认成员函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会⾃动⽣成的成员函数称为默认成员函数。 ⼀个类&#xff0c;我们不写的情况下编译器会默认⽣成以下6个默认成员函数&#xff0c;需要注意的是这6个中最重要的是…

云计算实训24——python基本环境搭建、变量和数据类型、数据集合、py脚本

一、python环境搭建 确保拥有阿里云镜像 查看python环境 [rootpython ~]# yum list installed | grep python 查看epel是否安装 [rootpython ~]# yum list installed | grep epel 安装epel [rootpython ~]# yum -y install epel-release.noarch 查看是否安装python3 [rootpyt…

【数据结构】mapset详解

&#x1f341;1. Set系列集合 Set接口是一种不包含重复元素的集合。它继承自Collection接口&#xff0c;所以可以使用Collection所拥有的方法&#xff0c;Set接口的实现类主要有HashSet、LinkedHashSet、TreeSet等&#xff0c;它们各自以不同的方式存储元素&#xff0c;但都遵…

OceanBase V4.2特性解析:MySQL模式下GIS空间表达式的场景及能力解析

1. 背景 1.1. OceanBase Mysql gis空间表达式的应用场景及能力 在OceanBase 4.1版本中&#xff0c;mysql模式下支持了gis数据类型以及部分空间对象相关的表达式&#xff0c;随着客户使用空间数据的需求日益增长&#xff0c;需要快速地补齐空间数据存储和计算分析的能力&#…

实景三维:解锁地理信息新维度,引领未来城市智慧之钥

在这个信息爆炸与科技日新月异的时代&#xff0c;地理信息与遥感技术正以前所未有的速度改变我们认知世界的方式。在推动“实景三维平台”这一前沿科技的构建上&#xff0c;它不仅是地理信息的立体呈现&#xff0c;更是智慧城市的基石&#xff0c;打开了通往未来城市规划、管理…

C++设计模式(代理模式)

1. 电话虫 在海贼中&#xff0c;有一种神奇的通信工具叫做电话虫&#xff08;Den Den Mushi&#xff09;&#xff0c;外形如蜗牛&#xff0c;身上带有斑点或条纹或通体纯色&#xff0c;壳顶上有对讲机或按键&#xff0c;不接通时会睡觉&#xff0c;接通时会惊醒&#xff0c;并发…