by Rain Chu | 5 月 13, 2024 | AI , Chat , Linux , NodeJS , React , Ubuntu , ViteJS , 程式
AnythingLLM是一款全功能的應用程序,支持使用商業或開源的大語言模型(LLM)和向量數據庫建構私有ChatGPT。用戶可以在本地或遠端運行該系統,並利用已有文檔進行智能對話。此應用將文檔分類至稱為工作區的容器中,確保不同工作區間的資料隔離,保持清晰的上下文管理。
特點:多用戶支持、權限管理、內置智能代理(可執行網頁瀏覽、代碼運行等功能)、可嵌入到網站的聊天窗口、多種文檔格式支持、向量數據庫的簡易管理界面、聊天和查詢兩種對話模式、引用文檔內容的展示,以及完善的API支持客戶端定制整合。此外,該系統支持100%雲端部署,Docker部署,且在處理超大文檔時效率高,成本低。
VIDEO
注意,以下要用 linux 平台安裝,windows 用戶可以用 WSL,推薦用 Ubuntu OS
在自己的 home 目錄下,到 GitHub 中下載原始碼
git clone https://github.com/Mintplex-Labs/anything-llm.git
利用 yarn 作設定資源
cd anything-llm
yarn setup
把環境變數建立起來,後端主機是 NodeJS express
cp server/.env.example server/.env
nano server/.env
密文需要最少12位的字元,檔案的存放路徑也記得改成自己的
JWT_SECRET="my-random-string-for-seeding"
STORAGE_DIR="/your/absolute/path/to/server/storage"
前端的環境變數,先把/api打開即可
# VITE_API_BASE='http://localhost:3001/api' # Use this URL when developing locally
# VITE_API_BASE="https://$CODESPACE_NAME-3001.$GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN/api" # for Github Codespaces
VITE_API_BASE='/api' # Use this URL deploying on non-localhost address OR in docker.
如果你在設定的時候,遇到更新請求,可以跟我著我下面的方法作
把 prisma 更新好
yarn add --dev prisma@latest
yarn add @prisma/client@latest
前端的程式碼
先編譯前端程式碼,前端是由 viteJS + React
cd frontend && yarn build
將編譯好的資料放到 server 的目錄下
cp -R frontend/dist/* server/public/
選項,如果需要用到本地端的 LLM 模型,就把 llama-cpp 下載下來
cd server && npx --no node-llama-cpp download
把資料庫建立好
cd server && npx prisma generate --schema=./prisma/schema.prisma
cd server && npx prisma migrate deploy --schema=./prisma/schema.prisma
Server端是用來處理 api 以及進行向量資料庫的管理以及跟 LLM 交互
Collector 是一個 NodeJS express server,用來作UI處理和解析文檔
cd server && NODE_ENV=production node index.js &
cd collector && NODE_ENV=production node index.js &
更新的指令碼
現在 anything llm 更新速度超快,把這一段指令碼複製起來,方便未來作更新的動作
#!/bin/bash
cd $HOME/anything-llm &&\
git checkout . &&\
git pull origin master &&\
echo "HEAD pulled to commit $(git log -1 --pretty=format:"%h" | tail -n 1)"
echo "Freezing current ENVs"
curl -I "http://localhost:3001/api/env-dump" | head -n 1|cut -d$' ' -f2
echo "Rebuilding Frontend"
cd $HOME/anything-llm/frontend && yarn && yarn build && cd $HOME/anything-llm
echo "Copying to Sever Public"
rm -rf server/public
cp -r frontend/dist server/public
echo "Killing node processes"
pkill node
echo "Installing collector dependencies"
cd $HOME/anything-llm/collector && yarn
echo "Installing server dependencies & running migrations"
cd $HOME/anything-llm/server && yarn
cd $HOME/anything-llm/server && npx prisma migrate deploy --schema=./prisma/schema.prisma
cd $HOME/anything-llm/server && npx prisma generate
echo "Booting up services."
truncate -s 0 /logs/server.log # Or any other log file location.
truncate -s 0 /logs/collector.log
cd $HOME/anything-llm/server
(NODE_ENV=production node index.js) &> /logs/server.log &
cd $HOME/anything-llm/collector
(NODE_ENV=production node index.js) &> /logs/collector.log &
by Rain Chu | 5 月 12, 2024 | 教育 , 線上學習
大多數人學習外語的時候,現在都可以在讀、寫、聽三個方面取得不錯的成績,唯獨在口語交流方面一直無法有效率的突破。隨著技術的進步,各種口語AI練習軟體應運而生,為語言學習者提供了革命性的學習工具。在眾多優秀的語言學習軟體中,MyET、Toko和OpenAI相關的Speak app都是市場上的佼佼者。
1. MyET
MyET (My English Tutor)是一款專注於英語學習的AI軟體,擁有全球最多用戶的口說學習應用之一。這款軟體利用先進的語音識別技術來評估和提升用戶的英語口語能力。透過模擬真實情境的交談練習,MyET能夠提供即時反饋,指出用戶的發音、語調、語速等方面的不足。此外,MyET在東亞尤其受到歡迎,已有超過400萬人使用這款軟體,見證了其有效性。
MyET還包含豐富的教學課程和互動式練習,適合各個語言水平的學習者使用。學習者可以根據自己的學習進度調整課程難度,進行個性化學習。軟體還能大幅減少教師在改作業方面的工作量,使教師能更專注於教學質量的提升。此外,MyET與知名的夏恩英語 學校合作,提供更專業和系統化的學習資源,進一步提升學習成效。這種全面且實用的學習工具,無疑是英語學習者提升口語能力的強大助手。
由台灣之光發明的口說練習,也是許多非中文語系的國家學習中文的首選 My-CT 是許多東南亞國家的必要學習中文的軟體之一
Toko是一款多語言學習平台,以AI驅動的對話練習功能聞名。這款應用支持英語學習以及西班牙語、法語等多種語言,非常適合全球用戶。Toko的特色在於其強大的互動性和高度可定制的學習經驗。用戶可以與AI進行一對一的對話練習,AI會根據對話中的語言使用情況提供反饋和建議,幫助學習者提升語言技能。
去年,Toko獲得了知名創業加速器Y Combinator和GSV Ventures的210萬美元投資,這不僅是對其技術和市場潛力的認可,也提供了進一步發展和擴展的資金支持。Toko設計了超過150種不同的話題情境,如職場、時事、閒聊、運動等,這讓用戶能夠在日常會話中用英文思考和表達,強化語言實用性和流暢性。
此外,Toko鼓勵用戶以英語的邏輯進行對話,目標是提升用戶的回話速度和自然使用目標語言的能力。平台還特別強調文化語境和俗語的學習,這對於深入了解目標語言的文化背景非常有幫助。透過這些獨特的設計,Toko不僅是一款語言學習工具,更是橋梁,連接語言學習者與廣闊的文化世界。
3. Speak app
Speak app 是由OpenAI支持的一款創新語言學習工具,特別注重於提升用戶的口語和聽力技能。這款應用程序利用先進的自然語言處理技術,可以理解和生成自然的對話,使學習者能夠在真實的對話情境中練習。
我覺得Speak app的最厲害的地方在於其能夠根據用戶的反應和回答適應性地調整對話難度和話題,從而提供高度個性化的學習體驗,尤其跟真人一樣的講話語速,腔調,讓我可以很快的學習真正在地的語言,而不是台灣式的英文。
此外,這款軟體還能夠捕捉並分析用戶的進步,並提供實用的學習建議。
這三款口說AI練習語言的軟體各有其獨特的優勢和功能,無論是初學者還是進階學習者都能從中找到合適的學習工具,有效提升自己的語言交流能力。隨著AI技術的不斷進步,未來這些工具的功能和效果將更加出色,為語言學習者提供更多的便利和機會。
by Rain Chu | 4 月 24, 2024 | Linux , Raspberry Pi , Ubuntu
wpa_cli 是一個用於與 wpa_supplicant 交互的命令行界面工具,當然也支持在 command line 下直接使用命令控制 WIFI,可以用來管理無線網絡接口的設定和運行狀態。這個工具非常強大,支持多種操作,如掃描無線網絡、連接到網絡、變更設定等,而我都用python 透過 wpa_cli 來控制 WIFI。
首先掃描無線網路
打開終端,並且記得要用 root 權限來執行 wpa_cli
sudo wpa_cli -i wlan1 scan
sleep 5 # 給予一些時間來完成掃描
sudo wpa_cli -i wlan1 scan_results
回應如下圖
加一個網路配置
利用 ssid 和 paswword 來連線到一個已知的無線網路上,可以將下面的指令編寫成 wpa_cli_add_network.sh ,並且執行她,也可以直接使用,執行後取得的 network id 通常是一個 int 的數字,把她記起來,之後就可以透過這個 network id 來連接網路,和斷開網路
# 添加新的網絡配置
network_id=$(wpa_cli -i wlan1 add_network | awk '{print $NF}')
# 設置SSID和密碼
wpa_cli -i wlan1 set_network $network_id ssid '"你的SSID"'
wpa_cli -i wlan1 set_network $network_id psk '"你的密碼"'
# 啟用該網絡
wpa_cli -i wlan1 enable_network $network_id
# 保存配置
wpa_cli -i wlan1 save_config
連接網路以及斷開網路
# 重新連線
wpa_cli -i wlan1 reconnect
#斷開連線
wpa_cli -i wlan1 disconnect
刪除網路配置
wpa_cli -i wlan1 remove_network $network_id
檢查連線是否存在
得到的輸出通常如下
其中,檢查是否有連線成功,可以看 wpa_state 是否為 COMPLETED
檢查已經存在的網路設定
sudo wpa_cli -i wlan1 list_networks
輸出如下
可以用 flags CURRENT 來檢查現在是連線到那一個 network ,也可以取得 network id ,並且用他來連線
by Rain Chu | 4 月 17, 2024 | Nginx , NodeJS , SERVER , 程式
如果你有用 Nginx 的快取服務,無論是 fastcgi or proxy cache,都會遇到很難有一套真正好用的清除工具,這邊示範一套自己開發的清除工具,也支援多伺服器使用
安裝必要的套件
你先需要有nodejs ,沒有的人先去官網安裝下,安裝完畢的人,先建立一個目錄,並且輸入以下指令,安裝必要的套件
npm init -y
npm install express
建立一個 Node.js App
可以命名為 app.js,內容如下,會建立一個小型的伺服器,用來處理 http 的請求,並且刪除指定的目錄
const express = require('express');
const { exec } = require('child_process');
const fs = require('fs');
const app = express();
const PORT = 3000;
const logFile = 'application.log';
function log(message) {
const timestamp = new Date().toISOString();
fs.appendFileSync(logFile, `${timestamp} - ${message}\n`);
}
app.get('/delete-dir', (req, res) => {
let dir = req.query.dir;
if (!dir || /[^a-zA-Z0-9_\-\/]/.test(dir)) {
log('提供的路徑不合法!');
return res.status(400).send('提供的路徑不合法!');
}
const command = `sudo find /run/proxy_cache/${dir} -mindepth 1 -type d -exec rm -rf {} +`;
exec(command, (error, stdout, stderr) => {
if (error) {
log(`执行错误: ${error}`);
return res.status(500).send('删除子目錄失敗!');
}
log('子目錄删除成功!');
res.send('子目錄删除成功!');
});
});
app.listen(PORT, () => {
log(`服务器正在运行于 http://localhost:${PORT}`);
});
其中我把能刪除的資料定義在只有這個目錄下的才行 /run/proxy_cache/ ,避免權限過大問題
配置 sudo 權限
打開 sudoers 文件
加入指令,記得把 <username> 改成自己的名字,或是 www-data
<username> sudo find /run/proxy_cache/ -mindepth 1 -type d -exec rm -rf {} +
完成後的測試
可以利用 CURL 呼叫 API ,成功就會看到 “子目錄删除成功!” 的訊息
curl "http://localhost:3000/delete-dir?dir=cache_directory"
結論與注意事項
要記得別讓外部的人可以輕易地存取這項服務,防火牆要記得把port鎖好,執行權限要小心設定,這樣就可以搭配 Nginx Cache 使用,之後再來出對應的刪除功能。
開機時候自動執行
要讓 Node.js 應用在系統開機時由特定使用者(例如 www-data)啟動,需要配置一個 systemd 服務單元。在這個情況中,我們將創建一個服務單元文件來確保 Node.js 應用作為 www-data 使用者運行。
創建 systemd 服務文件
建立一個新的 systemd 服務文件。
sudo nano /etc/systemd/system/nodeapp.service
加入以下配置
[Unit]
Description=Node.js Web Application
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/path/to/your/app
ExecStart=/usr/bin/node /path/to/your/app/app.js
Restart=on-failure
[Install]
WantedBy=multi-user.target
參數意思如下
Description : 服務的描述。
After : 這個單元應該在網絡服務可用之後啟動。
User 和 Group : 指定運行此服務的使用者和組。
WorkingDirectory : 指定 Node.js 應用的工作目錄。
ExecStart : 指定啟動應用的命令。
Restart : 指定何時重新啟動服務,on-failure 表示只在程序異常退出時重啟。
啟用和啟動服務
重新加載 systemd 配置以讀取新的服務文件:
sudo systemctl daemon-reload
啟用剛創建的服務,使其在開機時自動啟動:
sudo systemctl enable nodeapp.service
啟動服務以檢查它是否運行正常:
sudo systemctl start nodeapp.service
檢查服務的狀態來確認一切正常:
sudo systemctl status nodeapp.service
by Rain Chu | 4 月 16, 2024 | Nginx , SERVER , web , wordpress , 程式
sudoers 檔案控制了使用者及群組在使用 sudo 指令時的權限。為了安全編輯這個檔案,應該使用 visudo 指令,因為它會檢查語法錯誤,避免創建一個無法使用的 sudoers 檔案。
更新 sudoers 檔案的步驟:
開啟終端機 :
開啟你的伺服器的命令行介面。
使用 visudo 編輯 sudoers 檔案 : 輸入以下指令以安全方式編輯 sudoers 檔案:
新增規則 :
在編輯器中,新增一條規則,允許 www-data 使用者無需密碼執行特定指令。
www-data ALL=(ALL) NOPASSWD: /usr/bin/rm -rf /path/to/nginx/cache/*
指令的意義是:
www-data :指定的使用者。
ALL=(ALL) :這表示 www-data 使用者可以從任何主機以任何使用者身份執行指令。
NOPASSWD :允許 www-data 使用者在執行指定的指令時不需要輸入密碼。
/usr/bin/rm -rf /path/to/nginx/cache/ *:指定 www-data 使用者無密碼可以執行的指令。
儲存並退出編輯器 :
如果你使用的是 nano,按 Ctrl+X 來退出,然後按 Y 鍵儲存更改,最後按 Enter 鍵確認檔案名稱。
測試配置 :
為了確保設定正確無誤,可以用 www-data 份執行指令:
sudo -u www-data sudo /usr/bin/rm -rf /path/to/nginx/cache/*
如果不需要密碼且指令執行成功,代表 sudoers 檔案配置正確。
安全注意事項:
最小權限原則 :只授權必要的最小權限,避免給予 www-data 使用者太廣泛的權限。
明確指令路徑 :使用完整的指令路徑(如 /usr/bin/rm),避免安全風險。
定期審計 :定期檢查 sudoers 檔案,確保所有條目仍然符合組織的安全政策和操作需要。
近期留言