大模型RAG企业级项目实战:ChatDoc与文件聊天交互完整版代码

news2024/12/24 23:50:03

大模型RAG企业级项目实战:手把手带你搭建一套属于你的RAG系统

完整的 RAG 应用流程主要包含两个阶段:

数据准备阶段:(1)数据提取–> (2)分块(Chunking)–> (3)向量化(embedding)–> (4)数据入库

检索生成阶段:(1)问题向量化–> (2)根据问题查询匹配数据–> (3)获取索引数据 --> (4)将数据注入Prompt–> (5)LLM生成答案

在这里插入图片描述

#导入包
from langchain.document_loaders import UnstructuredExcelLoader,PyPDFLoader,Docx2txtLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS    

#引入多重查询检索和LLM
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain.chat_models import ChatLiteLLM
from langchain.prompts import ChatPromptTemplate

__import__('pysqlite3')
import sys
sys.modules['sqlite3'] = sys.modules.pop('pysqlite3')


#定义chatdoc
class ChatDoc():
    def __init__(self):
        self.doc = None
        self.splitText = []
        self.template = [
            ("system", "你是一个处理文档的秘书,你从不说自己是一个大模型或AI助手,你会根据下面提供的上下文内容来继续回答问题.\n 上下文内容 \n {context} \n"),
            ('human','你好!'),
            ('ai','你好!'),
            ('human','{question}')
        ]
        self.prompt = ChatPromptTemplate.from_messages(self.template)
    #加载文本
    def getFile(self):
        doc = self.doc
        loader = {
            "docx": Docx2txtLoader,
            "pdf": PyPDFLoader,
            "xlsx": UnstructuredExcelLoader,
        }
        file_extension = doc.split('.')[-1]  #加载文件,选择文件类型
        loader_class = loader.get(file_extension)
        if loader_class:
            try:
                loader = loader_class(doc)
                text = loader.load()
                return text
            except Exception as e:
                print(f'Error loading{file_extension} files:{e}')
                return None
        else:
            print(f'Unsupporyed file extension: {file_extension}')
            return None
    #处理文本的函数
    def splitsentences(self):
        full_text = self.getFile() #获取文档内容
        if full_text != None:
            #对文档进行切分,chunk_size 指定了每个文本块的最大字符数,而 chunk_overlap 指定了每个块之间的重叠字符数
            text_splitter = CharacterTextSplitter(chunk_size = 200,chunk_overlap = 20)
            self.splitText = text_splitter.split_documents(full_text)
    
    #向量化与向量存储
    def embeddingAndVectorDB(self):
        embeddings = HuggingFaceEmbeddings()
        db = FAISS.from_documents(documents = self.splitText, embedding = embeddings)
        return db
    
    #提问并找到相关的文本块
    def askAndFindFiles(self, question):
        db = self.embeddingAndVectorDB()
        #把问题交给LLM进行多角度扩展
        llm = ChatLiteLLM()
        retriever_from_llm = MultiQueryRetriever.from_llm(
            retriever = db.as_retriever(),
            llm = llm
        )
        return retriever_from_llm.aget_relevant_documents(question)
    
    #用自然语言和文档聊天
    def chatWithDoc(self, question):
        contents = ""
        context = self.askAndFindFiles(question)
        for i in context:
            contents += i.page_content
        
        messages = self.prompt.format_messages(context = contents, question = question)
        chat =  ChatLiteLLM(  
                streaming=True,  
                verbose=True,  
                callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]),  
            )  
        return chat.invoke(message)

def main():
    chat_doc = ChatDoc()
    chat_doc.doc = '/kaggle/input/data-docxdata-docx/.docx' #输入自己的文档
    chat_doc.splitsentences()
    result = chat_doc.chatWithDoc('你是谁?') 
    print(result)
    
main()

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

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

相关文章

五、1 算数操作符位操作符

1、算数操作符 (1)“ / ”得到一个整数商,不包含余数 进行浮点数除法,操作符两端至少有一个浮点数 (2)“ % ”取模,得到余数 两端必须为整数 2、位操作符(只适用于整型&#xff…

Linux 中的同步机制——rwsem

代码基于:Kernel 6.6 0. 前言 读写信号量的原理与读写锁类似,读写信号量归根到底是 “信号量”,读写锁归根到底是 “自旋锁”,而信号量与自旋锁的区别一个可以睡眠,一个只能自旋。 读写信号量原理: 允许…

Spring Data JPA 自动创建时间的相关注解和用法

以Springboot项目为例 在实体类上加上注解 EntityListeners(AuditingEntityListener.class)在相应的字段上添加对应的时间注解 LastModifiedDate 和 CreatedDateApplication启动类中添加注解 EnableJpaAuditing

动环监控是什么?没有它机房可能发生宕机风险!

在大数据时代,计算机和服务器管理着大量的数据,无论是十几平米的小机房,还是几千平米的大机房,一旦宕机,就可能造成最大损失。因此,利用动环监控系统去进行实时监测和统一管理,就成为了非常重要…

【Linux】Linux软件包管理器 yum 和 Linux编辑器vim

目录 1. Linux 软件包管理器 yum1.1 什么是软件包1.2 windows 机器和远端的 Linux 机器互传文件1.3 查看软件包1.4 安装软件1.5 卸载软件1.6 yum源 2. Linux编辑器-vim2.1 vim三大模式2.2 vim正常模式命令集2.2 vim底行模式命令集2.3 多文件 3. 简单vim配置3.1 配置文件的位置 …

YOLOv5 目标检测算法

简介: 目标检测在生活中应用领域非常广泛,列如:道路违规抓拍、未戴口罩识别、工地未佩戴安全帽抓拍、厨房出现老鼠检测。 还可以用在游戏辅助外挂。以枪战为例,在游戏过程中时刻检测有没有人头出现。当检测到目标人头,…

a标签下载文件重命名(download)不生效

项目场景: 移动端使用 a 标签下载文件 问题描述 下载的文件使用 download 重命名不生效 APP 中接收数据代码: const link document.createElement(a) // 创建a标签link.style.display none // 使其隐藏link.href http://192.168.103.1:8080/factory/v…

操作系统内存管理技术详解

操作系统内存管理技术详解:第一部分 引言 操作系统作为计算机系统的核心组件,负责管理硬件资源、提供用户接口和运行应用程序。在操作系统的众多功能中,内存管理无疑是最为关键的技术之一。本文将深入探讨操作系统内存管理的背后技术&…

如何选择图片和视频

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何选择视频文件"相关的内容,本章回中将介绍如何混合选择图片和视频文件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我…

Android逆向题解-Illusion-难度6

jeb反编译 s 是用户输入,s1 是加密后flag: KuG_V9v(yGS 传入Native函数 CheckFlag IDA分析Native函数 注意这里有一个陷阱,CheckFlag有静态注册函数和动态注册函数,会执行动态注册的函数。 a2 93 只会走sub_1028 sub_102…

如何找IEEE论文中的作者指南(INFORMATION FOR AUTHORS)

文章目录 0.为什么需要作者指南1.进入所要发表期刊的官网并找到作者指南1.1百度直接搜索Transactions on Cybernetics1.2 点击About Journal进入并点击左下角Publication Details1.3 展开后点击Informations for author1.4 下载作者指南 2.结果显示 0.为什么需要作者指南 说明你…

STM32CubleMX创建FreeRtos工程教程,图文教程

前言:STM32CubeMX 是一个开发工具,它已经将 FreeRTOS 这个实时操作系统(RTOS)集成到其工具中。换句话说,通过 STM32CubeMX,可以非常方便地为 STM32 微控制器生成配置代码,其中包括对 FreeRTOS 的…

进阶SpringBoot之员工管理系统(5)展示员工列表和添加员工

Employee.java:模拟员工表 package com.demo.web.pojo;import lombok.Data; import lombok.NoArgsConstructor;import java.util.Date;//员工表 Data NoArgsConstructor public class Employee {private Integer id;private String lastName;private String email;…

第十五章 数据管理成熟度评估5分

15.0 语境关系图 活动: 计划评估活动(P)。进行成熟度评估(C)。拟定建议(D)。制定有针对性的改进计划(P)。 5. 重新评估成熟度(C) 应定期进行重新…

18308 最长公共子序列长度

### 分析 1. **问题描述**: - 给定两个字符串,要求找到它们的最长公共子序列的长度。 2. **解决方案**: - 使用动态规划(Dynamic Programming, DP)来解决这个问题。 - 定义一个二维数组dp,其中d…

使用AWS Lambda轻松开启Amazon Rekognition之旅

这是本系列文章的第一篇,旨在通过动手实践,帮助大家学习亚马逊云科技的生成式AI相关技能。通过这些文章,大家将掌握如何利用亚马逊云科技的各类服务来应用AI技术。 那么让我们开始今天的内容吧! 介绍 什么是Amazon Rekognition&…

Java基础之循环嵌套

循环嵌套 在一个循环内部可以嵌套另一个或多个循环。 外部循环每执行1次,内层循环会执行1轮(全部)。 案例1: 连续3天,每天都要表白5次。 package com.briup.chap03;public class Test03_Nest {public static void main(String[] args) {…

MyBatis-Plus 自动填充字段详细教程

所以,接受事实,调整下略微悲观的态度。未来,也不一定就只会发生不好的变化。这变化,说不定也有好的,不是吗? 今天编写一个详细的教程来介绍如何在 Spring Boot 项目中使用 MyBatis-Plus 实现自动填充时间字…

补充线程结束方式,资源回收与线程的相互竞争

一.补充线程结束的方式 1.pthread_exit //pthread_jion 2.从线程执行函数中return //此时效果等价于pthread_exit 3. int pthread_ cancel (pthread _ t thread) 功能:发送取消请求 参数:thread 表示要发送的线程tid号 4.…

cv2,PIL绘制矩形框与图片的切片(易错)

目录 1. cv2绘制矩形框代码 2. PIL绘制矩形 3. cv2图片的切片 1. cv2绘制矩形框 import cv2# 读取图像 img cv2.imread(img.png)# 绘制矩形框 cv2.rectangle(img, (100, 200), (300, 300), (0, 255, 0), 3)# 显示图像 cv2.imshow(Image with Rectangle, img) cv2.waitKey(0…