Coze源码分析-资源库-创建知识库-后端源码-应用/领域/数据访问

3. 应用服务层

3.1 知识库应用服务

文件位置: backend/application/knowledge/knowledge.go

func (k *KnowledgeApplicationService) CreateKnowledge(ctx context.Context, req *dataset.CreateDatasetRequest) (*dataset.CreateDatasetResponse, error) {// 1. 转换文档类型documentType := convertDocumentTypeDataset2Entity(req.FormatType)if documentType == model.DocumentTypeUnknown {return dataset.NewCreateDatasetResponse(), errors.New("unknown document type")}// 2. 用户身份验证uid := ctxutil.GetUIDFromCtx(ctx)if uid == nil {return nil, errorx.New(errno.ErrKnowledgePermissionCode, errorx.KV("msg", "session required"))}// 3. 构建创建请求createReq := service.CreateKnowledgeRequest{Name:        req.Name,Description: req.Description,CreatorID:   ptr.From(uid),SpaceID:     req.SpaceID,AppID:       req.GetProjectID(),FormatType:  documentType,IconUri:     req.IconURI,}if req.IconURI == "" {createReq.IconUri = getIconURI(req.GetFormatType())}// 4. 执行创建操作domainResp, err := k.DomainSVC.CreateKnowledge(ctx, &createReq)if err != nil {logs.CtxErrorf(ctx, "create knowledge failed, err: %v", err)return dataset.NewCreateDatasetResponse(), err}// 5. 发布创建事件var ptrAppID *int64if req.ProjectID != 0 {ptrAppID = ptr.Of(req.ProjectID)}err = k.eventBus.PublishResources(ctx, &resourceEntity.ResourceDomainEvent{OpType: resourceEntity.Created,Resource: &resourceEntity.ResourceDocument{ResType:       resource.ResType_Knowledge,ResID:         domainResp.KnowledgeID,Name:          ptr.Of(req.Name),ResSubType:    ptr.Of(int32(req.FormatType)),SpaceID:       ptr.Of(req.SpaceID),APPID:         ptrAppID,OwnerID:       ptr.Of(*uid),PublishStatus: ptr.Of(resource.PublishStatus_Published),PublishTimeMS: ptr.Of(domainResp.CreatedAtMs),CreateTimeMS:  ptr.Of(domainResp.CreatedAtMs),UpdateTimeMS:  ptr.Of(domainResp.CreatedAtMs),},})if err != nil {logs.CtxErrorf(ctx, "publish resource event failed, err: %v", err)return dataset.NewCreateDatasetResponse(), err}// 6. 返回创建结果return &dataset.CreateDatasetResponse{DatasetID: domainResp.KnowledgeID,}, nil
}

3.2 应用服务特点

知识库应用服务的主要特点:

  • 类型转换: 将前端请求的数据类型转换为领域层所需的类型
  • 身份验证: 从上下文中获取用户身份信息
  • 事件发布: 创建成功后发布资源创建事件,用于搜索索引等
  • 错误处理: 统一的错误处理和日志记录
  • 图标处理: 自动为知识库设置默认图标

3.3 事件驱动架构

知识库创建完成后,系统会发布资源创建事件:

// 发布创建事件
err = k.eventBus.PublishResources(ctx, &resourceEntity.ResourceDomainEvent{OpType: resourceEntity.Created,Resource: &resourceEntity.ResourceDocument{ResType:       resource.ResType_Knowledge,ResID:         domainResp.KnowledgeID,Name:          ptr.Of(req.Name),ResSubType:    ptr.Of(int32(req.FormatType)),SpaceID:       ptr.Of(req.SpaceID),APPID:         ptrAppID,OwnerID:       ptr.Of(*uid),PublishStatus: ptr.Of(resource.PublishStatus_Published),PublishTimeMS: ptr.Of(domainResp.CreatedAtMs),CreateTimeMS:  ptr.Of(domainResp.CreatedAtMs),UpdateTimeMS:  ptr.Of(domainResp.CreatedAtMs),},
})

这个事件会被搜索服务监听,用于更新搜索索引,确保新创建的知识库能够被搜索到。

4. 领域服务层

4.1 知识库领域服务

文件位置: backend/domain/knowledge/service/interface.go

知识库领域服务接口定义:

type Knowledge interface {CreateKnowledge(ctx context.Context, request *CreateKnowledgeRequest) (response *CreateKnowledgeResponse, err error)UpdateKnowledge(ctx context.Context, request *UpdateKnowledgeRequest) errorDeleteKnowledge(ctx context.Context, request *DeleteKnowledgeRequest) errorCopyKnowledge(ctx context.Context, request *CopyKnowledgeRequest) (*CopyKnowledgeResponse, error)MoveKnowledgeToLibrary(ctx context.Context, request *MoveKnowledgeToLibraryRequest) errorListKnowledge(ctx context.Context, request *ListKnowledgeRequest) (response *ListKnowledgeResponse, err error)GetKnowledgeByID(ctx context.Context, request *GetKnowledgeByIDRequest) (response *GetKnowledgeByIDResponse, err error)MGetKnowledgeByID(ctx context.Context, request *MGetKnowledgeByIDRequest) (response *MGetKnowledgeByIDResponse, err error)CreateDocument(ctx context.Context, request *CreateDocumentRequest) (response *CreateDocumentResponse, err error)UpdateDocument(ctx context.Context, request *UpdateDocumentRequest) errorDeleteDocument(ctx context.Context, request *DeleteDocumentRequest) errorListDocument(ctx context.Context, request *ListDocumentRequest) (response *ListDocumentResponse, err error)CreateSlice(ctx context.Context, request *CreateSliceRequest) (response *CreateSliceResponse, err error)UpdateSlice(ctx context.Context, request *UpdateSliceRequest) errorDeleteSlice(ctx context.Context, request *DeleteSliceRequest) errorListSlice(ctx context.Context, request *ListSliceRequest) (response *ListSliceResponse, err error)Retrieve(ctx context.Context, request *RetrieveRequest) (response *RetrieveResponse, err error)
}type CreateKnowledgeRequest struct {Name        stringDescription stringCreatorID   int64SpaceID     int64IconUri     stringFormatType  knowledge.DocumentTypeAppID       int64
}type CreateKnowledgeResponse struct {KnowledgeID int64CreatedAtMs int64
}

4.2 领域服务实现特点

知识库领域服务的实现特点:

  • 接口抽象: 通过接口定义清晰的服务边界
  • 类型安全: 使用强类型的请求和响应结构
  • 业务逻辑封装: 将核心业务逻辑封装在领域层
  • 依赖注入: 通过接口依赖其他服务,便于测试和扩展
  • 错误处理: 统一的错误处理机制

4.3 实体定义

文件位置: backend/domain/knowledge/entity/knowledge.go

// Knowledge 知识库实体
type Knowledge struct {ID          int64     `json:"id"`SpaceID     int64     `json:"space_id"`CreatorID   int64     `json:"creator_id"`Name        string    `json:"name"`Description string    `json:"description"`IconURI     string    `json:"icon_uri"`FormatType  int32     `json:"format_type"`Status      int32     `json:"status"`CreatedAt   time.Time `json:"created_at"`UpdatedAt   time.Time `json:"updated_at"`
}// Document 文档实体
type Document struct {ID            int64     `json:"id"`KnowledgeID   int64     `json:"knowledge_id"`Name          string    `json:"name"`FileExtension string    `json:"file_extension"`FileSize      int64     `json:"file_size"`Content       string    `json:"content"`Status        int32     `json:"status"`CreatedAt     time.Time `json:"created_at"`UpdatedAt     time.Time `json:"updated_at"`
}// Slice 分片实体
type Slice struct {ID          int64     `json:"id"`DocumentID  int64     `json:"document_id"`Content     string    `json:"content"`Vector      []float32 `json:"vector"`Position    int64     `json:"position"`WordCount   int32     `json:"word_count"`CreatedAt   time.Time `json:"created_at"`UpdatedAt   time.Time `json:"updated_at"`
}

5. 数据访问层

数据访问层负责知识库相关数据的持久化操作,采用Repository模式和DAO模式相结合的设计,确保数据访问的一致性和可维护性。

5.1 知识库Repository接口定义

文件位置: backend/domain/knowledge/repository/repository.go

知识库数据访问层采用Repository模式,提供统一的数据访问接口:

// Repository 知识库仓储接口
type Repository interface {// 知识库相关操作CreateKnowledge(ctx context.Context, knowledge *entity.Knowledge) (*entity.Knowledge, error)UpdateKnowledge(ctx context.Context, knowledge *entity.Knowledge) errorDeleteKnowledge(ctx context.Context, knowledgeID int64) errorGetKnowledge(ctx context.Context, knowledgeID int64) (*entity.Knowledge, error)ListKnowledge(ctx context.Context, req *ListKnowledgeRequest) ([]*entity.Knowledge, int64, error)// 文档相关操作CreateDocument(ctx context.Context, document *entity.Document) (*entity.Document, error)UpdateDocument(ctx context.Context, document *entity.Document) errorDeleteDocument(ctx context.Context, documentID int64) errorGetDocument(ctx context.Context, documentID int64) (*entity.Document, error)ListDocument(ctx context.Context, req *ListDocumentRequest) ([]*entity.Document, int64, error)// 分片相关操作CreateSlice(ctx context.Context, slice *entity.Slice) (*entity.Slice, error)UpdateSlice(ctx context.Context, slice *entity.Slice) errorDeleteSlice(ctx context.Context, sliceID int64) errorGetSlice(ctx context.Context, sliceID int64) (*entity.Slice, error)ListSlice(ctx context.Context, req *ListSliceRequest) ([]*entity.Slice, int64, error)// 检索相关操作VectorSearch(ctx context.Context, req *VectorSearchRequest) ([]*entity.Slice, error)FullTextSearch(ctx context.Context, req *FullTextSearchRequest) ([]*entity.Slice, error)
}type ListKnowledgeRequest struct {SpaceID    *int64AppID      *int64CreatorID  *int64Query      stringPage       *intPageSize   *intOrder      *stringOrderType  *string
}
创建方法特点
  • 事务支持: 所有写操作都支持事务,确保数据一致性
  • 类型安全: 使用强类型参数,避免运行时错误
  • 错误处理: 详细的错误信息,便于问题定位
  • 批量操作: 支持批量创建,提高性能

5.2 数据访问对象(DAO)

文件位置: backend/domain/knowledge/internal/dal/dao/

// KnowledgeDAO 知识库数据访问对象
type KnowledgeDAO struct {db *gorm.DB
}func (dao *KnowledgeDAO) Create(ctx context.Context, tx *sql.Tx, knowledge *model.Knowledge) (int64, error) {// 1. 生成知识库IDknowledgeID, err := dao.idGenerator.GenerateID()if err != nil {return 0, fmt.Errorf("生成知识库ID失败: %w", err)}// 2. 设置创建时间now := time.Now()knowledge.ID = knowledgeIDknowledge.CreatedAt = nowknowledge.UpdatedAt = now// 3. 执行插入操作result := dao.db.WithContext(ctx).Create(knowledge)if result.Error != nil {return 0, fmt.Errorf("创建知识库失败: %w", result.Error)}return knowledgeID, nil
}// KnowledgeDocumentDAO 知识库文档数据访问对象
type KnowledgeDocumentDAO struct {db *gorm.DB
}func (dao *KnowledgeDocumentDAO) Create(ctx context.Context, tx *sql.Tx, doc *model.KnowledgeDocument) (int64, error) {// 1. 生成文档IDdocID, err := dao.idGenerator.GenerateID()if err != nil {return 0, fmt.Errorf("生成文档ID失败: %w", err)}// 2. 设置文档属性now := time.Now()doc.ID = docIDdoc.CreatedAt = nowdoc.UpdatedAt = now// 3. 执行插入操作result := dao.db.WithContext(ctx).Create(doc)if result.Error != nil {return 0, fmt.Errorf("创建知识库文档失败: %w", result.Error)}return docID, nil
}// KnowledgeDocumentSliceDAO 知识库文档分片数据访问对象
type KnowledgeDocumentSliceDAO struct {db *gorm.DB
}func (dao *KnowledgeDocumentSliceDAO) Create(ctx context.Context, tx *sql.Tx, slice *model.KnowledgeDocumentSlice) (int64, error) {// 1. 生成分片IDsliceID, err := dao.idGenerator.GenerateID()if err != nil {return 0, fmt.Errorf("生成分片ID失败: %w", err)}// 2. 设置分片属性now := time.Now()slice.ID = sliceIDslice.CreatedAt = nowslice.UpdatedAt = now// 3. 执行插入操作result := dao.db.WithContext(ctx).Create(slice)if result.Error != nil {return 0, fmt.Errorf("创建知识库文档分片失败: %w", result.Error)}return sliceID, nil
}
创建操作特点
  • ID生成: 使用分布式ID生成器,确保ID全局唯一
  • 时间戳: 自动设置创建和更新时间
  • 事务处理: 支持事务操作,保证数据一致性
  • 错误处理: 详细的错误信息和日志记录

5.3 完整数据访问流程

知识库创建涉及的数据表:

  1. knowledge: 知识库主表
  2. knowledge_document: 知识库文档表
  3. knowledge_document_slice: 文档分片表
  4. knowledge_config: 知识库配置表

数据访问流程:

  1. 开启数据库事务
  2. 创建知识库主记录
  3. 初始化知识库配置
  4. 提交事务
  5. 发布创建事件

5.4 数据模型定义

文件位置: backend/domain/knowledge/internal/dal/model/

// Knowledge 知识库数据模型
type Knowledge struct {ID          int64     `gorm:"column:id;primaryKey" json:"id"`SpaceID     int64     `gorm:"column:space_id;not null" json:"space_id"`CreatorID   int64     `gorm:"column:creator_id;not null" json:"creator_id"`Name        string    `gorm:"column:name;size:100;not null" json:"name"`Description string    `gorm:"column:description;size:1000" json:"description"`Type        int32     `gorm:"column:type;not null" json:"type"`Config      string    `gorm:"column:config;type:text" json:"config"`Status      int32     `gorm:"column:status;not null" json:"status"`CreatedAt   time.Time `gorm:"column:created_at;not null" json:"created_at"`UpdatedAt   time.Time `gorm:"column:updated_at;not null" json:"updated_at"`
}func (Knowledge) TableName() string {return "knowledge"
}// KnowledgeDocument 知识库文档数据模型
type KnowledgeDocument struct {ID            int64     `gorm:"column:id;primaryKey" json:"id"`KnowledgeID   int64     `gorm:"column:knowledge_id;not null" json:"knowledge_id"`Name          string    `gorm:"column:name;size:255;not null" json:"name"`FileExtension string    `gorm:"column:file_extension;size:10" json:"file_extension"`FileSize      int64     `gorm:"column:file_size" json:"file_size"`Content       string    `gorm:"column:content;type:longtext" json:"content"`Status        int32     `gorm:"column:status;not null" json:"status"`CreatedAt     time.Time `gorm:"column:created_at;not null" json:"created_at"`UpdatedAt     time.Time `gorm:"column:updated_at;not null" json:"updated_at"`
}func (KnowledgeDocument) TableName() string {return "knowledge_document"
}

5.5 查询生成器

文件位置: backend/domain/knowledge/internal/dal/query/

GORM生成的查询接口,提供类型安全的查询方法:

// 知识库查询接口
type IKnowledgeDo interface {gen.SubQueryDebug() IKnowledgeDoWithContext(ctx context.Context) IKnowledgeDoWithResult(fc func(tx gen.Dao)) gen.ResultInfoReplaceDB(db *gorm.DB)ReadDB() IKnowledgeDoWriteDB() IKnowledgeDoAs(alias string) gen.DaoSession(config *gorm.Session) IKnowledgeDoColumns(cols ...field.Expr) gen.ColumnsClauses(conds ...clause.Expression) IKnowledgeDoNot(conds ...gen.Condition) IKnowledgeDoOr(conds ...gen.Condition) IKnowledgeDoSelect(conds ...field.Expr) IKnowledgeDoWhere(conds ...gen.Condition) IKnowledgeDoOrder(conds ...field.Expr) IKnowledgeDoDistinct(cols ...field.Expr) IKnowledgeDoOmit(cols ...field.Expr) IKnowledgeDoJoin(table schema.Tabler, on ...field.Expr) IKnowledgeDoLeftJoin(table schema.Tabler, on ...field.Expr) IKnowledgeDoRightJoin(table schema.Tabler, on ...field.Expr) IKnowledgeDoGroup(cols ...field.Expr) IKnowledgeDoHaving(conds ...gen.Condition) IKnowledgeDoLimit(limit int) IKnowledgeDoOffset(offset int) IKnowledgeDoCount() (count int64, err error)Scopes(funcs ...func(gen.Dao) gen.Dao) IKnowledgeDoUnscoped() IKnowledgeDoCreate(values ...*model.Knowledge) errorCreateInBatches(values []*model.Knowledge, batchSize int) errorSave(values ...*model.Knowledge) errorFirst() (*model.Knowledge, error)Take() (*model.Knowledge, error)Last() (*model.Knowledge, error)Find() ([]*model.Knowledge, error)FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Knowledge, err error)FindInBatches(result *[]*model.Knowledge, batchSize int, fc func(tx gen.Dao, batch int) error) errorPluck(column field.Expr, dest interface{}) errorDelete(...*model.Knowledge) (info gen.ResultInfo, err error)Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)Updates(value interface{}) (info gen.ResultInfo, err error)UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)UpdateColumns(value interface{}) (info gen.ResultInfo, err error)UpdateFrom(q gen.SubQuery) gen.DaoAttrs(attrs ...field.AssignExpr) IKnowledgeDoAssign(attrs ...field.AssignExpr) IKnowledgeDoJoins(fields ...field.RelationField) IKnowledgeDoPreload(fields ...field.RelationField) IKnowledgeDoFirstOrInit() (*model.Knowledge, error)FirstOrCreate() (*model.Knowledge, error)FindByPage(offset int, limit int) (result []*model.Knowledge, count int64, err error)ScanByPage(result interface{}, offset int, limit int) (count int64, err error)Scan(result interface{}) (err error)Returning(value interface{}, columns ...string) IKnowledgeDoUnderlyingDB() *gorm.DBschema.Tabler
}

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

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

相关文章

Shopify指纹手机矩阵:无限扩店,横扫FB/GG广告封号风险

一、 为什么需要为Shopify使用指纹手机?虽然Shopify不会因为你多开店而封号,但以下场景需要隔离环境:规避广告平台关联:这是最核心的用途。你会用Facebook、Google、TikTok等广告平台为你的Shopify店铺引流。这些广告平台严格禁止…

【Python】家庭用电数据分析Prophet预测

数据集:Household Electricity Consumption | Kaggle 目录 数据集简介 探索性分析 Prophet预测 Prophet模型 Prophet理念 Prophet优点 数据集简介 240000-household-electricity-consumption-records数据集包含了一个家庭6个月的用电数据,收集于2…

信息系统运维管理

运行维护服务指的是采用信息技术手段及方法,依据客户提出的服务要求,为其在使用信息系统过程中提出的需求提供的综合服务是信息技术服务中的一种主要类型。运行维护服务对象是指信息系统工程建设项目交付的内容,包括机房基础设施,…

系统编程完结整理以及补充

Shell(命令与脚本语法) 系统编程(一)shell的学习-CSDN博客 功能/概念语法/关键字参数/用法说明返回值/效果难易点注意事项示例/实验提示定义函数func_name() { commands; }无参数或通过 $1 $2 ... 传参函数执行参数传递、全局变…

第十四届蓝桥杯青少组C++选拔赛[2022.12.18]第二部分编程题(2、字符翻转)

参考程序&#xff1a;#include <bits/stdc.h> using namespace std;int main() {string s;cin >> s; // 读取输入字符串&#xff0c;若无输入则结束for (int i 0; i < (int)s.size(); i) {// i 从 0 开始&#xff0c;位置是 i1&#xff1b;如果 i 是奇数&#…

Django基础环境入门

熟悉过程 搭建环境&#xff0c;运行起来基础请求到服务接口跟java web对比 说明先不纠结细节先跑起来再说 1. 环境搭建 python已经安装&#xff0c;使用conda管理 django安装 django官方文档 pip install django也可以命令创建 mkdir djangotutorial django-admin startp…

408学习之c语言(结构体)

今天给大家分享C语言中结构体的几种常见使用方法&#xff0c;包括基础结构体定义与初始化&#xff0c;结构体指针的两种访问方式&#xff0c;结构体数组的遍历&#xff0c;动态内存分配与结构体使用&#xff0c;typedef简化结构体类型基础结构体定义与使用#define _CRT_SECURE_…

Navicat中设计表格默认值时,如何不设置成NULL,而是设置成空文本?

在 Navicat 中设计表时&#xff0c;将字段的默认值设置为空文本而不是 NULL 是一个非常常见的需求。操作很简单&#xff0c;但有几个细节需要注意。■ 方法一&#xff1a;通过“设计表”界面设置&#xff08;最常用&#xff09;1. 连接数据库并找到表&#xff1a;在左侧连接导…

深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第十三章知识点问答(15题)

预告下一本 可能是mysql8的书籍 或者是AI应用工程的基本岗位所有技能 问题1 什么是 线程安全&#xff1f;在 Java 中如何定义“线程安全”&#xff1f;线程安全&#xff08;Thread Safety&#xff09; 的定义是&#xff1a; 当多个线程同时访问某个类的对象时&#xff0c;无论运…

【医疗 AI】Baichuan-M2:大语言模型在医疗领域的动态验证框架

Baichuan-M2 医疗大模型&#xff1a;技术解读与使用方法 Baichuan-M2&#xff1a;大语言模型在医疗领域的动态验证框架 【医疗 AI】Baichuan-M2&#xff1a;大语言模型在医疗领域的动态验证框架0. Baichuan-M2 模型简介0.1 基本信息0.2 主要贡献0.3 论文摘要1. 引言2. 验证系统…

Ubuntu\Linux环境中驱动版本配置cudaToolKit

修改环境变量。 1. 首先检查当前的环境变量 # 查看当前PATH echo $PATH# 查看当前LD_LIBRARY_PATH echo $LD_LIBRARY_PATH# 查看当前CUDA_HOME echo $CUDA_HOME2. 确定正确的CUDA安装路径 # 查看系统中有哪些CUDA版本 ls /usr/local/cuda*3. 修改环境变量(永久生效) 编辑…

Linux基础开发工具(gcc/g++,yum,vim,make/makefile)

目录 软件包管理器——yum Linux下&#xff0c;软件的安装 yum与软件包的关系 yum命令的运用 1.查看软件包 2.安装/删除软件包 编辑器——vim vim的基本概念 vim的基本操作 命令模式命令 移动光标 删除文字 撤销上一次操作 跳至指定的行 底行模式命令 编译器——…

数据结构之跳表

跳表&#xff08;Skip List&#xff09;是一种基于概率平衡的数据结构&#xff0c;通过多层有序链表实现高效的查找、插入和删除操作。它在最坏情况下时间复杂度为 (O(n))&#xff0c;但通过随机化设计&#xff0c;平均时间复杂度可优化至 (O(\log n))&#xff0c;与平衡二叉搜…

线程概念,控制

一、线程概念 线程概念&#xff1a;进程内部的一个执行流&#xff0c;轻量化。 观点&#xff1a;进程是系统分配资源的基本单位&#xff0c;线程是CPU调度的基本单位。 在理解线程之前&#xff0c;我们在谈一下虚拟地址空间。 我们都知道进程是通过页表将虚拟地址转化为物理地址…

RabbitMQ 高可用实战篇(Mirrored Queue + Cluster + 持久化整合)

RabbitMQ 高可用实战篇&#xff08;Mirrored Queue Cluster 持久化整合&#xff09;1. 前言 在生产环境中&#xff0c;单节点 RabbitMQ 容易因故障导致消息丢失或业务中断。 通过高可用队列、集群部署和持久化策略&#xff0c;可以保证 消息可靠性、节点容错和持续服务。 本文…

支持向量机:从理论到实践

支持向量机&#xff1a;从理论到实践 文章目录支持向量机&#xff1a;从理论到实践一。理论概述1. 线性可分支持向量机1.1 基本概念与数学形式1.2 函数间隔与几何间隔1.3 间隔最大化与优化问题1.4 拉格朗日对偶理论与求解1.5 支持向量与决策函数2. 近似线性可分数据&#xff08…

LVS与Keepalived详解(二)LVS负载均衡实现实操

文章目录前言一、LVS-DR 模式详解1.1 数据包流向分析1.2 DR 模式的特点二、LVS-DR 集群部署实战2.1 环境准备2.2 配置负载调度器&#xff08;Director Server&#xff09;2.3 配置节点服务器&#xff08;Real Server&#xff09;2.4 测试验证三、前期回顾3.1 LVS 三种工作模式及…

归一化实现原理

归一化&#xff08;Normalization&#xff09;是一种将数据转换到相同尺度的预处理技术&#xff0c;它通常用于让不同特征&#xff08;或数据项&#xff09;具有相同的量纲或范围。在联邦学习中&#xff0c;归一化可以用来处理非独立同分布&#xff08;Non-IID&#xff09;**数…

企业级实战:构建基于Qt、C++与YOLOv8的模块化工业视觉检测系统

一、概述 在追求高效与精密的现代制造业中&#xff0c;自动化光学检测&#xff08;AOI&#xff09;已成为保障产品质量的核心技术。传统的质检流程往往受限于人工效率与主观判断&#xff0c;难以满足大规模、高精度的生产需求。本文旨在研发一套完整的、企业级的工业视觉异常检…

【目标检测】metrice_curve和loss_curve对比图可视化

代码如下&#xff1a; import warnings warnings.filterwarnings(ignore)import os import pandas as pd import numpy as np import matplotlib.pylab as pltpwd os.getcwd()names [model1, model2, model3,ours]plt.figure(figsize(10, 10))plt.subplot(2, 2, 1) for i in …