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

news2024/9/22 9:46:39

在这里插入图片描述

文章目录

  • 前言
  • 一、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,include

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
   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.引入大模型 - TongYi
            llm = 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_path
            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)

            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.coloradmin.cn/o/2034483.html

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

相关文章

C语言——预处理详解(上)

目录 引言 预定义符号 define 定义常量 #define 定义宏 带有副作用的宏参数 宏替换的规则 宏和函数的对比 引言 在C语言编程中&#xff0c;预处理是编译前的关键步骤&#xff0c;它负责处理如宏定义、条件编译和文件包含等指令。今天我们来学习一下有关C语言——预处理…

洛谷 3道 函数 题目 题解 (超详细)

题目目录&#xff1a; No.1 B2137 判决素数个数 No.2 B2138 最大质因子序列 No.3 B2140 二进制分类 OK&#xff0c;开始正文&#xff01; 第一题&#xff1a; B2137 判决素数个数 题目描述 求 X&#xff0c;Y 之间的素数个数&#xff08;包括 X 和 Y&#xff09;。 输入…

LB-8100A 推拉力测试机精密推拉力试验机

LB-8100A 多功能推拉力测试机广泛应于与 LED 封装测试、IC 半导体封 装测试、TO 封装测试、IGBT 功率模块封装测试、光电子元器件封装测试、汽 车领域、航天航空领域、军工产品测试、研究机构的测试及各类院校的测试 研究等应用。 多功能推拉力测试机精密推拉力试验机 *设备硬件…

地热模拟软件opengeosys-OGS安装和学习1

1.下载地址 官网&#xff1a;https://www.opengeosys.org/ 界面Gina&#xff1a;https://discourse.opengeosys.org/t/gina-version-3-24/175 https://teambeam.bgr.de/my/drive/folder/68&#xff08;注意下载压缩包&#xff0c;有些注册表需要处理&#xff09; 2.处理 下…

视频汇聚平台智能边缘分析一体机分析平台摄像头异常位移算法识别检测

智能边缘分析一体机在摄像头异常位移检测方面扮演着关键角色&#xff0c;它利用先进的图像处理技术和机器学习算法来实时监测摄像头状态&#xff0c;判断是否发生了非预期的位移。下面是智能边缘分析一体机如何检测摄像头异常位移的详细步骤&#xff1a; 1. 图像帧对比&#x…

内部排序(二路归并、基数、计数)

【内部排序&#xff08;插入、交换、选择&#xff09;】 一、二路归并排序 1. 算法思想与实现步骤 1&#xff09;算法思想&#xff1a; 二路归并排序是一种分治算法。它将待排序的序列分为两个子序列&#xff0c;分别对这两个子序列进行排序&#xff0c;然后将两个已排序的子…

安美数字酒店宽带运营系统 weather.php 任意文件读取漏洞复现

0x01 产品简介 HiBOS酒店宽带运营系统是由安美世纪(北京)科技有限公司开发的一套专为酒店设计的宽带管理系统。该系统旨在提升酒店宽带服务的运营效率和安全性&#xff0c;为酒店客人提供稳定、高速、便捷的上网体验。 0x02 漏洞概述 安美数字酒店宽带运营系统 weather.php …

【Linux】快速入门系列(四) —— Linux实用操作

Linux实用操作 前言&#xff1a;先换个阿里的源一、各类小技巧 — 快捷键&#xff08;一&#xff09;强制停止 CtrlC&#xff08;二&#xff09;退出或登出 CtrlD&#xff08;三&#xff09;历史命令搜索的三种方式&#xff08;四&#xff09;光标移动快捷键&#xff08;五&…

无人机之机架布局篇

一、“十”字型 “十”字布局适合刚接触无人机的初学者&#xff0c;是起初最先发展的布局。 优点&#xff1a;控制简单&#xff0c;首尾明确&#xff0c;俯仰和横滚运动仅需改变一对电机的转速。 缺点&#xff1a;机体前向视角易被螺旋桨遮挡&#xff0c;灵活性有所不足&…

DHCP服务(服务名dhcpd,端口UDP /67和UDP/68)

目录 前言 配置文件 DHCP服务器的配置 下载安装DHCP服务 编辑配置文件 重启服务 客户端测试 配置客户端网卡 重启网卡 前言 DHCP动态主机配置协议是一种网络协议&#xff0c;提供了动态配置IP地址的功能&#xff0c;允许服务器自动为网络上的设备分配IP地址和其他网络…

自动化测试面试常用题库

自动化面试题记录整理&#xff08;部分答案自己整理&#xff09; selenium中如何判断元素是否存在&#xff1f; 没有提供原生的方法判断元素是否存在&#xff0c;一般我们可以通过定位元素异常捕获的方式判断selenium中hidden或者是display &#xff1d; none的元素是否可以定…

8080端口被占怎么处理?

一、Windows系统 1、 按住WinR输入CMD打开命令行窗口 2、运行以下命令来查看占用端口 8080 的程序的 PID&#xff08;进程标识符&#xff09;&#xff0c;可以看到PID是12040 netstat -ano | findstr 8080 3、 运行以下命令来终止占用端口 8080 的程序&#xff1a; taskkill /p…

精彩回顾 | 风丘科技亮相2024名古屋汽车工程博览会

2024年7月17日-19日&#xff0c;风丘科技联合德国IPETRONIK亮相日本名古屋汽车工程博览会。该展会面向汽车行业不同应用场景&#xff0c;包括新的eAxle、FCEV、ADAS、测试测量系统和ECU测试等相关技术&#xff0c;是一个专为活跃在汽车行业前线的工程师和研究人员举办的汽车技术…

腾讯云 AI代码助手 | 尽享 AI时代下的程序员福利

腾讯云 AI代码助手 | 尽享 AI时代下的程序员福利 前言腾讯云AI代码助手智能补全代码信息&#xff08;代码补全&#xff09;精准修复错误代码&#xff08;代码优化&#xff09;清晰解释既有代码&#xff08;解释代码&#xff09;按需生成单元测试&#xff08;生成单元测试&#…

NoSQL 之Redis集群模式

目录 案例概述 redis工作模式 主从模式 哨兵模式 redis cluster模式 Redis集群介绍 Redis集群的优势 Redis集群的实现方法 Redis-Cluster数据分片 Redis-Cluster的主从复制模型 Redis集群部署 案例部署 安装redis 检查redis的状态 修改配置文件 重启启动redis服…

第二证券:A股三大指数震荡调整 环保板块强势拉升

环保板块迎来重磅方针 昨日&#xff0c;环保板块强势拉升&#xff0c;永清环保20%涨停&#xff0c;东江环保、启迪环境、雪迪龙等多股涨停。 音讯面上&#xff0c;中共中央、国务院近来印发《关于加快经济社会开展全面绿色转型的定见》。定见布置加快形成节省资源和保护环境的…

WordPress原创插件:Keyword-ranking-seo 1.0 关键词排名插件 有利于seo

WordPress原创插件&#xff1a;Keyword-ranking-seo 1.0 关键词排名插件 有利于seo 当用户访问网站时&#xff0c;该链接会随机选择一个关键词&#xff0c;并使用选定的搜索引擎进行搜索。 插件下载链接 https://download.csdn.net/download/huayula/89632792

备战秋招60天算法挑战,Day17

题目链接&#xff1a; https://leetcode.cn/problems/valid-anagram/ 视频题解&#xff1a; https://www.bilibili.com/video/BV1db421J7qK/ LeetCode 242. 有效的字母异位词 题目描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意…

同城搭子社交系统开发同城搭子群活动APP圈子动态小程序

引言 随着互联网技术的飞速发展&#xff0c;同城搭子社交系统作为一种新兴的社交模式&#xff0c;正逐渐在市场中占据一席之地。该系统通过搭子群活动和圈子动态等功能&#xff0c;为用户提供了一种高效、精准的社交体验。本文将从市场前景、使用人群、盈利模式以及运营推广等…

azure 上如何创建 Kubernetes 集群?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…