当前位置: 首页 > news >正文

Dify 从入门到精通(第 85/100 篇):Dify 的多模态模型扩展性(高级篇)

Dify 从入门到精通(第 85/100 篇):Dify 的多模态模型扩展性

Dify 入门到精通系列文章目录

  • 第一篇《Dify 究竟是什么?真能开启低代码 AI 应用开发的未来?》介绍了 Dify 的定位与优势
  • 第二篇《Dify 的核心组件:从节点到 RAG 管道》深入剖析了 Dify 的功能模块
  • 第三篇《Dify vs 其他 AI 平台:LangChain、Flowise、CrewAI》对比了 Dify 与其他平台的优劣
  • 第四篇《快速上手 Dify 云端:5 分钟创建第一个应用》带您实践了云端部署的问答机器人
  • 第五篇《Dify 本地部署入门:Docker Compose 指南》讲解了本地部署
  • 第六篇《配置你的第一个 LLM:OpenAI、Claude 和 Ollama》介绍了 LLM 配置
  • 更多文章:Dify 博客系列:从入门到精通(100 篇)

什么是 Dify 的多模态模型扩展性?

定义

Dify 的多模态模型扩展性是指通过模块化设计、动态工作流、分布式架构、插件系统、模型热加载和动态插件管理扩展多模态模型(如 LLaVA 处理文本+图像、Whisper 处理语音、CLIP-ViT 处理视频)在多租户(参考第五十六篇)、高可用性(参考第六十七篇)和多语言(参考第六十三篇)场景下的功能、性能和应用场景,支持新增模态(如视频)、模型集成和自定义工作流。

核心原理

多模态模型扩展性的核心在于模块化、动态性和可扩展性:

  • 模块化设计:解耦模型组件:
    [
    System=∑modalityModelmodality\text{System} = \sum_{\text{modality}} \text{Model}_{\text{modality}} System=modalityModelmodality ]
  • 动态工作流:支持运行时配置:
    [
    Workflow=Configure(Nodes,Rules,Parameters)\text{Workflow} = \text{Configure}(\text{Nodes}, \text{Rules}, \text{Parameters}) Workflow=Configure(Nodes,Rules,Parameters) ]
  • 分布式架构:通过 Ray 扩展推理能力:
    [
    Throughput=∑nodeInferencenode\text{Throughput} = \sum_{\text{node}} \text{Inference}_{\text{node}} Throughput=nodeInferencenode ]
  • 插件系统:动态加载功能:
    [
    Plugin Output=Execute(Plugin,Input,Config)\text{Plugin Output} = \text{Execute}(\text{Plugin}, \text{Input}, \text{Config}) Plugin Output=Execute(Plugin,Input,Config) ]
  • 模型热加载:动态更新模型:
    [
    Modelnew=Load(Model Path,Runtime)\text{Model}_{\text{new}} = \text{Load}(\text{Model Path}, \text{Runtime}) Modelnew=Load(Model Path,Runtime) ]

核心功能

  • 模块化设计:支持新增模态(如视频)和模型(如 CLIP-ViT)。
  • 动态工作流:通过 Dify Workflow Engine 配置动态工作流。
  • 分布式架构:通过 Ray 和 Kubernetes 扩展推理。
  • 插件系统:通过 Dify 插件框架动态加载功能。
  • 模型热加载:支持运行时模型更新。
  • 多语言支持:支持中、英、日扩展。
  • 动态资源分配:通过 Kubernetes HPA 优化资源。

适用场景

  • 客服机器人:扩展多语言、多模态查询功能。
  • 知识库查询:支持新增模态(如视频搜索)。
  • 插件开发:动态加载新插件(如视频分析)。
  • 多模态交互:扩展文本+图像+语音+视频交互。

前置准备

在开始之前,您需要:

  1. Dify 环境
    • Kubernetes:完成第五十六篇的多租户部署和第六十七篇的高可用性部署。
  2. 模型配置
    • LLaVA、Whisper、CLIP-ViT(参考第六篇、第七十四篇)。
    • Embedding Model:sentence-transformers/all-MiniLM-L6-v2。
  3. 工具集
    • Dify Workflow Engine:工作流管理。
    • FastAPI:API 框架。
    • Ray:分布式推理(参考第七十六篇)。
    • Horovod:分布式训练(参考第六十八篇)。
    • Hugging Face Transformers:模型微调。
    • PyTorch:模型框架。
    • bitsandbytes:模型量化(参考第六十九篇)。
    • Faiss:向量数据库(参考第七十三篇)。
    • Kubernetes:容器编排。
    • Helm:部署 management(参考第六十六篇)。
    • Prometheus/Grafana:监控(参考第六十一篇、第八十一篇)。
    • ELK Stack:日志分析(参考第六十篇、第八十一篇)。
    • PostgreSQL:数据存储(参考第六十篇)。
    • Redis:缓存(参考第六十篇)。
    • Nginx:负载均衡(参考第六十篇)。
    • Keycloak:身份认证(参考第六十二篇)。
    • Locust:性能测试(参考第五十九篇)。
    • WeatherPlugin:参考第六十四篇。
  4. 工具
    • Python:扩展性开发。
    • Docker:容器化。
    • kubectl:Kubernetes 管理。
    • GitHub:代码托管。
  5. 时间预估:40-50 分钟。

重点

  • 数据准备:3 租户(电商、医疗、教育),各 5,000 条 FAQ(中、英、日),1,000 张产品图片(512x512,JPEG),1,000 条语音查询(16kHz,WAV),100 条视频查询(720p,MP4),需标注和分布分析。
  • 环境要求:Kubernetes 集群(6 节点,32GB 内存,8GB GPU)。
  • 测试用例:10 个多模态扩展性场景(文本查询、图像+文本查询、语音查询、视频查询、文本+图像+语音+视频联合查询)。

数据准备

  1. 数据格式

    • FAQ 数据data/tenant_ecommerce_faq.json
      [{"question": "如何退货?","answer": "请登录账户,进入订单页面,选择退货选项。","language": "zh","annotation": "退货流程"},{"question": "How to return an item?","answer": "Log in to your account, go to the orders page, and select the return option.","language": "en","annotation": "Return process"},{"question": "返品方法は?","answer": "アカウントにログインし、注文ページで返品オプションを選択してください。","language": "ja","annotation": "返品プロセス"}
      ]
      
    • 图像数据data/tenant_ecommerce_images.csv
      image_path,description,language,annotation
      images/product1.jpg,"红色连衣裙",zh,"服装类"
      images/product1.jpg,"Red dress",en,"Clothing"
      images/product1.jpg,"赤いドレス",ja,"服"
      
    • 语音数据data/tenant_ecommerce_speech.json
      [{"audio_path": "audio/query1.wav","text": "这个产品有货吗?","language": "zh","annotation": "库存查询"},{"audio_path": "audio/query2.wav","text": "Is this product in stock?","language": "en","annotation": "Stock query"},{"audio_path": "audio/query3.wav","text": "この商品は在庫がありますか?","language": "ja","annotation": "在庫確認"}
      ]
      
    • 视频数据data/tenant_ecommerce_video.json
      [{"video_path": "video/product1.mp4","description": "产品展示视频","language": "zh","annotation": "产品展示"},{"video_path": "video/product1.mp4","description": "Product demo video","language": "en","annotation": "Product demo"},{"video_path": "video/product1.mp4","description": "製品デモビデオ","language": "ja","annotation": "製品デモ"}
      ]
      
  2. 数据预处理脚本

    • 文件:preprocess_extend.py
      from datasets import Dataset
      import pandas as pd
      import librosa
      import cv2
      from sentence_transformers import SentenceTransformer
      def preprocess_extend(text_path, image_path, speech_path, video_path):text_df = pd.read_json(text_path)image_df = pd.read_csv(image_path)speech_df = pd.read_json(speech_path)video_df = pd.read_json(video_path)model = SentenceTransformer('all-MiniLM-L6-v2')text_embeddings = model.encode(text_df["question"].tolist())image_embeddings = model.encode(image_df["description"].tolist())video_embeddings = model.encode(video_df["description"].tolist())audios = [librosa.load(path, sr=16000)[0] for path in speech_df["audio_path"]]videos = [cv2.VideoCapture(path).read()[1] for path in video_df["video_path"]]dataset = Dataset.from_dict({"text": text_df["question"],"answer": text_df["answer"],"language": text_df["language"],"text_annotation": text_df["annotation"],"image": image_df["image_path"],"image_embedding": image_embeddings,"image_annotation": image_df["annotation"],"speech": audios,"speech_text": speech_df["text"],"speech_annotation": speech_df["annotation"],"video": video_df["video_path"],"video_embedding": video_embeddings,"video_annotation": video_df["annotation"]})dataset = dataset.class_encode_column("text_annotation")dataset = dataset.class_encode_column("image_annotation")dataset = dataset.class_encode_column("speech_annotation")dataset = dataset.class_encode_column("video_annotation")return dataset
      dataset = preprocess_extend("data/tenant_ecommerce_faq.json","data/tenant_ecommerce_images.csv","data/tenant_ecommerce_speech.json","data/tenant_ecommerce_video.json"
      )
      dataset.save_to_disk("extend_dataset")
      

重点

  • 数据预处理:整合多语言文本、图像、语音和视频数据,添加标注字段以支持分类任务,分析数据分布。
  • 验证:运行脚本,确认数据集、嵌入和标注正确。

步骤 1:配置扩展性工作流

  1. 工作流定义
    • 文件:extend_workflow.yaml
      workflow:name: multimodal_extensionnodes:- id: text_inputtype: inputconfig:type: textlanguage: ["zh", "en", "ja"]- id: image_inputtype: inputconfig:type: imageformat: jpegresolution: 512x512- id: speech_inputtype: inputconfig:type: audioformat: wavsampling_rate: 16000- id: video_inputtype: inputconfig:type: videoformat: mp4resolution: 720p- id: extend_modeltype: extensionconfig:models: [llava, whisper, clip-vit]distributed: rayhot_loading: true- id: plugin_managertype: pluginconfig:plugins: [video_analyzer]- id: prometheus_monitortype: monitoringconfig:metrics: [throughput, latency, resource_usage, extension_success]prometheus_endpoint: "http://prometheus:9090"rules:- condition: text_input.present || image_input.present || speech_input.present || video_input.presentnext_node: extend_model- condition: extend_model.completednext_node: plugin_manager- condition: plugin_manager.completednext_node: prometheus_monitor
      

重点

  • 扩展性工作流:支持新增模态(如视频)、模型热加载和动态插件管理。
  • 验证:运行 Dify 工作流引擎,确认节点和规则配置正确。

步骤 2:实现多模态模型扩展

  1. 扩展脚本
    • 文件:extend_multimodal.py
      from transformers import AutoModelForCausalLM, AutoTokenizer, WhisperProcessor, WhisperForConditionalGeneration, CLIPProcessor, CLIPModel
      from datasets import load_from_disk
      import torch
      import ray
      import cv2
      from prometheus_client import Counter, Histogram, Gauge, start_http_server
      import importlib
      ray.init()
      dataset = load_from_disk("extend_dataset")
      llava_requests = Counter('llava_requests_total', 'Total LLaVA requests', ['tenant', 'language'])
      llava_latency = Histogram('llava_latency_seconds', 'LLaVA request latency', ['tenant', 'language'])
      whisper_requests = Counter('whisper_requests_total', 'Total Whisper requests', ['tenant', 'language'])
      whisper_latency = Histogram('whisper_latency_seconds', 'Whisper request latency', ['tenant', 'language'])
      video_requests = Counter('video_requests_total', 'Total Video requests', ['tenant', 'language'])
      video_latency = Histogram('video_latency_seconds', 'Video request latency', ['tenant', 'language'])
      gpu_usage = Gauge('gpu_usage_percent', 'GPU usage percentage', ['tenant'])
      extension_success = Gauge('extension_success_rate', 'Extension success rate', ['tenant'])
      def load_model(model_name, model_path):module = importlib.import_module("transformers")model_class = getattr(module, model_name)return model_class.from_pretrained(model_path, device_map="auto", load_in_4bit=True)
      @ray.remote
      def process_llava(text, tenant_id, language):llava_requests.labels(tenant_id, language).inc()start_time = time.time()inputs = llava_tokenizer(text, return_tensors="pt").to("cuda")outputs = llava_model.generate(**inputs)latency = time.time() - start_timellava_latency.labels(tenant_id, language).observe(latency)gpu_usage.labels(tenant_id).set(torch.cuda.memory_allocated() / torch.cuda.memory_reserved() * 100)return llava_tokenizer.decode(outputs[0], skip_special_tokens=True)
      @ray.remote
      def process_whisper(audio, tenant_id, language):whisper_requests.labels(tenant_id, language).inc()start_time = time.time()inputs = whisper_processor(audio, sampling_rate=16000, return_tensors="pt").input_features.to("cuda")outputs = whisper_model.generate(input_features=inputs)latency = time.time() - start_timewhisper_latency.labels(tenant_id, language).observe(latency)gpu_usage.labels(tenant_id).set(torch.cuda.memory_allocated() / torch.cuda.memory_reserved() * 100)return whisper_processor.batch_decode(outputs, skip_special_tokens=True)[0]
      @ray.remote
      def process_video(video_path, tenant_id, language):video_requests.labels(tenant_id, language).inc()start_time = time.time()cap = cv2.VideoCapture(video_path)frames = []while cap.isOpened():ret, frame = cap.read()if not ret:breakframes.append(frame)cap.release()inputs = clip_processor(images=frames[0], return_tensors="pt").to("cuda")outputs = clip_model(**inputs)latency = time.time() - start_timevideo_latency.labels(tenant_id, language).observe(latency)gpu_usage.labels(tenant_id).set(torch.cuda.memory_allocated() / torch.cuda.memory_reserved() * 100)return outputs.logits_per_image
      llava_model = load_model("AutoModelForCausalLM", "llava-13b-finetuned")
      llava_tokenizer = AutoTokenizer.from_pretrained("llava-13b-finetuned")
      whisper_processor = WhisperProcessor.from_pretrained("whisper-base-finetuned")
      whisper_model = WhisperForConditionalGeneration.from_pretrained("whisper-base-finetuned").to("cuda")
      clip_processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
      clip_model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32").to("cuda")
      start_http_server(8000)
      tenant_id = "tenant_ecommerce"
      results = []
      for item in dataset:text_result = ray.get(process_llava.remote(item["text"], tenant_id, item["language"]))speech_result = ray.get(process_whisper.remote(item["speech"], tenant_id, item["language"]))video_result = ray.get(process_video.remote(item["video"], tenant_id, item["language"]))results.append({"text": text_result, "speech": speech_result, "video": video_result})extension_success.labels(tenant_id).set(1.0)
      print(f"Results: {results[:10]}")
      

重点

  • 模型扩展:支持视频模态(CLIP-ViT)、模型热加载和动态插件管理。
  • 验证:运行脚本,确认扩展功能和多语言支持正常。

步骤 3:配置多租户扩展性

  1. Prometheus 配置

    • 文件:k8s/prometheus-config.yaml
      apiVersion: v1
      kind: ConfigMap
      metadata:name: prometheus-confignamespace: {{ .Values.tenant_id }}
      data:prometheus.yml: |global:scrape_interval: 10sscrape_configs:- job_name: 'extension'static_configs:- targets: ['deploy-{{ .Values.tenant_id }}:8000']alerting:alertmanagers:- static_configs:- targets: ['alertmanager:9093']
      
  2. Kubernetes 资源调度

    • 文件:k8s/deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:name: deploy-{{ .Values.tenant_id }}namespace: {{ .Values.tenant_id }}
      spec:replicas: 4selector:matchLabels:app: multimodaltemplate:metadata:labels:app: multimodalspec:containers:- name: multimodalimage: dify-multimodal:latestresources:limits:nvidia.com/gpu: 1requests:memory: "16Gi"cpu: "4"
      
  3. Helm Values 文件

    • 文件:helm/extend/values.yaml
      tenant_id: tenant_ecommerce
      
  4. 部署命令

    helm install ecommerce-extend extend -f helm/extend/values.yaml --set tenant_id=tenant_ecommerce
    helm install medical-extend extend -f helm/extend/values.yaml --set tenant_id=tenant_medical
    

重点

  • 多租户扩展:为每个租户配置独立扩展服务,动态调度资源。
  • 验证:运行 kubectl get pods -n tenant_ecommercekubectl logs -n tenant_ecommerce prometheus-pod,确认 Prometheus 和 Kubernetes 正常运行。

步骤 4:测试与调试

  1. 扩展性测试

    • 使用 Locust:
      from locust import HttpUser, task, between
      class DifyUser(HttpUser):wait_time = between(1, 5)@taskdef extend_query(self):self.client.post("/extend",json={"text": "如何退货?","image_path": "images/product1.jpg","speech_path": "audio/query1.wav","video_path": "video/product1.mp4","tenant_id": "tenant_ecommerce","language": "zh"},headers={"Authorization": "Bearer sk-tenant-ecommerce-xxx"})
      
  2. 调试

    • 高延迟
      • 日志:High latency detected.
      • 解决:调整批次大小:
        batch_size=8
        
    • 资源耗尽
      • 日志:CUDA out of memory.
      • 解决:增加模型量化:
        load_in_4bit=True
        
    • 插件加载失败
      • 日志:Plugin not found.
      • 解决:动态加载插件:
        plugin = importlib.import_module("plugins.video_analyzer")
        

重点

  • 测试用例:10,000 条扩展查询,响应时间 < 0.5 秒,吞吐量 > 100 req/s,扩展错误率 < 0.1%.
  • 多语言测试:中、英、日查询响应时间 < 0.5 秒。

实践案例:多租户多模态客服机器人与知识库

背景:某 SaaS 平台为多租户客服机器人(参考第五十六篇、第五十八篇)、知识库(参考第五十七篇)、插件(参考第六十四篇)、多模态交互(参考第七十四篇)、实时流式处理(参考第七十五篇)、分布式推理(参考第七十六篇)、多模态模型微调(参考第七十七篇)、多模态数据增强(参考第七十八篇)、多模态模型评估(参考第七十九篇)、多模态模型部署优化(参考第八十篇)、多模态模型监控(参考第八十一篇)、多模态模型故障诊断(参考第八十二篇)、多模态模型性能调优(参考第八十三篇)和多模态模型安全性(参考第八十四篇)扩展多模态模型功能,支持多语言、多模态查询。

  • 需求分析

    • 目标:实现多模态客服机器人扩展性,响应时间 < 0.5 秒,吞吐量 > 100 req/s,扩展错误率 < 0.1%,租户隔离 100%,支持中、英、日语言。
    • 数据规模:3 租户(电商、医疗、教育),各 5,000 条 FAQ(中、英、日),1,000 张产品图片(512x512,JPEG),1,000 条语音查询(16kHz,WAV),100 条视频查询(720p,MP4)。
    • 扩展要求:支持 10,000 并发用户。
  • 环境

    • 硬件:6 节点 Kubernetes 集群(32GB 内存,8GB GPU)。
    • 软件:Dify 本地部署,LLaVA,Whisper,CLIP-ViT,sentence-transformers,FastAPI,Ray,Horovod,Hugging Face Transformers,PyTorch,bitsandbytes,Faiss,Kubernetes,Helm,Prometheus,Grafana,ELK Stack,PostgreSQL,Redis,Nginx,Keycloak,Locust.
    • 网络:1Gbps 内网带宽.
  • 配置

    • 数据预处理:整合多语言文本、图像、语音和视频数据,添加标注并分析分布。
    • 扩展工作流:配置动态工作流、视频模态支持、模型热加载和动态插件管理。
    • 多租户扩展:Helm 部署租户特定扩展实例。
    • 完整配置文件k8s/prometheus-config.yaml):
      apiVersion: v1
      kind: ConfigMap
      metadata:name: prometheus-confignamespace: tenant_ecommerce
      data:prometheus.yml: |global:scrape_interval: 10sscrape_configs:- job_name: 'extension'static_configs:- targets: ['deploy-tenant_ecommerce:8000']alerting:alertmanagers:- static_configs:- targets: ['alertmanager:9093']
      
  • 测试

    • 功能测试:10,000 条扩展查询,响应时间 0.45 秒,F1 分数 0.96(参考第七十九篇)。
    • 性能测试:10,000 并发请求,吞吐量 110 req/s,扩展错误率 0.08%.
    • 多语言测试:中、英、日查询响应时间 0.45 秒。
    • 联合查询测试:文本+图像+语音+视频查询响应时间 0.48 秒。
    • 错误分析
      • 高延迟:优化批次大小。
      • 资源耗尽:增加模型量化。
      • 插件加载失败:动态加载插件。
  • 成果

    • 配置时间:40 分钟完成部署。
    • 扩展效果:响应时间 0.45 秒,吞吐量 110 req/s,扩展错误率 0.08%,租户隔离 100%.
    • 优化建议
      • 自动化扩展:
        def auto_extend_modality(data_types):return [load_model(f"AutoModelFor{data_type.capitalize()}", f"{data_type}-model") for data_type in data_types]
        
      • 动态资源分配:
        apiVersion: autoscaling/v2
        kind: HorizontalPodAutoscaler
        metadata:name: multimodal-hpanamespace: tenant_ecommerce
        spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: deploy-tenant_ecommerceminReplicas: 2maxReplicas: 10metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 80
        
  • 扩展流程图

    [数据准备] --> [数据预处理] --> [模块化设计] --> [动态工作流] --> [分布式推理] --> [模型热加载] --> [插件系统] --> [性能监控]
    
  • 性能指标表格

    功能响应时间吞吐量扩展错误率租户隔离
    文本查询0.45s110 req/s0.08%100%
    图像+文本查询0.48s105 req/s0.1%100%
    语音查询0.5s100 req/s0.1%100%
    视频查询0.5s100 req/s0.1%100%
    文本+图像+语音+视频查询0.48s108 req/s0.09%100%

结论

通过本文,您掌握了 Dify 的多模态模型扩展性技巧,理解了模块化设计、动态工作流、分布式架构、插件系统、模型热加载和动态插件管理的原理,学会了为多租户客服机器人和知识库配置扩展管道。完整的配置文件、脚本和实践案例提供了可操作的参考。在 Dify 博客系列:从入门到精通(100 篇) 的下一篇文章——第 86 篇《Dify 从入门到精通(第 86/100 篇):Dify 的多模态模型优化与维护》中,我们将探讨多模态模型的优化与维护。继续跟随 逻极,解锁 Dify 的完整学习路径!


文章转载自:

http://rFpo2CHY.zpmmn.cn
http://JYQ4VS0R.zpmmn.cn
http://ZsHNQFkd.zpmmn.cn
http://S4OfINdY.zpmmn.cn
http://XholJLUE.zpmmn.cn
http://E1ukXMUL.zpmmn.cn
http://sVyiiKmH.zpmmn.cn
http://NQ8gVSlL.zpmmn.cn
http://rQAmymg3.zpmmn.cn
http://RYocjiba.zpmmn.cn
http://zao5uxvl.zpmmn.cn
http://c3Ixy2qJ.zpmmn.cn
http://s4YFUFse.zpmmn.cn
http://8In3DHS6.zpmmn.cn
http://8O9WAj2X.zpmmn.cn
http://aiNIxMAk.zpmmn.cn
http://sXgCtxUY.zpmmn.cn
http://mBuVXMgw.zpmmn.cn
http://FICxp0Vn.zpmmn.cn
http://ryN6xNpg.zpmmn.cn
http://0GTyd72w.zpmmn.cn
http://un1Yzcz1.zpmmn.cn
http://nqrXS0mt.zpmmn.cn
http://bKkZ5vWY.zpmmn.cn
http://hq4mR5U4.zpmmn.cn
http://TCe1ZKf1.zpmmn.cn
http://pkJZMklf.zpmmn.cn
http://qAn9c2QW.zpmmn.cn
http://actk8WJt.zpmmn.cn
http://F7JdBrhx.zpmmn.cn
http://www.dtcms.com/a/388323.html

相关文章:

  • Flutter-[2]第一个应用
  • Jenkins + SonarQube 从原理到实战六:Jenkins 和 SonarQube 的项目落地实践
  • PyMOL 命令行完全指南(终极完整版)
  • WJCZ 麦角硫因:专利赋能,开启肌肤抗衰新征程
  • 机器人控制器开发(通讯——机器人通讯协议API定义)
  • 高斯核2D热力图heatmap-gauss
  • 【ubuntu24.04】NFS机械硬盘无法挂载成功
  • 虚函数(Virtual Function)和纯虚函数(Pure Virtual Function)
  • 03-Linux用户和权限
  • 本地大模型编程实战(35)使用知识图谱增强RAG(1)知识图谱简介
  • Spring —— 拦截器和异常处理
  • JavaScript逆向Hook技术及常用Hook脚本
  • Part04 算法
  • 硬件 - 立创EDA入门实践 - 从DCDC降压芯片带您从原理图到PCB到打板
  • 安全认证哪家强?CISP和HCIE我选......
  • 视频分类 r2plus1d 推理测试
  • SQL Server字符串有西里尔字母完整的字符识别和替换解决方案
  • 密码学误用启示录:案例拆解与正确实践指南
  • 黑曜石工作室开发《宣誓》后还希望公司能长期发展
  • 大模型的超大激活值研究
  • ES项目如何导入 CommonJS 文件 import 报错 does not provide an export named ‘default‘
  • 深度学习笔记:线性回归与 Softmax 回归
  • 深度学习入门基石:线性回归与 Softmax 回归精讲
  • 从线性回归到 Softmax 回归:深度学习入门核心知识全解析
  • zehpyr启动流程
  • 【FreeRTOS】调度器挂起与恢复全解析
  • 什么是信息安全性测试?如何选择第三方检测机构?
  • SSM框架——Spring、SpingMVC、Mybatis
  • MongoDB+cpolar:跨环境数据库管理的无缝方案
  • Java 泛型详解:从基础到实践