Docker和Dify學習筆記

文章目錄

  • 1 docker學習
    • 1.1 基本命令使用
      • 1.1.1 docker ps查看當前正在運行的鏡像
      • 1.1.2 docker stop停止容器
      • 1.1.3 docker compose容器編排
      • 1.1.4 docker網絡
        • [1] 進入到容器里面敲命令
        • [2] docker network ls
        • [3] brige網絡模式下容器訪問宿主機的方式
  • 2 Dify的安裝和基礎使用
    • 2.1 下載dify的工程倉庫
    • 2.2 創建.env配置文件
    • 2.3 修改Nginx的端口
    • 2.4 啟動Dify
    • 2.5 添加一個本地模型
      • 2.5.1 添加一個大語言模型
      • 2.5.2 添加一個Embedding模型
  • 3 基于Dify開發功能場景
    • 3.1 Echarts繪圖
    • 3.2 讓大模型能夠解析Json
  • 4 大模型或者Dify中常見的參數
    • 4.1 Temperature
  • 4 Dify使用過程中常見問題
    • 4.1 json超長了,超過80000個字符了
  • 參考資料

1 docker學習

1.1 基本命令使用

1.1.1 docker ps查看當前正在運行的鏡像

PS E:\LargeModel\dify\docker> docker ps
CONTAINER ID   IMAGE                                       COMMAND                   CREATED          STATUS                    PORTS                                         NAMES
5b2b8c1636e7   langgenius/dify-web:1.0.0                   "/bin/sh ./entrypoin…"   6 minutes ago    Up 6 minutes              3000/tcp                                      thirsty_diffie
99740eb3c659   langgenius/dify-web:1.0.0                   "/bin/sh ./entrypoin…"   6 minutes ago    Up 6 minutes              3000/tcp                                      upbeat_euclid
f8108bddcff7   nginx:latest                                "sh -c 'cp /docker-e…"   11 minutes ago   Up 11 minutes             0.0.0.0:8001->80/tcp, 0.0.0.0:8443->443/tcp   docker-nginx-1
2794a7f88a69   langgenius/dify-api:1.0.0                   "/bin/bash /entrypoi…"   11 minutes ago   Up 11 minutes             5001/tcp                                      docker-api-1
d51ee39beb2c   langgenius/dify-api:1.0.0                   "/bin/bash /entrypoi…"   11 minutes ago   Up 11 minutes             5001/tcp                                      docker-worker-1
e008dc5e6386   ubuntu/squid:latest                         "sh -c 'cp /docker-e…"   11 minutes ago   Up 11 minutes             3128/tcp                                      docker-ssrf_proxy-1
8c966517876b   langgenius/dify-sandbox:0.2.10              "/main"                   11 minutes ago   Up 11 minutes (healthy)                                                 docker-sandbox-1
a2d137e0f516   langgenius/dify-plugin-daemon:0.0.3-local   "/bin/bash -c /app/e…"   11 minutes ago   Up 11 minutes             0.0.0.0:5003->5003/tcp                        docker-plugin_daemon-1
56f97d78ab4c   langgenius/dify-web:1.0.0                   "/bin/sh ./entrypoin…"   11 minutes ago   Up 11 minutes             3000/tcp                                      docker-web-1
cfe29ccee8df   postgres:15-alpine                          "docker-entrypoint.s…"   11 minutes ago   Up 11 minutes (healthy)   0.0.0.0:5432->5432/tcp                        docker-db-1
edd0a6879ba7   semitechnologies/weaviate:1.19.0            "/bin/weaviate --hos…"   11 minutes ago   Up 11 minutes                                                           docker-weaviate-1
191a080293e4   redis:6-alpine                              "docker-entrypoint.s…"   11 minutes ago   Up 11 minutes (healthy)   6379/tcp                                      docker-redis-1
PS E:\LargeModel\dify\docker>

1.1.2 docker stop停止容器

【停止指定名稱的容器】

PS E:\LargeModel\dify\docker> docker stop thirsty_diffie
thirsty_diffie

【停止所有當前在運行的容器】

PS E:\LargeModel\dify\docker> docker stop $(docker ps -aq)
5b2b8c1636e7
99740eb3c659
f8108bddcff7
2794a7f88a69
d51ee39beb2c
e008dc5e6386
8c966517876b
a2d137e0f516
56f97d78ab4c
cfe29ccee8df
edd0a6879ba7
191a080293e4
fe75be867cd5

1.1.3 docker compose容器編排

1.1.4 docker網絡

[1] 進入到容器里面敲命令
docker exec -it docker-api-1 /bin/bash

案例:安裝ping命令和telnet命令

root@cb7f80d95b40:/app/api# apt-get update
Get:1 http://deb.debian.org/debian bookworm InRelease [151 kB]
Get:2 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
Get:3 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
Get:4 http://deb.debian.org/debian bookworm/main amd64 Packages [8792 kB]
Get:5 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [13.5 kB]
Get:6 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [246 kB]
Fetched 9306 kB in 8min 19s (18.6 kB/s)
Reading package lists... Done
root@cb7f80d95b40:/app/api# apt-get install -y iputils-ping
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:libcap2-bin libpam-cap
The following NEW packages will be installed:
[2] docker network ls
PS D:\LargeModel> docker network ls
NETWORK ID     NAME                        DRIVER    SCOPE
35353aad5d22   bridge                      bridge    local
6e02ea3b25c6   docker_default              bridge    local
5973270d4a91   docker_ssrf_proxy_network   bridge    local
503869a64910   host                        host      local
a0056c2c396d   none                        null      local
[3] brige網絡模式下容器訪問宿主機的方式

容器內可以使用host.docker.internal來代替主機的ip

2 Dify的安裝和基礎使用

2.1 下載dify的工程倉庫

git clone https://github.com/langgenius/dify.git
# 國內鏡像站
https://gitee.com/dify_ai/dify

2.2 創建.env配置文件

我們進入dify目錄下的docker目錄中,

# 以示例創建一個.env的文件,執行下面命令
cp .\.env.example .env

2.3 修改Nginx的端口

默認占用的是80和443端口,如果你本機已經部署了其他的應用,占了該端口,修改.env文件中的下面兩個變量

EXPOSE_NGINX_PORT=8001
EXPOSE_NGINX_SSL_PORT=8443

2.4 啟動Dify

docker compose up -d

2.5 添加一個本地模型

2.5.1 添加一個大語言模型

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
這里需要注意, 我的ollama是直接安裝在宿主機的。 但是Dify是通過docker啟動起來的,這里涉及到docker和宿主機之間的通信。 如果docker訪問宿主機,可以使用host.docker.internal域名,Docker的DNS可以解析這個域名。

2.5.2 添加一個Embedding模型

(1)安裝bge-m3模型

ollama pull bge-m3

(2)Dify中配置embedding模型
在這里插入圖片描述
在這里插入圖片描述

3 基于Dify開發功能場景

3.1 Echarts繪圖

思路就是利用Dify的echarts渲染的能力(即使是Dify自帶的Echarts圖表生成工具也是輸出了一串echarts的配置字符串,甚至還沒有直接寫python代碼生成來的直接)。 但是只能在工作流和chatflow里面使用。如果將繪圖的工作流集成到Agent里面的話,會導致大模型解析不了json,輸出不了內容了。

import json
import requests
from datetime import datetime, timedelta
import statistics"""這是一個try參數的機制
"""
def getValidResponse(url, headers, params):response = Nonefor resourceFlag in ['sw', 'lk', 'wlw']:params["resource_flag"] = resourceFlagresponse = requests.get(url= url, headers= headers, params= params, timeout= 10)# 檢查請求是否成功if response.status_code == 200:try:json_data = response.json()print(json_data)if (not "data" in json_data) or json_data["data"] is None or len(json_data["data"]) <= 0:continueelse:return responseexcept ValueError:continue        else:continue        """獲取某一個水庫某一段時間內的的水情數據。(主要是水位)參數:startDate: start_dt=2025-03-16+10:00:00endDate: end_dt=2025-03-17+11:00:00
"""
def getWaterStatus(guid: str, stcd: str, startDate: str, endDate: str) -> dict:url = "https://sk.hubeishuiyi.cn/services/1234567890ABCDEFGHIJKLMN/res_z_detail/param"headers = {"Apikey": "F1DBECD719108635189480CF60E6553ADB3109616426BD537F25A430DFC613B491A025C4A51E77FD08C6E5B7CBE05917A461286E7B6D69F1AB1B14F946149D2065B0C675F8FEDF4B9B05C1496881BC5A"}params = {"is_tb": "n","pageNo": 1,"pageSize":10000,"st_cd": stcd,"resource_flag":"sw","flag": 1,"start_dt": startDate,"end_dt": endDate,"res_cd": guid}response = getValidResponse(url, headers, params)# 檢查請求是否成功if response is not None and response.status_code == 200:try:json_data = response.json()# # 轉為雙引號的標準json字符串# json_data = json.dumps(json_data)# json_data = json.loads(json_data)print(json_data)if (not "data" in json_data) or json_data["data"] is None or len(json_data["data"]) <= 0:return {"result" : []} # 以時間作為橫坐標timeList = []# 水位數據waterLevelList = []# 蓄水量waterStorageList = []for dataObject in json_data["data"]:timeStr = dataObject["tm"]timeList.append(timeStr)waterLevel = dataObject["rz"]waterLevelList.append(waterLevel)waterStorage = dataObject["w"]waterStorageList.append(waterStorage)statisticData = {"time": timeList,"waterLevel": waterLevelList,"waterStorage": waterStorageList}return {"result": statisticData}except ValueError:return {"result" : "Failed to parse JSON response"}else:statisticData = {"failMsg": f"Request failed. url = {url}, params = {params}"}return {"result" : statisticData}def calcYAxisMinMax(nums: list):minValue = min(nums) - 8if minValue < 0:minValue = 0maxValue = max(nums) + 8return minValue, maxValue"""參數:data: tuple的列表。
"""
def create_dynamic_table_str(headers: list, data):table = "|"for header in headers:table += f" {header} |"table += "\n|"for _ in headers:table += " ------- |"for row in data:table += "\n|"for item in row:table += f" {item} |"return tabledef constructTableString(timeList: list, waterLevelList: list) -> str:timeList = timeList[-10:]waterLevelList = waterLevelList[-10:]headers = ['時間', '水位(m)']data = list(zip(timeList, waterLevelList))return create_dynamic_table_str(headers, data)def constructStatisticString(waterLevelList: list) -> str:headers = ['統計項', '統計值']data = []minValue = min(waterLevelList)data.append(("最小值", f"{minValue:.2f}"))maxValue = max(waterLevelList)data.append(("最大值", f"{maxValue:.2f}"))meanValue = sum(waterLevelList) / len(waterLevelList)data.append(("平均值", f"{meanValue:.2f}"))# 計算列表的中位數medianValue = statistics.median(waterLevelList)data.append(("中位數", f"{medianValue:.2f}"))# 標準差devValue = statistics.stdev(waterLevelList)data.append(("標準差", f"{devValue:.2f}"))return create_dynamic_table_str(headers, data=data)def drawEcharts(data: dict) -> dict:if data is None or len(data) <= 0:return {"result": ""}if "time" not in data or "waterLevel" not in data or "waterStorage" not in data:return {"result": ""}waterStatusData = data# 提取時間和對應的數據timeList = list(reversed(waterStatusData["time"]))waterLevelList = waterStatusData["waterLevel"]waterStorageList = waterStatusData["waterStorage"]if timeList is None or len(timeList) < 2:return {"result": ""}# 繪圖準備工作UTC_FORMAT = "%Y-%m-%d %H:%M:%S"startTime = datetime.strptime(timeList[0], UTC_FORMAT)endTime = datetime.strptime(timeList[-1], UTC_FORMAT)walterLevelMin, walterLevelMax = calcYAxisMinMax(waterLevelList)# 生成echarts配置echarts_config = {"color": ['#eb6877', '#0f91c4', '#46cbd4'],"title": {"subtext": f"{startTime.strftime('%m')}{startTime.strftime('%d')}日-{endTime.strftime('%m')}{endTime.strftime('%d')}日水位情況","left": 20},"tooltip": {"trigger": "axis","axisPointer": {"type": "cross"}},"legend": {# "data": ["水位", "最低氣溫", "降水"],"data": ["水位"],"right": 20},"xAxis": {"data": timeList,"axisLine": {"onZero": False}},"yAxis": [{"type": "value","name": "水位","position": "left","min": walterLevelMin,"max": walterLevelMax,"axisLabel": {"formatter": "{value} m"}},# {#     "type": "value",#     "name": "蓄水量",#     "position": "right",#     "axisLabel": {#         "formatter": "{value} m"#     }# }],"series": [{"name": "水位","type": "line","data": waterLevelList,"yAxisIndex": 0,"itemStyle": {"color": "#eae213"},"markPoint": {"data": [{"type": 'max'},{"type": 'min'},],# 設置為點"symbol": 'circle', # 調整點的大小"symbolSize": 8, "label": {"position": 'right',# 標簽字體加粗"fontWeight": 'bold', # 標簽字體大小"fontSize": 12 }},},# {#     "name": "蓄水量",#     "type": "bar",#     "smooth": True,#     "data": waterStorageList,#     "yAxisIndex": 0,#     "itemStyle": {#         "color": "#4bb2fa"#     }# },# {#     "name": "降水",#     "type": "bar",#     "smooth": True,#     "data": rainfall,#     "yAxisIndex": 1,#     "itemStyle": {#         "color": "#31e84f"#     }# }]}echartString = "```echarts\n" + json.dumps(echarts_config, indent=2, ensure_ascii=False) + "\n```"tableString = constructTableString(timeList, waterLevelList)statisticString = constructStatisticString(waterLevelList)# 生成輸出文件output = echartString + "\n\n"  \+ "最近十條數據展示:\n" + tableString + "\n\n" \+ "常用統計數據展示:\n" + statisticStringreturn {"result":output}def main(guid: str, stcdList: list) -> dict:if guid is None or stcdList is None or len(guid) <= 0 or len(stcdList) <= 0:return {"result" : ""}endDate = datetime.now()endDateStr = endDate.strftime("%Y-%m-%d %H:%M:%S")startDate = endDate - timedelta(days=15)startDateStr = startDate.strftime("%Y-%m-%d %H:%M:%S")result = getWaterStatus(guid=guid, stcd=stcdList[0], startDate=startDateStr, endDate=endDateStr)print(f"main.result = {result['result']}")markdownScript = drawEcharts(result["result"])print(markdownScript)return markdownScriptif __name__ == "__main__":# print(main('42022220001', ['61608180']))# print(main('42130330004', ["61608180"]))# print(main('42122350024', ['90021804']))print(main('42058340006', [ "90006379"]))

3.2 讓大模型能夠解析Json

4 大模型或者Dify中常見的參數

4.1 Temperature

LLM 生成是具有隨機性的,在模型的頂層通過選取不同預測概率的預測結果來生成最后的結果。我們一般可以通過控制 temperature 參數來控制 LLM 生成結果的隨機性與創造性。

Temperature 一般取值在 0~1 之間,當取值較低接近 0 時,預測的隨機性會較低,產生更保守、可預測的文本,不太可能生成意想不到或不尋常的詞。當取值較高接近 1 時,預測的隨機性會較高,所有詞被選擇的可能性更大,會產生更有創意、多樣化的文本,更有可能生成不尋常或意想不到的詞。

4 Dify使用過程中常見問題

4.1 json超長了,超過80000個字符了

這是因為Dify限制了默認的長度。本地部署的情況下可以修改.env配置文件中的相關變量數值。 修改之后重啟整個服務。

常見的參數和含義入下圖所示:
在這里插入圖片描述
重啟服務所需要使用的命令:

docker compose down
docker compose up -d

參考資料

[1] https://mp.weixin.qq.com/s/n5GrGZ9hZmdhzt4avs1XSw
[2] https://wiki.eryajf.net/pages/674f53/
[3] https://zhuanlan.zhihu.com/p/20939683190
[4] https://dify.flowus.cn/haojixing/share/943044ea-005e-4e57-9e74-450700df71c2
[5] https://blog.csdn.net/luckcxy/article/details/144900399

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898596.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898596.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898596.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

高并發庫存系統是否適合使用 ORM(Hibernate / MyBatis)

在設計高并發的庫存管理系統時&#xff0c;數據層的選擇至關重要。許多企業開發中習慣使用 ORM&#xff08;如 Hibernate、MyBatis&#xff09;來簡化數據庫訪問&#xff0c;但在高并發、高吞吐的場景下&#xff0c;ORM 的適用性往往成為爭議焦點。本文將探討高并發庫存系統是否…

Web爬蟲利器FireCrawl:全方位助力AI訓練與高效數據抓取。本地部署方式

開源地址&#xff1a;https://github.com/mendableai/firecrawl 01、FireCrawl 項目簡介 Firecrawl 是一款開源、優秀、尖端的 AI 爬蟲工具&#xff0c;專門從事 Web 數據提取&#xff0c;并將其轉換為 Markdown 格式或者其他結構化數據。 Firecrawl 還特別上線了一個新的功…

探秘Transformer系列之(16)--- 資源占用

探秘Transformer系列之&#xff08;16&#xff09;— 資源占用 文章目錄 探秘Transformer系列之&#xff08;16&#xff09;--- 資源占用0x00 概述0x01 背景知識1.1 數據類型1.2 進制&換算數字進制存儲度量換算 1.3 參數顯存占用有參數的層無參數的層所需資源 1.4 計算量 0…

jaeger安裝和簡單使用

文章目錄 jaeger安裝和使用什么是jaegerjaeger安裝 jaeger安裝和使用 什么是jaeger 官網&#xff1a;https://www.jaegertracing.io/ Jaeger 是一個分布式追蹤系統。Jaeger的靈感來自 Dapper 和 OpenZipkin&#xff0c;是一個由 Uber 創建并捐贈給 云原生計算基金會&#xf…

【Mybatis-plus】在mybatis-plus中 if test標簽如何判斷 list不為空

博主介紹&#xff1a;?全網粉絲22W&#xff0c;CSDN博客專家、Java領域優質創作者&#xff0c;掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域? 技術范圍&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大數據、物…

FRP在物聯網設備中的穿透方案

物聯網設備常位于NAT后&#xff0c;FRP為其提供穩定穿透鏈路。 配置要點 輕量化部署&#xff1a;使用ARM版本FRP客戶端&#xff0c;適配樹莓派等設備9。 自啟動腳本&#xff1a;通過systemd或crontab實現設備重啟后自動連接26。 低功耗優化&#xff1a;調整心跳間隔&#xf…

【遞歸,搜索與回溯算法篇】- 名詞解釋

一. 遞歸 1. 什么是遞歸&#xff1f; 定義&#xff1a; 函數自己調用自己的情況關鍵點&#xff1a; ?終止條件&#xff1a; 必須明確遞歸出口&#xff0c;避免無限遞歸 ?子問題拆分&#xff1a; 問題需能分解成結構相同的更小的子問題缺點&#xff1a; ?棧溢出風險&#x…

條件變量,鎖,共享數據的關系

條件變量、共享數據和鎖之間的三方耦合關系源于多線程環境下對資源訪問的同步需求。以下是關鍵點分析&#xff1a; 條件變量中通常會對共享數據進行判斷和處理&#xff0c;如果不加鎖就會出現數據競爭的問題&#xff0c;所以并不是條件變量要跟鎖一起使用&#xff0c;而是上鎖為…

大屏技術匯集【目錄】

Cesium 自從首次發布以來&#xff0c;經歷了多個版本的迭代和更新&#xff0c;每個版本都帶來了性能改進、新功能添加以及對現有功能的優化。以下是 Cesium 一些重要版本及其主要特點&#xff1a; 主要版本概述 Cesium 1.0 (2012年) 初始版本發布&#xff0c;確立了Cesium作為…

圖解AUTOSAR_CP_EEPROM_Abstraction

AUTOSAR EEPROM抽象模塊詳細說明 基于AUTOSAR標準的EEPROM抽象層技術解析 目錄 1. 概述 1.1 核心功能1.2 模塊地位2. 架構概覽 2.1 架構層次2.2 模塊交互3. 配置結構 3.1 主要配置容器3.2 關鍵配置參數4. 狀態管理 4.1 基本狀態4.2 狀態轉換5. 接口設計 5.1 主要接口分類5.2 接…

C++相關基礎概念之入門講解(下)

1. 引用 ? int main() {const int a10;int& aaa;aa;cout<<aa<<endl; } 引用 不是新定義一個變量&#xff0c;而 是給已存在變量取了一個別名 &#xff0c;編譯器不會為引用變量開辟內存空 間&#xff0c;它和它引用的變量 共用同一塊內存空間&#xff08;初…

注意力機制,本質上是在做什么?

本文以自注意機制為例&#xff0c;輸入一個4*4的矩陣 如下&#xff1a; input_datatorch.tensor([[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16] ],dtypetorch.float) 得到Q和K的轉置如下。 此時&#xff0c;計算QK^T ,得到如下結果 第一行第一個位置就是第一條樣本和第…

記一次wsl2+docker無法運行的經歷

前情提要 由于某個大創項目的需要和對貓娘機器人的迫切渴求&#xff08;bushi 需要在電腦里面安裝docker desktop。由于電腦里面安裝了wsl2環境 因此決定使用wsl2dockerdesktop的方式配置docker 遇到的問題 在像往常一樣安裝docker desktop并且啟動時 提示錯誤&#xff1a; …

PageHelper插件依賴引入不報錯,但用不了

情況: 父模塊pom. Xml 引入1. 4. 0以上版本的pagehelper-spring-boot-starter。 要用到插件的子模塊&#xff0c;去掉版本號&#xff0c;引入和父模塊一樣的依賴。 引入成功&#xff0c;沒有報錯&#xff0c;但是打開右邊的maven里面沒有找到PageHelper插件。 終端清空并重…

Windows搭建免翻墻的BatteryHistorian

文章參考 GitCode - 全球開發者的開源社區,開源代碼托管平臺 免翻墻的BatteryHistorian主要原理&#xff1a;修改go源碼 1.安裝Java環境 1.點擊下載 Java JDK&#xff0c;并安裝,一路next 2.java -version 檢驗是否安裝成功 2.安裝Git工具 1、點擊下載 Git&#xff0c;并…

項目中pnpm版本和全局pnpm版本不一致

項目中pnpm版本和全局pnpm版本不一致 檢查package.json中&#xff0c;是否存在"packageManager": “pnpm8.6.10”&#xff0c;限制了pnpm的版本。

透析Vue的nextTick原理

nextTick 是 Vue.js 中的一個核心機制&#xff0c;用于在 下一次 DOM 更新周期后 執行回調函數。它的核心原理是 利用 JavaScript 的事件循環機制&#xff08;Event Loop&#xff09;&#xff0c;結合微任務&#xff08;Microtask&#xff09;或宏任務&#xff08;Macrotask&am…

WRF/Chem 模式技術解讀:為大氣污染治理提供有力支撐

技術點目錄 第一部分、WRF-Chem模式應用案例和理論基礎第二部分、Linux環境配置及WRF-CHEM第三部分、WRF-Chem模式編譯&#xff0c;排放源制作第四部分、WRF-Chem數據準備&#xff08;氣象、排放、初邊界條件等&#xff09;&#xff0c;案例實踐第五部分、模擬結果提取、數據可…

ccfcsp2701如此編碼

//如此編碼 #include<iostream> using namespace std; int main(){int n,m;cin>>n>>m;int a[21],b[21],c[21];for(int i1;i<n;i){cin>>a[i];}c[0]1;for(int i1;i<n;i){c[i]c[i-1]*a[i];}b[1](m%c[1])/c[0];int s1,s20;for(int i2;i<n;i){s2s2…

74HC04(反相器)和74HC14(反相器、施密特觸發器)的區別

74HC04和74HC14的具體區別詳解 同樣具有反相器功能&#xff0c;你知道74HC04和74HC14的具體區別嗎&#xff1f; 74HC04 對于74HC04很好理解&#xff0c;輸入低電平&#xff0c;輸出高電平&#xff1b;輸入高電平&#xff0c;輸出低電平。 建議操作條件&#xff1a; 下圖是TI的…