
如何快速實現REST API集成以優化業務流程
等待數據庫實例啟動成功后,進入實例詳情頁,創建數據庫用戶。
用戶名密碼自行填寫,帳號類型選擇高權限帳號。
創建數據庫。
授權帳號選擇剛才創建的用戶,其他默認即可。
進入數據庫鏈接菜單,找到內網地址,后續在函數中會配置。
進入白名單與安全組菜單,點擊白名單設置頁簽。
點擊右側修改,根據實際需求添加白名單IP或者網段。在POC時,可以添加0.0.0.0/0,白名單IP段設置為0.0.0.0/0意味著對公網開放,請謹慎使用。若為了測試連接設置,測試后請立即修改。
非結構化數據持久化
LobeChat支持上傳文件(圖片,視頻,PDF,MD等),上傳的文件都會保存在配置的OSS中。
打開阿里云對象存儲OSS控制臺[4],點擊左側Bucket列表菜單,點擊創建Bucket按鈕。
按需填寫Bucket名稱,其他配置保持默認即可。然后點擊完成創建。
創建好Bucket后,點擊Bucket名稱進入Bucket概覽頁。
在概覽頁中可以看到該Bucket的地域級Endpoint和Bucket級Endpoint。在下文中配置LobeChat環境變時會用到。
點擊左側權限控制/阻止公共訪問菜單,開啟阻止公共訪問。
點擊左側權限控制/讀寫權限菜單,保證Bucket ACL 為私有。
部署LobeChat
該章節介紹如何將 LobeChat 數據庫版部署到阿里云函數計算。
雖然LobeChat是開源項目,但是如果沒有非常企業定制化的功能需要自行修改的話,還是建議直接使用Dockerhub上的鏡像進行部署。所以需要將鏡像推送到ACR,以便后續和函數計算FC做聯動。打開阿里云鏡像管理服務ACR控制臺[5],創建容器鏡像服務實例,生產中建議創建企業版實例,在該最佳實踐中,可以創建個人版。
點擊創建個人版。
創建完個人版實例后,設置登錄密碼。
創建鏡像倉庫的命名空間。進入命名空間菜單,點擊創建命名空間按鈕。
按實際需求輸入命名空間名稱。
命名空間全局唯一,如果提示命名空間已被占用,請重新填寫,請替換新的名稱。
進入鏡像倉庫菜單,點擊創建鏡像倉庫。
代碼源選擇本地倉庫,然后點擊創建鏡像倉庫按鈕。
LobeChat的鏡像[6]托管在Dockerhub上,所以在國內無法訪問,這里可以使用自己的方式Pull鏡像。
docker pull lobehub/lobe-chat-database
建議:可以購買一臺Region的ECS,安裝Docker,將LobeChat鏡像拉取下來,然后在推送到ACR。
推送鏡像到ACR
進入到上文步驟中創建的鏡像倉庫詳情頁,可以看到將鏡像推送到ACR的命令。
依次執行以下3行命令。
docker login --username=[阿里云帳號郵箱] registry.cn-beijing.aliyuncs.com
docker tag [LobeChat鏡像的ImageId] registry.cn-beijing.aliyuncs.com/[命名空間]/[倉庫名稱]:[鏡像版本號]
docker push registry.cn-beijing.aliyuncs.com/[命名空間]/[倉庫名稱]:[鏡像版本號]
打開函數計算控制臺[7],點擊創建函數。
函數創建方式選擇Web函數。
函數名稱按需填寫,這里填寫lobechat-database-fc。
其他配置項暫時保持默認,然后點擊下方創建按鈕。
點擊函數列表中的lobechat-database-fc函數,進入函數詳情頁。
點擊配置頁簽,點擊左側環境變量菜單,點擊編輯,添加該LobeChat函數需要的環境變量。
選擇使用JSON格式編輯。
{
"DATABASE_URL": "postgres連接地址",
"KEY_VAULTS_SECRET": "隨機的 32 位字符串",
"NEXT_PUBLIC_S3_DOMAIN": "OSS Bucket Endpoint",
"NEXT_PUBLIC_SERVICE_MODE": "server",
"S3_ACCESS_KEY_ID": "阿里云帳號AK",
"S3_BUCKET": "OSS Bucket名稱",
"S3_ENDPOINT": "OSS 地域級 Endpoint",
"S3_REGION": "阿里云地域ID",
"S3_SECRET_ACCESS_KEY": "阿里云帳號SK"
}
點擊配置頁簽,點擊左側網絡菜單。
點擊編輯,添加VPC,VS信息。配置的VPC需要和上文中創建的PostgreSQL所在的VPC保持一致,這樣LobeChat函數就可以通過內網地址訪問PostgreSQL,提高網絡訪問效率和穩定性。
因為是函數計算中的LobeChat服務訪問PG數據庫,所以可以將LobeChat函數的交換機網段配置到PG的白名單中。這樣就可以去掉設置PG白名單中配置的0.0.0.0/0,增加安全性。
增加訪問LLM Chat應用的健壯性
在生產級項目中,路由策略,流量訪問控制策略等是必不可少的,所以這里會引入阿里云云原生API網關來增強訪問LLM Chat應用的健壯性。創建云原生API網關
打開云原生API網關控制臺[10]。
點擊創建實例按鈕,創建云原生API網關實例。
云原生API網關地址
點擊云原生API網關實例ID,進入概覽頁。
在概覽頁的基本信息中可以可以看到云原生API網關的入口地址。下文中多處需要用到。配置網關自定義域名
進入左側域名菜單。
點擊創建域名按鈕,添加域名。
根據實際情況選擇HTTP或HTTPS,填寫已經備案的域名。如果沒有備案的域名,在測試場景下可以填寫 。域名解析(可選步驟)
如果在配置網關自定義域名時配置了 。則不需要參考這一步。
打開域名服務商控制臺,進入域名管理頁面,對域名進行解析。這里以阿里云域名管理為例,打開域名管理控制臺[11]進入域名列表,找到在配置網關自定義域名中配置的域名。
點擊右側解析,進入域名解析頁面。
點擊添加記錄按鈕。
創建好云原生API網關后,點擊網關名稱,進入網關詳情頁。
點擊左側路由菜單,選擇服務頁簽。
點擊創建服務按鈕,添加服務。
創建成功后,可以在列表中看到LobeChat函數,并且等到健康檢查狀態變為健康。
點擊路由頁簽,進入路由管理頁面,選擇普通路由。
點擊創建路由按鈕。
其他設置保持默認,然后點擊保存并發布。
如果希望增加路由健壯性,可以針對路由設置各種策略,比如流控策略。在路由列表頁中點擊路由名稱進入路由詳情頁。
然后進入策略配置頁簽,可以按需進行配置。具體可參見云原生API網關策略文檔[12]。
用戶身份管理
LobeChat 集成了 next-auth,一個靈活且強大的身份驗證庫,支持多種身份驗證方式,包括 OAuth、郵件登錄、憑證登錄等。通過 next-auth,可以輕松實現以下功能:
LobeChat用戶身份管理目前的缺陷
Next Auth 實現用戶身份管理
目前支持的身份驗證服務有:
本文以Auth0和Github為例。
注冊并登錄 Auth0[13],點擊左側導航欄的「Applications」,切換到應用管理界面,點擊右上角「Create Application」以創建應用。
填寫你想向組織用戶顯示的應用名稱,可選擇任意應用類型,點擊「Create」。
創建成功后,點擊相應的應用,進入應用詳情頁,切換到「Settings」標簽頁,就可以看到相應的配置信息。
在應用配置頁面中,還需要配置 Allowed Callback URLs,在此處填寫:
http(s)://[your-domain]/api/auth/callback/auth0
只需要變更[your-domain]部分:
點擊左側導航欄的「Users Management」,進入用戶管理界面,可以為你的組織新建用戶,用以登錄 LobeChat。
參照LobeChat函數環境變量設置中找到配置LobeChat函數環境變量的地方,增加以下環境變量信息。
{
"DATABASE_URL": "postgres連接地址",
"KEY_VAULTS_SECRET": "隨機的 32 位字符串",
"NEXT_PUBLIC_S3_DOMAIN": "OSS Bucket Endpoint",
"NEXT_PUBLIC_SERVICE_MODE": "server",
"S3_ACCESS_KEY_ID": "阿里云帳號AK",
"S3_BUCKET": "OSS Bucket名稱",
"S3_ENDPOINT": "OSS 地域級 Endpoint",
"S3_REGION": "阿里云地域ID",
"S3_SECRET_ACCESS_KEY": "阿里云帳號SK"
"NEXT_AUTH_SECRET": "隨機的 32 位字符串",
"NEXT_AUTH_SSO_PROVIDERS": "auth0",
"AUTH0_CLIENT_ID": "Auth0 應用程序的 Client ID",
"AUTH0_CLIENT_SECRET": "Auth0 應用程序的 Client Secret",
"AUTH0_ISSUER": "Auth0 應用程序的 Domain",
"ACCESS_CODE": "添加訪問此服務的密碼,你可以設置一個足夠長的隨機密碼以 “禁用” 訪問碼授權",
"NEXTAUTH_URL": "http(s)://your-domain.com/api/auth"
}
Auth0 和其他任務的單點登錄可以參考LobeChat的文檔[14]。
點擊這里[15]創建一個新的 Github App。填寫 Github App name、Homepage URL、Callbak URL。
設置讀取郵件地址權限。
設置公開訪問還是僅自己訪問。
點擊「Create Github App」。創建成功后,點擊「Generate a new client secret」創建客戶端 Secret。
創建成功后,將客戶端 ID 和客戶端 Secret 保存下來。
參照LobeChat函數環境變量設置中找到配置LobeChat函數環境變量的地方,增加以下環境變量信息。
{
"DATABASE_URL": "postgres連接地址",
"KEY_VAULTS_SECRET": "隨機的 32 位字符串",
"NEXT_PUBLIC_S3_DOMAIN": "OSS Bucket Endpoint",
"NEXT_PUBLIC_SERVICE_MODE": "server",
"S3_ACCESS_KEY_ID": "阿里云帳號AK",
"S3_BUCKET": "OSS Bucket名稱",
"S3_ENDPOINT": "OSS 地域級 Endpoint",
"S3_REGION": "阿里云地域ID",
"S3_SECRET_ACCESS_KEY": "阿里云帳號SK",
"NEXT_AUTH_SECRET": "隨機的 32 位字符串",
"NEXT_AUTH_SSO_PROVIDERS": "github",
"GITHUB_CLIENT_ID": "Gihub App ClientID",
"GITHUB_CLIENT_SECRET": "Github App Client Secret",
"NEXTAUTH_URL": "http(s)://your-domain.com/api/auth"
}
其他服務的認證管理接入方式
其他服務的認證管理接入方式可以參考LobeChat的文檔[16]。
訪問LobeChat
訪問配置網關自定義域名中配置的域名或者云原生API網關地址,便可打開LobeChat。
點擊左上角的圖標。
點擊登錄/注冊。
會跳轉到Auth0的登錄界面。輸入你在新增Auth0用戶中創建的用戶名密碼進行登錄。
登錄成功后可以看到帳號信息。
查看LobeChat表結構
進入創建PostgreSQL數據庫中創建的PG數據庫詳情頁。
點擊右上角登錄數據庫按鈕,進入DMS控制臺。
可以看到當第一訪問LobeChat時,會初始化若干表,有興趣的同學可以自行查看表結構。
這兩類后端服務都會使用阿里云函數計算實現,可以提供更細粒度資源規格(0.05C 128MB),更高性能(穩定支撐100w-150w QPS),更高彈性效率(百毫秒拉起實例)的CPU算力,也可以提供多種穩定的GPU資源。同時還自帶完善的可觀測,灰度發布等能力。使傳統應用,AI應用的后端服務更健壯。
和LLM交互的服務(Ollama)
阿里云函數計算提供了構建Ollama服務的應用模板,可以快速創建出包含GPU算力的Ollama服務。
打開函數計算控制臺,進入應用菜單。
點擊創建應用按鈕。選擇通過模板創建應用,選擇人工智能頁簽,可以看到Ollama應用。
點擊詳情按鈕,可以查看該應用的詳細信息。
點擊立即創建按鈕可以快速開始創建應用。
建議選擇其中一個模型,因為初始的模型是打在鏡像里的,如果選擇多個模型集成,會使鏡像過大,影響Ollama函數彈性速度。后續可以掛載NAS,使用Ollama的API下載其他模型。
設置完后點擊左下方創建應用按鈕,開始創建應用。
等待片刻后,便可以看到Ollama應用部署成功。
點擊左下角Ollama函數,可以進入Ollama函數詳情頁面。
進入Ollama函數詳情頁面,點擊配置頁簽,進入左側觸發器菜單。可以看到公網訪問地址和內網訪問地址。
點擊左側存儲菜單,點擊NAS 文件系統右側的編輯按鈕。
進入配置頁簽,點擊左側環境變量菜單,點擊環境變量右側的編輯按鈕。
增加如下2個環境變量。
可以使用Postman或者終端訪問Ollama API[17]下載模型,模型會直接下載到NAS中。
curl http://Ollama服務地址/api/pull -d '{
"name": "llama3.1:8b"
}'
自定義Agent服務
打開函數計算控制臺,進入左側函數菜單。
點擊創建函數按鈕。
其他設置保持默認。代碼示例
點擊代碼頁簽,在WebIDE中,刪除app.py中的默認代碼,將以下代碼復制進app.py中。
from flask import Flask, Response
from flask import request
import re
import time
import json
REQUEST_ID_HEADER = 'x-fc-request-id'
app = Flask(__name__)
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE'])
def hello_world(path):
rid = request.headers.get(REQUEST_ID_HEADER)
print("FC Invoke Start RequestId: " + rid)
data = request.stream.read()
print("Path: " + path)
print("Data: " + str(data))
data_obj = json.loads(data)
model = data_obj.get('model')
if model == 'custom-agent':
print("FC Invoke End RequestId: " + rid)
response_message = "您好,我是用阿里云函數計算實現的自定義Agent,你可以在該函數中實現更多的業務邏輯。"
return Response(generate_response(response_message), mimetype='text/event-stream')
else:
return "success"
def generate_response(prompt):
# 模擬生成響應的過程,這里可以替換為你的實際邏輯
response_template = {
"id": "from-cache",
"choices": [
{
"index": 0,
"delta": {
"role": "assistant",
"content": "%s"
},
"finish_reason": "stop"
}
],
"model": "gpt-4o",
"object": "chat.completion",
"usage": {
"prompt_tokens": 0,
"completion_tokens": 0,
"total_tokens": 0
}
}
words = re.split(r'[,,;;:]', prompt)
for index, word in enumerate(words):
response_template["choices"][0]["delta"]["content"] = word
response_template["choices"][0]["index"] = index
yield f"data: {json.dumps(response_template)}\n\n"
time.sleep(0.3) # 模擬延遲
if __name__ == '__main__':
app.run(host='0.0.0.0',port=9000)
點擊配置頁簽,進入左側觸發器菜單,可以看到公網訪問地址和內網訪問地址。
點擊右上角會話設置。
點擊左側語言模型菜單。
可以看到LobeChat已經集成了幾乎市面上所有主流的LLM服務,所有可以實現在一個Web Chat中可以和多家LLM進行交互,也就是不同的會話可以配置不同的模型,靈活性非常高。
本文開頭說過,該最佳實踐主要實現Ollama服務托管的模型和自定義的Agent,所以在語言模型設置頁面,我們主要會設置OpenAI(用于配置自定義Agent)和Ollama。
開打OpenAI開關,配置自定義Agent信息:
關閉模型配置窗口,回到主窗口,點擊上方模型,切換到custom-agent,也就相當于會請求到自定義Agent服務中。
進行聊天對話,可以看到會響應自定義Agent中寫死的內容。
配置Ollama服務
回到主窗口,在上方可以切換到llama3.1:8b模型。
在同一個窗口再次進行對話。
配置聊天助手
進入聊天助手對話界面,點擊右上角的聊天助手設置。
設置聊天助手基本信息,比如頭像,頭像顏色,聊天助手名稱,聊天助手描述等。
設置聊天助手的角色設定。
在聊天偏好中可以設置用戶輸入預處理等信息。
設置聊天助手的模型,這里選擇llama3.1:8b。
回到翻譯助手聊天窗口,可以讓其進行翻譯。
創建自定義Agent助手
同理,可以創建和自定義Agent交互的聊天助手。
相關鏈接:
[1] LobeChathttps://github.com/lobehub/lobe-chat
[2] 阿里云函數計算(FC)https://help.aliyun.com/zh/functioncompute/product-overview/what-is-function-compute
[3] 阿里云RDS控制臺https://yaochi.console.aliyun.com/rds/rdsList/cn-beijing
[4]?阿里云對象存儲OSS控制臺https://oss.console.aliyun.com/bucket
[5]?阿里云鏡像管理服務ACR控制臺https://cr.console.aliyun.com/cn-beijing/instances
[6] LobeChat的鏡像https://hub.docker.com/r/lobehub/lobe-chat-database
[7] 函數計算控制臺https://fcnext.console.aliyun.com/cn-beijing/functions
[8] 阿里云地域ID說明https://help.aliyun.com/zh/drp/support/region-ids
[9] AK管理控制臺https://ram.console.aliyun.com/manage/ak
[10] 云原生API網關控制臺https://apigw.console.aliyun.com/#/cn-beijing/gateway
[11] 域名管理控制臺https://dc.console.aliyun.com/next/index
[12]?云原生API網關策略文檔https://help.aliyun.com/zh/api-gateway/cloud-native-api-gateway/user-guide/routing-policy/
[13] Auth0https://manage.auth0.com/dashboard
[14] LobeChat的文檔https://lobehub.com/zh/docs/self-hosting/advanced/auth/next-auth/auth0
[15] 這里https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fsettings%2Fapps%2Fnew
[16]?LobeChat的文檔https://lobehub.com/zh/docs/self-hosting/advanced/auth
[17] Ollama APIhttps://github.com/ollama/ollama/blob/main/docs/api.md
[18]?Ollama支持的模型https://ollama.com/library
文章轉自微信公眾號@Serverless