bisheng系列(二)- 本地部署(前后端)
一、导读
环境:Ubuntu 24.04、open Euler 23.03、Windows 11、WSL 2、Python 3.10 、bisheng 1.1.1
背景:需要bisheng二开商用,故而此处进行本地部署,便于后期调试开发
时间:20250519
说明:bisheng前后端的代码不使用docker部署,基于代码部署
注意:本节基于上一章节的内容,如有疑问,请阅读:bisheng系列(一)
二、停止前后端的docker
bisheng共计9个容器,需要独立代码启动前后端,则需要将前后端的容器停止
1、停止并删除所有容器
命令:
docker-compose down
效果
jack@Laptop-L14-gen4:~/bisheng-blog/bisheng/docker/bisheng-main/docker$ docker-compose down
Stopping bisheng-frontend ... done
Stopping bisheng-backend ... done
Stopping milvus-standalone ... done
Stopping bisheng-es ... done
Stopping bisheng-office ... done
Stopping milvus-etcd ... done
Stopping bisheng-mysql ... done
Stopping bisheng-redis ... done
Stopping milvus-minio ... done
Removing bisheng-frontend ... done
Removing bisheng-backend ... done
Removing milvus-standalone ... done
Removing bisheng-es ... done
Removing bisheng-office ... done
Removing milvus-etcd ... done
Removing bisheng-mysql ... done
Removing bisheng-redis ... done
Removing milvus-minio ... done
Removing network docker_default
jack@Laptop-L14-gen4:~/bisheng-blog/bisheng/docker/bisheng-main/docker$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5257cf9b2426 qdrant/qdrant "./entrypoint.sh" 3 weeks ago Exited (255) 2 weeks ago 0.0.0.0:6333-6334->6333-6334/tcp, :::6333-6334->6333-6334/tcp distracted_lamport
b28179c3b79b qdrant/qdrant "./entrypoint.sh" 3 weeks ago Exited (255) 3 weeks ago 0.0.0.0:6333-6334->6333-6334/tcp, :::6333-6334->6333-6334/tcp bold_beaver
b00d21f614f7 hello-world "/hello" 3 weeks ago Exited (0) 3 weeks ago objective_khayyam
114b2a816fae ubuntu1:8080 "/bin/sh -c 'npm i &…" 7 weeks ago Exited (255) 7 weeks ago 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp light_house
通过上述命令说明,bisheng的9个容器停止并删除成功
2、配置docker-compse
通过编辑docker-compose.yml文件,删除前后端的启动项,修改后内容如下:
services:mysql:container_name: bisheng-mysqlimage: mysql:8.0ports:- "3306:3306"environment:MYSQL_ROOT_PASSWORD: "1234" # 数据库密码,如果修改需要同步修改bisheng/congfig/config.yaml配置database_url的mysql连接密码MYSQL_DATABASE: bishengTZ: Asia/Shanghaivolumes:- ${DOCKER_VOLUME_DIRECTORY:-.}/mysql/conf/my.cnf:/etc/mysql/my.cnf- ${DOCKER_VOLUME_DIRECTORY:-.}/mysql/data:/var/lib/mysqlhealthcheck:test: ["CMD-SHELL", "exit | mysql -u root -p$$MYSQL_ROOT_PASSWORD"]start_period: 30sinterval: 20stimeout: 10sretries: 4restart: on-failureredis:container_name: bisheng-redisimage: redis:7.0.4ports:- "6379:6379"environment:TZ: Asia/Shanghaivolumes:- ${DOCKER_VOLUME_DIRECTORY:-.}/data/redis:/data- ${DOCKER_VOLUME_DIRECTORY:-.}/redis/redis.conf:/etc/redis.confcommand: redis-server /etc/redis.confhealthcheck:test: ["CMD-SHELL", 'redis-cli ping|grep -e "PONG\|NOAUTH"']interval: 10stimeout: 5sretries: 3restart: on-failureoffice:container_name: bisheng-officeimage: onlyoffice/documentserver:7.1.1ports:- "8701:80"environment:TZ: Asia/ShanghaiJWT_ENABLED: "false"volumes:- ${DOCKER_VOLUME_DIRECTORY:-.}/office/bisheng:/var/www/onlyoffice/documentserver/sdkjs-plugins/bishengcommand: bash -c "supervisorctl restart all"restart: on-failureelasticsearch:container_name: bisheng-esimage: docker.io/bitnami/elasticsearch:8.12.0user: rootports:- "9200:9200"- "9300:9300"environment:TZ: Asia/Shanghaivolumes:- ${DOCKER_VOLUME_DIRECTORY:-.}/data/es:/bitnami/elasticsearch/datarestart: on-failureetcd:container_name: milvus-etcdimage: quay.io/coreos/etcd:v3.5.5environment:ETCD_AUTO_COMPACTION_MODE: revisionETCD_AUTO_COMPACTION_RETENTION: "1000"ETCD_QUOTA_BACKEND_BYTES: "4294967296"ETCD_SNAPSHOT_COUNT: "50000"TZ: Asia/Shanghaivolumes:- ${DOCKER_VOLUME_DIRECTORY:-.}/data/milvus-etcd:/etcdcommand: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcdrestart: on-failurehealthcheck:test: ["CMD", "etcdctl", "endpoint", "health"]interval: 30stimeout: 20sretries: 3minio:container_name: milvus-minioimage: minio/minio:RELEASE.2023-03-20T20-16-18Zenvironment:MINIO_ACCESS_KEY: minioadminMINIO_SECRET_KEY: minioadminports:- "9100:9000"- "9101:9001"volumes:- /etc/localtime:/etc/localtime:ro- ${DOCKER_VOLUME_DIRECTORY:-.}/data/milvus-minio:/minio_datacommand: minio server /minio_data --console-address ":9001"restart: on-failurehealthcheck:test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]interval: 30stimeout: 20sretries: 3milvus:container_name: milvus-standaloneimage: milvusdb/milvus:v2.3.3command: ["milvus", "run", "standalone"]security_opt:- seccomp:unconfinedenvironment:ETCD_ENDPOINTS: etcd:2379MINIO_ADDRESS: minio:9000volumes:- /etc/localtime:/etc/localtime:ro- ${DOCKER_VOLUME_DIRECTORY:-.}/data/milvus:/var/lib/milvusrestart: on-failurehealthcheck:test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]start_period: 90sinterval: 30stimeout: 20sretries: 3ports:- "19530:19530"- "9091:9091"depends_on:- etcd- minio
3、启动其余容器
jack@Laptop-L14-gen4:~/bisheng-blog/bisheng/docker/bisheng-main/docker$ docker-compose up -d
Creating network "docker_default" with the default driver
Creating milvus-etcd ... done
Creating bisheng-redis ... done
Creating bisheng-mysql ... done
Creating bisheng-office ... done
Creating milvus-minio ... done
Creating bisheng-es ... done
Creating milvus-standalone ... done
4、前后端代码
前后端的代码分别时:
后端:bisheng/src/backend
前端:bisheng/src/frontend
三、后端启动
通过修改部分文件,使后端可以连接到相关的容器服务
后端在open Euler 23.03启动,我使用vscode来修改相关文件
1、克隆源码
git clone https://github.com/dataelement/bisheng.git
2、安装相关环境
sudo yum -y install python3-pip python3-devel gcc g++
3、安装poetry
pip install poetry==1.8.2
4、项目环境
# 在当前项目根目录下生成环境
poetry config virtualenvs.create false# 安装环境所需的模块
poetry install
在该环境中,安装
pip install opencv-python-headless
安装后,看下安装过程是否存在异常,如下为正常
...... - Installing types-pillow (9.5.0.6)- Installing types-pyyaml (6.0.12.20250516)- Installing types-requests (2.32.0.20250515)
......Writing lock fileInstalling the current project: bisheng (1.1.1)
5、配置文件
此处配置文件特指其余七个容器的连接配置
将/bisheng/docker/bisheng/config/config.yaml 复制到指定目录下
cp bisheng/docker/bisheng/config/config.yaml bisheng/src/backend/bisheng/
编辑该文件
# 原内容
"mysql+pymysql://root:gAAAAABlp4b4c59FeVGF_OQRVf6NOUIGdxq8246EBD-b0hdK_jVKRs1x4PoAn0A6C5S6IiFKmWn0Nm5eBUWu-7jxcqw6TiVjQA==@mysql:3306/bisheng?charset=utf8mb4"redis_url: "redis://redis:6379/1"celery_redis_url: "redis://redis:6379/2"- sink: "/app/data/bisheng.log"- sink: "/app/data/statistic.log"# 修改后
"mysql+pymysql://root:gAAAAABlp4b4c59FeVGF_OQRVf6NOUIGdxq8246EBD-b0hdK_jVKRs1x4PoAn0A6C5S6IiFKmWn0Nm5eBUWu-7jxcqw6TiVjQA==@0.0.0.0:3306/bisheng?charset=utf8mb4"redis_url: "redis://0.0.0.0:6379/1"celery_redis_url: "redis://0.0.0.0:6379/2"- sink: "/home/jack/bisheng/src/backend/data/bisheng.log"- sink: "/home/jack/bisheng/src/backend/data/statistic.log"
修改目的是将链接修改为0.0.0.0:端口,由于之前使用docker配置可以连接,但是当前由于使用代码直接启动,无法识别http://mysql:3306这种链接,故而需要修改
日志路径修改是为了保证权限的问题
新建.env文件,内容如下:
# bisheng/src/backend/bisheng/.envBS_MILVUS_CONNECTION_ARGS='{"host":"milvus","port":"19530","user":"","password":"","secure":false}'
BS_MILVUS_IS_PARTITION='true'
BS_MILVUS_PARTITION_SUFFIX='1'
BS_ELASTICSEARCH_URL='http://elasticsearch:9200'
BS_ELASTICSEARCH_SSL_VERIFY='{}'
BS_MINIO_SCHEMA='false'
BS_MINIO_CERT_CHECK='false'
BS_MINIO_ENDPOINT='minio:9000'
BS_MINIO_SHAREPOIN='minio:9000'
BS_MINIO_ACCESS_KEY='minioadmin'
BS_MINIO_SECRET_KEY='minioadmin'
上述内容复制自docker-compose.yml
编辑settings文件,修改该函数内容如下
# bisheng/src/backend/bisheng/settings.pydef env_var_constructor(loader, node):from dotenv import load_dotenv, find_dotenvload_dotenv("/home/jack/bisheng/src/backend/bisheng/.env", find_dotenv())value = loader.construct_scalar(node) # PyYAML loader的固定方法,用于根据当前节点构造一个变量值var_name = value.strip('${} ') # 去除变量值(例如${PATH})前后的特殊字符及空格env_val = os.getenv(var_name) # 尝试在环境变量中获取变量名(如USER)对应的值,获取不到则为空if env_val is None:raise ValueError(f'Environment variable {var_name} not found')return env_val
编辑bisheng/src/backend/bisheng/api/services/assistant_agent.py,修改文件路径
# 原内容async def record_chat_history(self, message: List[Any]):# 记录助手的聊天历史if not os.getenv('BISHENG_RECORD_HISTORY'):returntry:os.makedirs('/app/data/history', exist_ok=True)with open(f'/app/data/history/{self.assistant.id}_{time.time()}.json',# 修改后async def record_chat_history(self, message: List[Any]):# 记录助手的聊天历史if not os.getenv('BISHENG_RECORD_HISTORY'):returntry:os.makedirs('/home/jack/bisheng/src/backend/data/history', exist_ok=True)with open(f'/home/jack/bisheng/src/backend/data/history/{self.assistant.id}_{time.time()}.json',
5、启动项目
uvicorn bisheng.main:app --host 0.0.0.0 --port 7860
成功如下:
.
.
.
INFO: Started server process [64315]
INFO: Waiting for application startup.
[2025-05-19 11:25:20.152105] [2025-05-19 11:25:20.151985] [DEBUG process-64315-139958058770496 bisheng.interface.utils:91] - trace=1 Setting up LLM caching with InMemoryCache
[2025-05-19 11:25:20.153851] [2025-05-19 11:25:20.153779] [INFO process-64315-139958058770496 bisheng.interface.utils:93] - trace=1 LLM caching setup with InMemoryCache
[2025-05-19 11:25:20.189322] [2025-05-19 11:25:20.189129] [DEBUG process-64315-139958058770496 bisheng.database.service:59] - trace=1 Creating database and tables
[2025-05-19 11:25:20.564080] [2025-05-19 11:25:20.563913] [DEBUG process-64315-139958058770496 bisheng.database.service:79] - trace=1 Database and tables created successfully
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:7860 (Press CTRL+C to quit)
四、前端启动
1、nginx部署
1)安装node,要求node >= 18
下载链接:v18.19.0 - 阿里云
# 切换目录
cd /usr/local# 下载nodejs文件
wget https://mirrors.aliyun.com/nodejs-release/v18.19.0/node-v18.19.0-linux-x64.tar.gz?spm=a2c6h.25603864.0.0.1bb22f6dOhRq63# 解压到当前目录
tar xzf node-v18.19.0-linux-x64.tar.gz# 创建软连接ln -s /usr/local/node-v18.19.0-linux-x64/bin/node /usr/bin/node
ln -s /usr/local/node-v18.19.0-linux-x64/bin/npm /usr/bin/npm
ln -s /usr/local/node-v18.19.0-linux-x64/bin/npx /usr/bin/npx
2)安装nginx
sudo yum -y install nginx
3)编译文件
# 编译client
cd bisheng/src/frontend/client && npm install --force --registry=https://registry.npmmirror.com && npm run build# 编译platform
cd bisheng/src/frontend/platform && npm install --force --registry=https://registry.npmmirror.com && npm run build
将编译后的build目录复制到/usr/share/nginx/html/,如下
cp -r client/build /usr/share/nginx/html/clientcp -r platform/build /usr/share/nginx/html/platform
4)替换nginx配置文件
# 备份nginx原配置文件
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak# 复制源码中的nginx配置文件
cp bisheng/docker/nginx/nginx.conf /etc/nginx/cp bisheng/docker/nginx/conf.d/* /etc/nginx/conf.d/
编辑conf.d下的配置文件,将两个配置文件的内容进行替换
# 原内容
proxy_pass http://backend:7860;
proxy_pass http://minio:9000;# 替换后
proxy_pass http://0.0.0.0:7860;
proxy_pass http://0.0.0.0:9000;
5)启动nginx
sudo nginx
6)访问测试
7)后端日志
后续继续优化
相关文章:

bisheng系列(二)- 本地部署(前后端)
一、导读 环境:Ubuntu 24.04、open Euler 23.03、Windows 11、WSL 2、Python 3.10 、bisheng 1.1.1 背景:需要bisheng二开商用,故而此处进行本地部署,便于后期调试开发 时间:20250519 说明:bisheng前后…...

【网络编程】十二、两万字详解 IP协议
文章目录 Ⅰ. 基本概念1、网络层解决的问题2、保证数据可靠的从一台主机送到另一台主机的前提3、路径选择4、主机和路由器的区别 Ⅱ. IP协议格式IP如何将报头与有效载荷进行分离?IP如何决定将有效载荷交付给上层的哪一个协议?理解socket编程 Ⅲ. 分片与组…...

Linux探秘:驾驭开源,解锁高效能——基础指令
♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...

WebSocket解决方案的一些细节阐述
今天我们来看看WebSocket解决方案的一些细节问题: 实际上,集成WebSocket的方法都有相关的工程挑战,这可能会影响项目成本和交付期限。在最简单的层面上,构建 WebSocket 解决方案似乎是添加接收实时更新功能的前进方向。但是&…...
大数据量下Redis分片的5种策略
随着业务规模的增长,单一Redis实例面临着内存容量、网络带宽和计算能力的瓶颈。 分片(Sharding)成为扩展Redis的关键策略,它将数据分散到多个Redis节点上,每个节点负责整个数据集的一个子集。 本文将分享5种Redis分片策略。 1. 取模分片(M…...
muduo库TcpServer模块详解
Muduo库核心模块——TcpServer Muduo库的TcpServer模块是一个基于Reactor模式的高性能TCP服务端实现,负责管理监听端口、接受新连接、分发IO事件及处理连接生命周期。 一、核心组件与职责 Acceptor 监听指定端口,接受新连接,通过epoll监听l…...

Java 代码生成工具:如何快速构建项目骨架?
Java 代码生成工具:如何快速构建项目骨架? 在 Java 项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作。幸运的是,Java 领域有许多代码生成工具可以帮助我们快速完成这一任务,大大提高开发效率。 一、代码生…...

Nginx核心服务
一.正向代理 正向代理(Forward Proxy)是一种位于客户端和原始服务器之间的代理服务器,其主要作用是将客户端的请求转发给目标服务器,并将响应返回给客户端 Nginx 的 正向代理 充当客户端的“中间人”,代…...

第22天-Python ttkbootstrap 界面美化指南
环境安装 pip install ttkbootstrap 示例1:基础主题切换器 import ttkbootstrap as ttk from ttkbootstrap.constants import *def create_theme_switcher():root = ttk.Window(title="主题切换器", themename="cosmo")def change_theme():selected = t…...

Kubernetes控制平面组件:Kubelet详解(七):容器网络接口 CNI
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...

web应用技术第6次课---Apifox的使用
Apifox - API 文档、调试、Mock、测试一体化协作平台。拥有接口文档管理、接口调试、Mock、自动化测试等功能,接口开发、测试、联调效率,提升 10 倍。最好用的接口文档管理工具,接口自动化测试工具。 第一个问题:为什么需要用Apif…...
Flutter与Kotlin Multiplatform(KMP)深度对比及鸿蒙生态适配解析
Flutter 与 Kotlin Multiplatform(KMP)深度对比及鸿蒙生态适配解析 在跨平台开发领域,Flutter 与 Kotlin Multiplatform(KMP)代表了两种不同的技术路线:前者以 “统一 UI 体验” 为核心,后者以…...
Predict Podcast Listening Time-(回归+特征工程+xgb)
Predict Podcast Listening Time 题意: 给你每个播客的信息,让你预测观众的聆听时间。 数据处理: 1.构造新特征收听效率进行分组 2.对数据异常处理 3.对时间情绪等进行数值编码 4.求某特征值求多项式特征 5.生成特征组合 6.交叉验证并enc…...

Redis队列与Pub/Sub方案全解析:原理、对比与实战性能测试
一、为什么选择Redis实现消息队列? Redis凭借其内存级操作(微秒级响应)、丰富的数据结构以及持久化能力,成为构建高性能消息队列的热门选择。相比传统消息队列(如Kafka/RabbitMQ),Redis在以下场…...
深度估计中为什么需要已知相机基线(known camera baseline)?
在计算机视觉和立体视觉的上下文中,“已知相机基线”(known camera baseline)的解释 1. 相机基线的定义 相机基线是指两个相机中心之间的距离。在立体视觉系统中,通常有两个相机(或一个相机在不同位置拍摄两张图像&a…...
显卡、Cuda和pytorch兼容问题
这里写目录标题 驱动与CUDA版本兼容性问题1. **驱动与CUDA版本兼容性问题**2. **任务特性与硬件适配差异**3. **优化策略与框架配置差异**4. **散热与功耗限制**5. **数据传输与CPU瓶颈**排查建议总结 查询PyTorch中实际使用的CUDA版本**1. 查询PyTorch中实际使用的CUDA版本***…...
SseEmitter是什么
SseEmitter 是 Spring Framework 中用于实现 Server-Sent Events (SSE) 的一个类。SSE 是一种允许服务器向客户端推送实时更新的技术,特别适合需要从服务器到客户端的单向消息传递场景,如股票价格更新、社交媒体的新消息通知等。 Server-Sent Events (S…...

OBOO鸥柏丨AI数字人触摸屏查询触控人脸识别语音交互一体机上市
OBOO鸥柏丨AI数字人触摸屏查询触控人脸识别语音交互一体机上市分析 OBOO鸥柏品牌推出的AI数字人触摸屏查询触控人脸识别语音交互一体机,是其在智能交互设备领域的又一创新产品。该一体机整合了触摸屏查询、AI人脸识别、AI声源定位语音麦克风,触控交互以…...

第5天-python饼图绘制
一、基础饼图绘制(Matplotlib) 1. 环境准备 python 复制 下载 pip install matplotlib numpy 2. 基础饼图代码 python 复制 下载 import matplotlib.pyplot as plt# 数据准备 labels = [1, 2, 3, 4] sizes = [30, 25, 15, 30] # 各部分占比(总和建议100) colors…...

2023 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛) 解题报告 | 珂学家
前言 题解 2023 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛)。 vp了下,题目挺好的,难度也适中,但是彻底红温了。 第二题,题意不是那么清晰, M i n ( K 1 , K 2 ) Min(K_1, K_2) Min(K1,K2)容易求&#x…...

LabVIEW风机状态实时监测
在当今电子设备高度集成化的时代,设备散热成为关键问题。许多大型设备机箱常采用多个风机协同散热,确保系统稳定运行。一旦风机出现故障,若不能及时察觉,可能导致设备损坏,造成巨大损失。为满足对机箱内风机状态实时监…...

十一、面向对象底层逻辑-Dubbo过滤器Filter接口
一、引言:分布式系统中的可观测性与治理基石 在分布式服务调用链路中,如何在服务调用前后植入通用逻辑(如日志记录、权限校验、性能监控等),是构建可观测、可治理系统的关键需求。Dubbo通过Filter接口实现了面向切面编…...
双检锁(Double-Checked Locking)单例模式
在项目中使用双检锁(Double-Checked Locking)单例模式来管理 JSON 格式化处理对象(如 ObjectMapper 在 Jackson 库中,或 JsonParser 在 Gson 库中)是一种常见的做法。这种模式确保了对象只被创建一次,同时在…...

linux安装nginx和前端部署vue项目
1、打包前端项目 npm run build 执行完后会在根目录下生成一个dist文件夹,这个dist文件夹就是我们后面要部署到nginx的东西。 2、将dist文件夹上传到服务器中 自己建一个目录,上传即可(尽量不要在root目录下,可能涉及权限问题…...
打破次元壁,VR 气象站开启气象学习新姿势
在教育领域,VR 气象站同样发挥着巨大的作用,为气象教学带来了全新的模式,打破了传统教学的次元壁,让学生们以全新的姿势学习气象知识。 在传统的气象教学中,学生们主要通过课本、图片和老师的讲解来学习气象知识。这…...

软件设计师“数据流图”真题考点分析——求三连
数据流图考点分析 1. 考点分值占比与趋势分析 综合知识题分值统计表 年份考题数量分值分值占比考察重点2018111.33%数据流图基本元素2019222.67%数据流图绘制原则2020111.33%数据流图与控制流图的区别2021334.00%数据字典与数据流图的关系2022222.67%分层数据流图的分解原则…...

基于R语言的贝叶斯网络模型实践技术应用:开启科研新视角
在现代科研领域,变量间的因果关系推断是生态学、环境科学、医学等多学科研究的核心问题。然而,传统的统计学方法往往只能揭示变量间的相关关系,而非因果关系。贝叶斯网络作为一种结合图论与统计学理论的新型模型,不仅能够统合多种…...
用 VS Code / PyCharm 编写你的第一个 Python 程序
用ChatGPT做软件测试 编写你的第一个 Python 程序——不只是“Hello, World”,而是构建认知、习惯与未来的起点 “第一行代码,是一个开发者认知世界的方式。” 编程的入门,不只是运行一个字符串输出,更是开始用计算机思维来理解、…...

【Git】远程操作
Git 是一个分布式版本控制系统 可以简单理解为,每个人的电脑上都是一个完整的版本库,这样在工作时,就不需要联网 了,因为版本库就在自己的电脑上。 因此, 多个人协作的方式,譬如说甲在自己的电脑上改了文件…...
低代码AI开发新趋势:Dify平台化开发实战
在人工智能快速发展的今天,AI应用的开发方式也在不断演变。从传统的手写代码到如今的低代码甚至零代码开发,技术的进步让更多的非专业开发者也能轻松上手。本文将带你走进Dify平台化开发的世界,探索如何通过这一强大的低代码AI开发平台&#…...