山东大学项目实训-基于LLM的中文法律文书生成系统(十九)- RAG(5)

news/2024/9/22 7:37:16

项目代码解读

# 官方库
import os
import shutil
import time
from datetime import datetime
import logging
import pickle
from glob import glob
from typing import List# 第三方库
# langchain库
from langchain.document_loaders import UnstructuredPowerPointLoader, UnstructuredWordDocumentLoader, \UnstructuredPDFLoader, UnstructuredFileLoader
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitterimport faiss
import numpy as np
from tqdm import tqdm# 内部库
from client import get_client
from conversation import postprocess_text, preprocess_text, Conversation, Roleclient = get_client()
  1. from langchain.embeddings import HuggingFaceEmbeddings:这行代码导入了langchain库中的HuggingFaceEmbeddings类。
  2. from langchain.text_splitter import RecursiveCharacterTextSplitter:这行代码导入了langchain库中的RecursiveCharacterTextSplitter类。

Embedding模型

我们在做RGA开发时又会涉及到向量数据库,在创建向量数据库时又需要使用Embedding模型对文本进行向量化处理,目前市面上的大模型如OpenAI,Gemini的模型都提供可供调用的Embedding模型,但这些大公司的Embedding模型都存在着种种限制条件比如OpenAI的Embedding模型不是免费的,它是根据token数量来收费的,这显而易见会增加我们的使用成本,而Gemini的Embedding模型目前可以免费使用,但是它又有每分钟不得超过60次调用的限制,这些种种的限制会给我们在创建向量数据库时带来很大的麻烦,为此我们需要找到一种免费的高性能的Embedding模型,经过我在网上不予余力的搜索,

终于找到了一个比较适合我们中国人使用的Embedding模型:BAAI的Embedding模型,而且它是我们中国人自己开发的,同时支持中文和英文。大家可以在github或者Huggingface上面查看他们模型的相关信息。

img

对于本项目,基于中文文档的需要,最终我们选择了这个模型:

shibing624/text2vec: text2vec, text to vector. 文本向量表征工具,把文本转化为向量矩阵,实现了Word2Vec、RankBM25、Sentence-BERT、CoSENT等文本表征、文本相似度计算模型,开箱即用。 (github.com)

image-20240624005542326

langchain.text_splitter

RecursiveCharacterTextSplitter可以处理通用文本。它以一个字符列表作为参数,按照顺序尝试基于这些字符进行分割,直到块足够小。默认的字符列表是["\n\n", "\n", " ", ""]. 这样做的效果是尽可能保持段落(然后是句子,最后是单词)在一起,因为从通用的角度来看,这些通常是语义上最相关的文本片段。

class ChatDoc:# 实现单例模式_instance = None# 向量数据库的基路径db_base_path = "data/db"def __init__(self) -> None:self.llm = client# 向量数据库的引用self.vector_db = None# 字符串数据库的引用self.string_db = None# 文件列表self.files = Noneself.embeddings_size = 768self.embeddings = HuggingFaceEmbeddings(model_name="./embedding")# 初始化完成后打印一条消息,表示聊天机器人初始化成功。print("chatbot init success!")

_instance = None:这行代码定义了一个私有静态变量_instance,其初始值为None。这用于实现单例模式。

模型参数:

db_base_path = "data/db":向量数据库的基路径。

self.llm = client:模型ChatGLM3入口地址。

self.vector_db = None:向量数据库的引用。

self.string_db = None:字符串数据库的引用。

self.files = None:文件列表的引用。

self.embeddings_size = 768:这行代码初始化了一个名为self.embeddings_size的实例变量,其值为768。这可能是嵌入的大小。

self.embeddings = HuggingFaceEmbeddings(model_name="./embedding"):初始化embeddings实例变量,参数是模型路径。

单例模式

python __instance

简单而言,单例模式就是保证某个实例在项目的整个生命周期中只存在一个,在项目的任意位置使用,都是同一个实例。

@classmethod
def get_instance(cls):if cls._instance is None:cls._instance = ChatDoc()return cls._instance

如果cls._instance尚未初始化,则执行。

cls._instance = ChatDoc():这行代码创建一个新的ChatDoc实例,并将其存储在cls._instance变量中。这是单例实例的初始化。

return cls._instance:这行代码返回cls._instance变量,即单例实例。

通过使用get_instance方法,您可以确保在整个程序中只有一个ChatDoc实例被创建和访问。这有助于节省资源,因为您不需要为每个请求创建新的实例,并且可以保证所有操作都使用相同的实例。

边界情况

class Singleton(object):_instance = Nonedef __new__(cls, *args, **kw):if cls._instance is None:cls._instance = object.__new__(cls, *args, **kw)return cls._instance

这种写法有两个问题。

1.单例模式对应类实例化时无法传入参数,将上面的代码扩展成下面形式。

python __instance_单例模式

此时会抛出TypeError: object.__new__() takes exactly one argument (the type to instantiate)错误

2.多个线程实例化Singleton类时,可能会出现创建多个实例的情况,因为很有可能多个线程同时判断cls._instance is None,从而进入初始化实例的代码中。

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

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

相关文章

GitHub上狂揽62Kstars的程序员做饭指南

写在前面 作为一名程序员,我们经常会在全球最大的同性交友网站 GitHub上寻找一些优质的开源项目来学习,以提升自己的专业技能。 今天给大家推荐的是一个GitHub上狂揽61K⭐⭐的开源项目。项目名叫做HowToCook,只听名字,大家应该能想到这是一个教程序员怎么做饭的项目。 作为一…

VueX Vue: Could not find a declaration file for module vuex.

vuex4.0.2 webstorm报如下错误 Vue: Could not find a declaration file for module vuex.解决办法 在src目录下新建一个vuex.d.ts 文件内容如下 declare module "vuex" {export * from "vuex/types/index.d.ts";export * from "vuex/types/helpers.d…

webstorm vue3+ts报错:Cannot find module ‘@/views/xxx.vue‘ or its corresponding type declarations

意思是说找不到对应的模块“@/views/xxx.vue”或其相应的类型声明因为ts只能解析 .ts 文件,无法解析 .vue文件 解决方法很简单,一开始的时候env.d.ts是空文件(如vite-env.d.ts),我们可以在项目的env.d.ts中引入如下代码: declare module *.vue {import { DefineComponent }…

Dell Latitude 7300 安装 Centos 7.6 保姆级教程

本教程记录通过Windows 10 制作Centos Linux 7.6 并安装到 Dell Latitude 7300 过程。 该教程为覆盖机器原有磁盘数据方式安装,原有系统上所有数据将丢失,如有重要数据请注意备份。下载Centos 7.6 镜像 url : https://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.6.1810/i…

Keepalived 高可用

一、Keepalived1.Keepalived是什么 Keepalived 是一个用于 Linux 系统的开源软件,主要用于实现负载均衡和高可用性服务。它通常用于网络服务的故障转移和故障恢复,特别是在基于 IP 的负载均衡器和虚拟 IP 地址上。以下是 Keepalived 的一些关键特性和功能:虚拟 IP (VIP) 支持…

全网最适合入门的面向对象编程教程:00 面向对象设计方法导论

主要对面向过程编程与面向对象编程进行对比,介绍了软件危机的背景,讲解了面向对象编程设计思想的由来,对面向对象方法学:OOA-OOD-OOP进行简单介绍。全网最适合入门的面向对象编程教程:00 面向对象设计方法导论 1.1 面向过程编程与面向对象编程 OOP 在嵌入式开发中,我们往…

ubuntu wps odbc 连接sqlite

ubuntu桌面版办公环境,不能用office,使用wps_linux表格处理数据,大量数据写入的时候,python特别慢,需要表格连接数据库读写数据 安装sqlite odbc 首先安装sqlite的odbc sudo apt-get update sudo apt-get install unixodbc unixodbc-dev libsqlite3-devgit clone https://githu…

【Linux系列】实现SSH服务免密登录功能配置

【实验目的】实现两台linux主机可以通过SSH实现异地互连。 【实验条件】两台linux虚拟机 OoOoO:192.168.10.39 OoOoO1:192.168.10.40 改主机名: [root@localhost ~]# vim /etc/hostname在hosts文件中做映射: [root@localhost ~] #vim /etc/hosts[root@localhost ~]# reboot …