MOE模式:或将是最好的大模型应用开发路径

大模型相关目录

大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容
从0起步,扬帆起航。

  1. 基于Dify的智能分类方案:大模型结合KNN算法(附代码)
  2. OpenCompass:大模型测评工具
  3. 一文读懂多模态大模型基础架构
  4. 大模型管理平台:one-api使用指南
  5. 大模型RAG、ROG、RCG概念科普
  6. RAGOnMedicalKG:大模型结合知识图谱的RAG实现
  7. DSPy:变革式大模型应用开发
  8. 最简明的Few-shot Prompt指南
  9. Semantic Kernel:微软大模型开发框架——LangChain 替代
  10. 对话大模型Prompt是否需要礼貌点?
  11. swift与Internvl下的多模态大模型分布式微调指南(附代码和数据)
  12. 多模态大模型Internvl-1.5-26B微调后部署及测试实录(附代码)
  13. 多模态大模型Internvl-2-26B的OCR赋能方案(附代码)
  14. miniconda+xinference的大模型推理部署指南
  15. Mem0:大模型最强赋能“有记忆的LLM”
  16. 再谈Agent:Dify智能体实现Txet2SQL
  17. Moe模式:或将是最好的大模型应用开发路径

文章目录

  • 大模型相关目录
  • 简介
  • 实战
  • 总结


简介

MOE(Mixture of Experts,混合专家)是一种机器学习模型架构,旨在通过结合多个专家网络来提高模型的性能和泛化能力。以下是传统模型和大模型中MOE模式的相关介绍及其优势。

传统模型中的MOE
在传统模型中,MOE通常由以下几个部分组成:

  1. Gate网络:决定输入数据应该被路由到哪一个专家网络。Gate网络可以根据输入数据的特征来动态分配数据。
  2. Expert网络:一系列专门的网络,每个网络都是针对特定数据分布进行训练的。Expert网络可以是对特定问题有深入理解的小模型。
  3. 组合层:将所有Expert网络的输出进行组合,形成最终的预测结果。

优势

  • 提高泛化能力:不同的Expert可以学习数据的不同方面,从而提高模型对未知数据的泛化能力。
  • 降低计算成本:不是所有Expert都会处理每个输入,Gate可以根据需要激活特定的Expert,这可以减少计算资源的使用。
  • 灵活性强:可以很容易地通过增加或减少Expert来调整模型的大小和复杂度。

通俗地来讲,大模型中的MOE可以处理更加多样化的任务和数据类型进而提升应用效果,因为每个Expert都可以专注于不同的子任务或数据模式。简单地看,moe模式下的大模型应用开发本质上是对任务进行拆解,用大模型、小模型分工完成的一种思路。

实战

大部分代码参考文章:
https://blog.csdn.net/qq_43128256/article/details/140472280
该文章使用多模态大模型对人员学历信息进行ocr赋能,其中,绝大部分字段表现较好,精度如下:
人员姓名、学历层次识别准确率100%;性别识别准确率99.17%;专业识别准确率95.86%;毕业院校识别准确率92.56%;出生日期识别准确率90.91%毕业日期识别准确率88.42%;证件编号识别准确率36.3%.
可见,对于长编码的阿拉伯字符串内容识别,多模态大模型存在较大问题,因此有必要引入moe机制,使用传统小模型对内容进行处理。

代码:

#!/usr/bin/env python
# coding: utf-8# In[1]:import functions as fc
import json
import os
from config import *
import base64
from openai import OpenAI
import openai
import pandas as pdfrom paddleocr import PaddleOCR
# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
ocr = PaddleOCR(use_angle_cls=True, lang="ch")  # need to run only once to download and load model into memoryConf = Config()
configs = Conf.get_config()ocr_result_path = configs.ocr_result_path
second_path = configs.second_path # mid# In[2]:def get_ocr_result(img_path):result = ocr.ocr(img_path, cls=False)return resultdef save_list_as_jsonl(data_list, file_path):"""将列表存储为JSONL格式的文件。参数:data_list -- 要存储的列表。file_path -- 输出文件的路径。"""with open(file_path, 'w', encoding='utf-8') as f:for item in data_list:json_line = json.dumps(item, ensure_ascii=False)f.write(json_line + '\n')def read_jsonl(file_path):"""读取JSONL格式的文件,并将每一行解析为一个Python对象。参数:file_path -- 要读取的JSONL文件的路径。返回:一个列表,包含文件中每一行解析后的Python对象。"""data_list = []with open(file_path, 'r', encoding='utf-8') as f:for line in f:data_list.append(json.loads(line))return data_listdef get_llm_ocr_response(input_text):client = openai.Client(api_key='YOUR_API_KEY', base_url='http://172.20.32.127:12335/v1')# 确保获取模型ID的代码是正确的models = client.models.list()if not models.data:print("No models found.")returnmodel_name = models.data[0].idtry:response = client.chat.completions.create(model=model_name,messages=[{"role": "system","content": "## 职位:你是一个信息抽取专家,可从原始文字信息中提取证书编号,并输出json格式化的识别结果"},{"role": "user","content": f"原始文字信息:\n{input_text}\n" + '''你需要从原始文字信息中提取证书编号,提取后返回的json格式参考如下:{"证书编号":"162391201905007614"}注意,提取不到时将提取内容标注“null”。注意,我不需要任何代码,请输出json格式结果,json严格按照上述格式。'''}],temperature=0,top_p=1)answer = response.choices[0].message.contentprint(answer)return answerexcept openai.error.BadRequestError as e:print(f"Error: {e}")print(f"Error details: {e.details}")def get_elements_with_string(lst, target_string):return [element for element in lst if target_string in element]def read_json_file(file_path):try:with open(file_path, 'r', encoding='utf-8') as file:data = json.load(file)return dataexcept FileNotFoundError:return "文件未找到。请检查文件路径是否正确。"except json.JSONDecodeError:return "文件内容不是有效的JSON。"except Exception as e:return f"读取文件时发生错误: {e}"# In[3]:file_paths = fc.list_files_with_absolute_paths(r'C:\Users\12258\Desktop\hy-vLLM\rysb\singel_code_test\code')ocr_results = []
for file_path in file_paths:print('OCR正在识别:',file_path)ocr_result = get_ocr_result(file_path)ocr_results.append({file_path.split('\\')[-1]:ocr_result})# In[4]:save_list_as_jsonl(ocr_results,'single_ocr_results.jsonl')# In[15]:ocr_results = read_jsonl('single_ocr_results.jsonl')
ocr_dict = {}
for orc_result in ocr_results:ocr_dict[list(orc_result.keys())[0]] = list(orc_result.values())[0]file_paths = fc.list_files_with_absolute_paths(second_path)current_path = os.getcwd()
ocr_json_path = os.path.join(current_path, "single_ocr_json")
fc.create_directory(ocr_json_path)for k,v in ocr_dict.items():
#     try:print(k)ocr_response = get_llm_ocr_response(v)data_dict = json.loads(fc.post_processing(ocr_response).replace('\\n','').replace('\\',''))fc.save_json_to_file(data_dict,ocr_json_path+'\\'+k.split('\\')[-1].split('.')[0]+'.json')
#     except Exception as e:
#         current_time_str = configs.now_time_str
#         fc.error_log('json save error!'+' '+k+' '+current_time_str)
#         print(f"保存JSON数据时发生错误: {e}")# In[29]:mid_excel_path = r"C:\Users\12258\Desktop\hy-vLLM\rysb\singel_code_test\已核对 - 副本.xlsx"
name_set = pd.read_excel(mid_excel_path)['学生姓名'].tolist()file_absolute_paths = fc.list_files_with_absolute_paths(r'C:\Users\12258\Desktop\hy-vLLM\rysb\student_infos_process_V20240715\single_ocr_json')
finall_json_ls = []
for name in name_set:#对于每个学生,定位其名下所有文件mid_file_paths = get_elements_with_string(file_absolute_paths,name)zhuanke_files = get_elements_with_string(mid_file_paths,'专')len_zhuanke_files = len(zhuanke_files)benke_files = get_elements_with_string(mid_file_paths,'本科')len_benke_files = len(benke_files)shuoshi_files = get_elements_with_string(mid_file_paths,'硕士')len_shuoshi_files = len(shuoshi_files)yanjiusheng_files = get_elements_with_string(mid_file_paths,'研究生')len_yanjiusheng_files = len(yanjiusheng_files)boshi_files = get_elements_with_string(mid_file_paths,'博士')len_boshi_files = len(boshi_files)error_flag = len_zhuanke_files+len_benke_files+len_shuoshi_files+len_yanjiusheng_files+len_boshi_files
#     print(name,error_flag)if error_flag == 0:current_time_str = configs.now_time_strprint(name,'file name error!')fc.error_log('file name error!'+' '+name+' '+current_time_str)else:if len_boshi_files:mid_file = get_elements_with_string(boshi_files,'毕业')if len(mid_file) == 0:passelse:finall_json_ls.append(mid_file[0])continueif yanjiusheng_files+shuoshi_files:mid_file = get_elements_with_string(yanjiusheng_files+shuoshi_files,'毕业')if len(mid_file) == 0:finall_json_ls.append((yanjiusheng_files+shuoshi_files)[0])continueelse:finall_json_ls.append(mid_file[0])continueif len_benke_files:mid_file = get_elements_with_string(benke_files,'毕业')if len(mid_file) == 0:finall_json_ls.append((benke_files)[0])continueelse:finall_json_ls.append(mid_file[0])continueif len_zhuanke_files:mid_file = get_elements_with_string(zhuanke_files,'毕业')if len(mid_file) == 0:finall_json_ls.append((zhuanke_files)[0])continueelse:finall_json_ls.append(mid_file[0])continuename_ls = []
sex_ls = []
birthday_ls = []
qualification_ls = []
time_ls = []
school_ls = []
major_ls = []
code_ls = []for finall_json in finall_json_ls:extract_flag = 0single_json_data = read_json_file(finall_json)try:code_ls.append(single_json_data['证书编号'].replace(' ',''))except:extract_flag = 1code_ls.append('null')if extract_flag:current_time_str = configs.now_time_strprint(finall_json,'file extract format error!')fc.error_log('file extract format error!'+' '+finall_json+' '+current_time_str)import pandas as pdresult_dict = {'证书编号':code_ls
}pd.DataFrame(result_dict).to_excel('ocr_code_result.xlsx',index=False)# In[34]:mid_excel_path = r"C:\Users\12258\Desktop\hy-vLLM\rysb\已核对.xlsx"
list1 = pd.read_excel(mid_excel_path)['证书编号'].tolist()
list2 = pd.read_excel(mid_excel_path)['MOE策略证书编号'].tolist()n = 0
for index in range(len(list1)):if str(list1[index]) == str(list2[index]):n+=1# ###  single_OCR_test# In[16]:file_paths = fc.list_files_with_absolute_paths(r'C:\Users\12258\Desktop\hy-vLLM\rysb\student_infos_process_V20240715\single_ocr_json')names = []
codes = []
for file_path in file_paths:mid_data = read_json_file(file_path)['证书编号']names.append(file_path.split('\\')[-1].split('.')[0])codes.append(mid_data)import pandas as pdresult_dict = {'姓名':names,'证书编号':codes
}pd.DataFrame(result_dict).to_excel('single_ocr_code_result.xlsx',index=False)

最终该字段精度提升至88%+,该方案的成功表面大模型moe模式下应用具有落地条件。

总结

事实上,moe开发中,对于传统模型还尝试了其他的子方案,内容如下:
针对长编码字段识别研究情况:
1.多模态模型端到端识别多字段,准确度:36.3%
2.多模态模型端到端识别长编码字段单字段,准确度:44.6%
3.OCR识别卡证整体+文本大模型,准确度:83%
4.OCR识别卡证长编码字段局部+文本大模型:88%
5.OCR识别结果作为prompt+多模态大模型:86.3%

希望以上的内容能给研究中的同志、朋友提供一定参考!

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

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

相关文章

TiDB-从0到1-sync-diff-inspector数据校验工具

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇TiDB-从0到1-配置篇TiDB-从0到1-集群扩缩容TiDB-从0到1-数据导出导入TiDB-从0到1-BR工具 一、sync-diff-inspector工具 sync-diff-inspector是TiDB原生…

3.仓颉编程_没有switch_case需使用match_case

仓颉编程_没有switch_case需使用match_case 支持两种 match 表达式,一种是包含待匹配值的 match 表达式,另一种是不含待匹配值的 match 表达式。 含有匹配值的 match 表达式 main() {let a Hello World!//不可变量var a2 var b 77 //可变变量match(b…

指针!!C语言(第三篇)

目录 一. 二维数组传参的本质 二. 函数指针变量和函数指针数组 三. typedef关键字 四. 转移表 五. 回调函数以及qsort使用举例 一. 二维数组传参的本质 🍟首先我们先回顾一下二维数组是怎样传参的?我们需要传入数组名以及行数和列数,这…

Spring Boot|如何实现 Spring Boot 的优雅停机

文章目录 概述优雅停机的重要性实现优雅停机的方法1. 使用Spring Boot Actuator配置使用 2. 自定义Shutdown Hook示例代码 3. 使用Spring Boot 2.3及更高版本的优雅停机特性配置 4. 通过Spring Cloud Gateway和Ribbon示例配置 5. 定制化停机逻辑示例代码 最佳实践结论 概述 在…

Dhtmlx Gantt教程:创建交互式甘特图的完整指南

在现代的项目管理中,时间是一种宝贵的资源,而甘特图则是一把解锁项目进度的魔法钥匙,想象一下,您可以在一个直观而动态的时间轴上,清晰地看到项目的每一个任务如何交织在一起,如何随着时间的推移展开&#…

【优质精选】12节大模型系列教学课程之二:RAG 原理与应用

课程二:RAG 原理与应用 12节大模型系列教学课程之二:RAG 原理与应用 课程详细内容RAG 技术的基础知识RAG 的工作原理RAG 提高生成质量和准确性的原理RAG 在问答系统中的应用RAG 在文本创作中的应用RAG 在其他领域的应用探索RAG 技术的挑战与应对策略RAG …

代码随想录算法训练营【动态规划篇】

动态规划 注:本文代码来自于代码随想录 509. 斐波那契数 力扣509 Python 动态规划(版本一) class Solution:def fib(self, n: int) -> int:# 排除 Corner Caseif n 0:return 0# 创建 dp table dp [0] * (n 1)# 初始化 dp 数组dp[0]…

LangChain4j-RAG高级-检索增强器

Retrieval Augmentor 检索增强器 RetrievalAugmentor 是 RAG 管道的入口点。它负责使用从各种来源检索的相关 Content 来扩充 ChatMessage 。 可以在创建 AiService 期间指定 RetrievalAugmentor 的实例: Assistant assistant AiServices.builder(Assistant.cla…

探索大型语言模型LLama 2:原理揭秘与代码实践

一、引言 1.1 大型语言模型的重要性 大型语言模型作为人工智能领域的重要研究方向,近年来取得了显著的成果。这些模型在自然语言处理、机器翻译、对话系统、文本生成等领域展现了强大的能力,为人类带来了诸多便利。大型语言模型的出现,使得…

初识git工具~~上传代码到gitee仓库的方法

目录 1.背景~~其安装 2.gitee介绍 2.1新建仓库 2.2进行相关配置 3.拉取仓库 4.服务器操作 4.1克隆操作 4.2查看本地仓库 4.3代码拖到本地仓库 4.4关于git三板斧介绍 4.4.1add操作 4.4.2commit操作 4.4.3push操作 5.一些其他说明 5.1.ignore说明 5.2git log命令 …

ElementPlus轮播图-Vue3

注意:安装时建议使用手机热点,wifi不稳定,会出现执行不成功的现象。 安装 使用包管理器 # 选择一个你喜欢的包管理器# NPM npm install element-plus --save# Yarn yarn add element-plus# pnpm pnpm install element-plus引入配置 完整引…

视频主题Qinmei 3.0视频站源码_WordPress影视视频主题/附详细安装教程

Qinmei 3.0主题主要是将 wordpress 改造成纯 api 的站点,以便实现前后端分离的技术栈,目前的进度已经大致完成,唯一的问题就是需要安装 JWT token 插件。 功能介绍: 支持豆瓣以及 bangumi 的一键获取信息, 豆瓣 api 目前使用的是…

【Node.js基础05】包的理解与使用

一:包的理解与简介 1 什么是包 包是一个将模块、代码、以及其他资料聚合成的文件夹 2 包的分类 项目包:编写项目代码的文件夹 软件包:封装工具和方法供开发者使用 3 为什么要在软件包中编写package.json文件 记录包的清单信息 二&…

NSIS打包脚本第二篇

NSIS打包脚本 NSIS打包脚本第一篇 字符串提取过滤 WordFind 使用方法 ${WordFind} "[string]" "[delimiter]" "[E][options]" $varoption解读 +1和+01一样,代表分割后的第一个字符串 +表示从左往右,-表示从右向左 +2}} 表示从左到右,前2…

Matlab arrayfun 与 bsxfun——提高编程效率的利器!

许多人知道 MATLAB 向量化编程,少用 for 循环 可以提高代码运行效率,但关于代码紧凑化编程, arrayfun 与 bsxfun 两个重要函数却鲜有人能够用好,今天针对这两个函数举例说明其威力。 Matlab arrayfun 概述 arrayfun 是 Matlab …

第五十天 第十一章:图论part01 图论理论基础 深搜理论基础 98. 所有可达路径 广搜理论基础

图论理论基础 了解邻接矩阵(*),度,邻接表(数组链表)等 遍历顺序:深搜加广搜 深搜理论基础 dfs是可一个方向去搜,不到黄河不回头,直到遇到绝境了,搜不下去了&#xff0c…

力扣SQL 最后一个能进入巴士的人 自连接

Problem: 1204. 最后一个能进入巴士的人 文章目录 思路复杂度Code 思路 👨‍🏫 参考题解 复杂度 时间复杂度: O ( ∗ ) O(*) O(∗)空间复杂度: O ( ∗ ) O(*) O(∗) Code select a.person_name from queue a,queue b where a.turn > b.turn -…

Java代理模式详细

Java代理模式详细 一、引言 代理模式(Proxy Pattern)是一种常用的设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在Java中,代理模式可以分为静态代理和动态代理两种。本文将详细介绍代理模式的概念、实现方式以及应…

[极客大挑战 2019]PHP1

打开靶机 提示有备份,可以用工具扫描,我还没有配置好环境,搜了一下其他师傅的:备份的地址在这: /www.zip 下载后得到这几个文件: index.php就是上面打开的网页,其中有一段php代码:…

谷粒商城实战笔记-72-商品服务-API-属性分组-获取分类属性分组

文章目录 一,后端接口开发Controller层修改接口接口测试 二,前端开发 这一节的内容是开发获取分类属性分组的接口。 一,后端接口开发 Controller层修改接口 修改AttrGroupController接口。 RequestMapping("/list/{catelogId}")p…