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
英文地址,請注明出處:http://en.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 …