#pip install -r requirements.txt langchain-openai==0.1.0 langserve[all]==0.1.0 fastapi==0.95.1 uvicorn==0.23.0 sse_starlette==1.5.2 python-multipart==0.0.6 langdetect==1.0.9 python-dotenv==1.0.0 詳細教學內容 這邊除了一個一個介紹模組和各種串接大型語言的library庫還有模組之外,最後會帶大家跑一個設計過的Langchain python 筆記本腳本檔(.ipynb檔 )讓大家在vscode環境種探索 Langchain的基礎知識,這一步很重要。最後目的如果是要接到比賽的應用,一定會要知道code怎麼建立。 1. 介紹如何使用語言模型 首先,我們來學習如何單獨使用語言模型。LangChain 支援多種語言模型,你可以根據需求選擇合適的模型進行應用,例如 OpenAI, Anthropic, Azure 等。 2. 設置開發環境 安裝所需的套件並配置環境: pip install -qU langchain-openai 使用 getpass 模組輸入 API 密鑰: import getpass import os os.environ["OPENAI_API_KEY"] = getpass.getpass() 引入所需的 LangChain 模組: from langchain_openai import ChatOpenAI model = ChatOpenAI(model="gpt-4") 3. 使用 LangChain 實現語言模型的直接調用 現在,我們可以直接調用語言模型。ChatOpenAI 是 LangChain 的 "Runnable" 實例,這意味著它提供了一個標準接口來與模型進行互動。我們可以將一組訊息傳遞給 .invoke 方法來調用模型。 from langchain_core.messages import HumanMessage, SystemMessage messages = [ SystemMessage(content="將以下內容從英語翻譯成義大利語"), HumanMessage(content="hi!"), ] model.invoke(messages) 這段程式碼將訊息傳遞給模型並得到翻譯結果。 4. 使用輸出解析器處理模型輸出 模型的回應通常包含額外的元數據,如果我們只需要文字回應,可以使用輸出解析器來簡化這個過程。 from langchain_core.output_parsers import StrOutputParser parser = StrOutputParser() result = model.invoke(messages) parser.invoke(result) 這樣就能直接獲得翻譯後的結果 'Ciao!'。 補充: StrOutputParser() 我們可以使用|運算子輕鬆創建鏈。在 LangChain 中使用|運算子將兩個元素組合在一起。 chain = model | parser chain.invoke(messages) 如果我們現在看一下 LangSmith,我們可以看到鏈有兩個步驟:首先調用語言模型,然後將結果傳遞給輸出解析器。我們可以看到LangSmith 跟蹤 5. 創建提示模板 現在,我們將消息清單直接傳遞到語言模型中。此消息清單來自何處?通常,它是由使用者輸入和應用程式邏輯的組合構建的。此應用程式邏輯通常採用原始使用者輸入,並將其轉換為準備傳遞給語言模型的消息清單。常見轉換包括添加系統消息或使用使用者輸入設置範本格式。 PromptTemplates 是 LangChain 中的一個概念,旨在協助進行這種轉換。它們接收原始使用者輸入並返回準備傳遞到語言模型的數據(提示)。 提示模板 (PromptTemplates) 可以幫助將原始的用戶輸入轉換成準備傳遞給語言模型的訊息列表。以下是一個範例: from langchain_core.prompts import ChatPromptTemplate #首先,讓我們創建一個字串,我們將將其格式化為系統消息: system_template = "將以下內容翻譯成 {language}:" #接下來,我們可以創建 PromptTemplate。這將是 system_template 的組合以及一個更簡單的範本,用於放置要翻譯的文本 prompt_template = ChatPromptTemplate.from_messages( [("system", system_template), ("user", "{text}")] ) #此提示範本的輸入是字典。我們可以單獨使用這個提示範本,看看它自己做了什麼 result = prompt_template.invoke({"language": "italian", "text": "hi"}) result.to_messages() 這樣,我們可以獲得準備傳遞給語言模型的訊息。 6. 使用 LCEL 鏈接多個模組 我們可以使用 | 運算符將模型和解析器等組件鏈接起來: #使用 LCEL 將元件連結在一起 chain = prompt_template | model | parser chain.invoke({"language": "italian", "text": "hi"}) 這段代碼將輸入傳遞給提示模板、模型和解析器,最終獲得翻譯結果 'Ciao!'。 7. 使用 LangServe 部署自己的服務應用 現在我們已經構建了一個應用程式,我們需要為它提供服務。這就是 LangServe 的用武之地。LangServe 幫助開發人員將 LangChain 鏈部署為 REST API。使用 LangChain 不需要使用 LangServe,但在本指南中,我們將展示如何使用 LangServe 部署應用程式。 雖然的1~6部分旨在在 Jupyter Notebook 或腳本中運行,但現在我們將退出該部分。我們將創建一個 Python 檔,然後從命令行與它進行交互。 我們可以使用 LangServe 將這個應用部署為 REST API。首先,安裝 LangServe: 為了為我們的應用程式創建伺服器,我們將創建一個serve.py檔。這將包含用於為應用程式提供服務的Logic。它由三部分組成: 1.我們上面剛剛構建的鏈的定義 2.我們的 FastAPI 應用程式 3.為鏈提供服務的路由的定義,該定義通過langserve.add_routes完成 pip install "langserve[all]" 創建一個 serve.py 文件,定義服務邏輯: #!/usr/bin/env python from fastapi import FastAPI from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_openai import ChatOpenAI from langserve import add_routes # 1. Create prompt template system_template = "將以下內容翻譯成 {language}:" prompt_template = ChatPromptTemplate.from_messages([ ('system', system_template), ('user', '{text}') ]) # 2. Create model model = ChatOpenAI() # 3. Create parser parser = StrOutputParser() # 4. Create chain chain = prompt_template | model | parser # 5. App definition app = FastAPI( title="LangChain 伺服器", version="1.0", description="使用 LangChain 的 Runnable 接口構建的簡單 API 伺服器", ) # 5. Adding chain route add_routes( app, chain, path="/chain", ) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="localhost", port=8000) 啟動伺服器後,處使應用將會在 http://localhost:8000 運行。 8. 實作範例與測試 部署成功後,你可以通過以下程式碼在客戶端與伺服器進行互動: from langserve import RemoteRunnable remote_chain = RemoteRunnable("http://localhost:8000/chain/") remote_chain.invoke({"language": "italian", "text": "hi"}) 這段程式碼將會返回翻譯結果 'Ciao'。 補充說明: "部署成功後,你可以通過以下程式碼在客戶端與伺服器進行互動" 的意思是,當您成功啟動伺服器後,可以在其他 Python 腳本或應用程式中與這個 API 伺服器進行互動。 具體來說,當您使用 uvicorn.run(app, host="localhost", port=8000) 成功啟動 FastAPI 伺服器後,該伺服器會在 http://localhost:8000/chain/ 上運行。這個伺服器提供了一個可以接受請求的 API 路徑 /chain/。 互動流程: 部署 FastAPI 伺服器:當您啟動伺服器後,它開始接收來自其他客戶端的請求。 客戶端互動:通過使用 RemoteRunnable 類(例如在另一個 Python 腳本或應用程式中)發送請求,這裡您提供伺服器的 URL http://localhost:8000/chain/。這樣就能通過客戶端程式碼與伺服器進行互動,發送翻譯請求並獲取結果。 客戶端互動範例解釋: from langserve import RemoteRunnable # 定義要連接的伺服器路徑 remote_chain = RemoteRunnable("http://localhost:8000/chain/") # 發送一個翻譯請求,將 "hi" 翻譯成義大利語 response = remote_chain.invoke({"language": "italian", "text": "hi"}) # 打印翻譯結果 print(response) # 預期結果: 'Ciao' 這段客戶端程式碼負責向已經運行的伺服器發送請求,伺服器會根據請求返回翻譯結果。這就是客戶端與伺服器之間的互動過程。因此,當伺服器在本地運行時,您可以在其他程式中使用這些方法來進行 API 呼叫,實現雙向通信。 總結來說,部署伺服器是啟動它以處理請求的過程,而客戶端程式碼則是實際向伺服器發送請求並接收回應的步驟。 補充建置langserve: 要多安裝兩個套件: 1. python-multipart 2. fastapi 3.sse_starlette #!/usr/bin/env python from fastapi import FastAPI, HTTPException, Form, Body from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_openai import ChatOpenAI from langserve import add_routes import logging from typing import List, Optional from langdetect import detect from dotenv import load_dotenv import os load_dotenv() openai_api_key=os.getenv('OPENAI_API_KEY', 'YourAPIKey') # 設置日誌記錄 logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) # 1. 創建多語言翻譯提示模板 system_template = "將以下內容翻譯成 {language}:" prompt_template = ChatPromptTemplate.from_messages([ ('system', system_template), ('user', '{text}') ]) # 2. 創建模型 model = ChatOpenAI() # 3. 創建解析器 parser = StrOutputParser() # 4. 創建翻譯鏈 translation_chain = prompt_template | model | parser # 5. App 定義 app = FastAPI( title="LangChain 增強版文字翻譯伺服器", version="2.0", description="使用 LangChain 的 Runnable 接口構建的多功能文字翻譯 API 伺服器", ) # 根路徑處理 @app.get("/") async def read_root(): return {"message": "Welcome to the LangChain Translation API. Use /translate/ to access the translation service."} # 6. 批量翻譯處理函數 async def handle_batch_translation(language: str, texts: List[str]) -> List[str]: results = [] for text in texts: try: logger.info(f"翻譯文本: {text} -> {language}") result = await translation_chain.arun({"language": language, "text": text}) logger.info(f"翻譯結果: {result}") results.append(result) except Exception as e: logger.error(f"翻譯過程中出現錯誤: {e}") raise HTTPException(status_code=500, detail=f"翻譯文本 '{text}' 時出現錯誤") return results # 7. 翻譯語言檢測 def detect_language(text: str) -> str: try: detected_language = detect(text) logger.info(f"檢測到的語言: {detected_language}") return detected_language except Exception as e: logger.error(f"語言檢測失敗: {e}") raise HTTPException(status_code=500, detail="語言檢測失敗") # 8. 翻譯路由 @app.post("/translate/") async def translate( language: str = Form(...), texts: Optional[List[str]] = Body(None), text: Optional[str] = Form(None), auto_detect: bool = Form(False) ): if texts: if auto_detect: detected_languages = [detect_language(t) for t in texts] return {"detected_languages": detected_languages, "translations": await handle_batch_translation(language, texts)} return await handle_batch_translation(language, texts) elif text: if auto_detect: detected_language = detect_language(text) return {"detected_language": detected_language, "translation": await handle_batch_translation(language, [text])} return {"translation": await handle_batch_translation(language, [text])} else: raise HTTPException(status_code=400, detail="必須提供至少一段文本進行翻譯") # 9. 添加鏈路由 add_routes( app, translation_chain, path="/chain", ) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="localhost", port=8000) 補充內容 : 測試方式 (也可以使用postman 測試請求有沒有正常) 單個文本翻譯: 使用 POST 請求來翻譯單個文本,確保正確返回翻譯結果。 curl -X POST "http://localhost:8000/translate/" -F "language=zh" -F "text=Hello" 多個文本翻譯: 使用 POST 請求來翻譯多個文本,確保每個文本都返回正確的翻譯結果。 curl -X POST "http://localhost:8000/translate/" -F "language=zh" -H "Content-Type: application/json" -d '{"texts": ["Hello", "How are you?"]}' 錯誤處理測試: 不提供 text 或 texts,檢查是否正確返回錯誤信息。 使用 LangServe 部署 LangChain 為 REST API 的完整教學 概述 LangServe 是一個強大的工具,專為開發者設計,用於將 LangChain 的 Runnable 接口和鏈部署為 REST API。這個庫與 FastAPI 深度整合,並使用 Pydantic 進行數據驗證。此外,它還提供了一個客戶端,可以用於調用部署在伺服器上的 Runnables。對於 JavaScript 開發者,LangChain.js 中還提供了相應的客戶端。 在這篇文章中,我將詳細介紹 LangServe 的主要功能、安裝步驟、以及如何快速啟動一個 LangServe 項目。你將學會如何利用 LangServe 部署一個強大的 API 伺服器,並且瞭解如何使用內建的功能來調試和擴展你的應用。 主要功能 自動推斷輸入和輸出模式:LangServe 能夠自動從 LangChain 對象中推斷輸入和輸出的 JSON 結構,並在每次 API 調用時強制執行,提供豐富的錯誤訊息。 API 文件頁面:自動生成 JSON Schema 和 Swagger 格式的 API 文件頁面,方便開發者瞭解 API 的結構和使用方法。 高效的端點: /invoke:執行單次請求的端點。 /batch:支持多請求批量處理。 /stream:支持流式數據處理,適合處理大量並發請求。 中間步驟流式日誌:使用 /stream_log 端點來流式傳輸你的鏈或代理的所有(或部分)中間步驟,方便調試。 流式事件支持:在 0.0.40 版本後,支持 /stream_events 端點,使得流式處理更加簡單,不需要解析 /stream_log 的輸出。 內建 Playground 頁面:在 /playground/ 路徑下提供一個內建的 Playground 頁面,支持流式輸出和中間步驟的展示。 LangSmith 追蹤支持:內建支持 LangSmith 追蹤功能,只需設置 API 密鑰即可使用。 客戶端 SDK:你可以使用客戶端 SDK 調用 LangServe 伺服器,讓其行為如同本地運行的 Runnable 一樣(或者直接調用 HTTP API)。 安裝 安裝 LangServe 你可以輕鬆地通過 pip 來安裝 LangServe,不論是用於伺服器端還是客戶端的開發。 pip install "langserve[all]" 如果你只需要伺服器端或客戶端,可以選擇安裝: pip install "langserve[client]" # 安裝客戶端代碼 pip install "langserve[server]" # 安裝伺服器代碼 安裝 LangChain CLI LangChain CLI 可以快速啟動一個 LangServe 項目。你可以使用以下命令來安裝或更新 LangChain CLI: pip install -U langchain-cli 快速入門:創建你的第一個 LangServe 應用 第一步:創建一個新的應用 使用 LangChain CLI 創建一個新的應用: langchain app new my-app 這將創建一個包含基本結構的應用,你可以在此基礎上進行開發。 第二步:定義你的 Runnable 打開 server.py 文件,並使用 add_routes 函數將你的 Runnable 添加到應用中。 from fastapi import FastAPI from langserve import add_routes from langchain_openai import ChatOpenAI app = FastAPI() # 定義並添加你的 Runnable model = ChatOpenAI(model="gpt-3.5-turbo") add_routes(app, model, path="/openai") 第三步:添加第三方包 如果需要使用第三方包(如 langchain-openai),你可以使用 Poetry 進行管理: poetry add langchain-openai 第四步:設置環境變量 設置必要的環境變量,例如 OpenAI 的 API Key: export OPENAI_API_KEY="sk-..." 第五步:啟動你的應用 使用 Poetry 啟動你的應用: poetry run langchain serve --port=8100 現在,你的 LangServe 伺服器應該已經運行起來了,可以使用瀏覽器或工具(如 Postman)訪問 http://localhost:8100/ 來查看服務狀態。 案例應用 下面是一個簡單的伺服器範例,它部署了 OpenAI 和 Anthropic 的聊天模型,並使用 Anthropic 模型來生成一個關於特定話題的笑話。 #!/usr/bin/env python from fastapi import FastAPI from langchain.prompts import ChatPromptTemplate from langchain.chat_models import ChatAnthropic, ChatOpenAI from langserve import add_routes app = FastAPI( title="LangChain Server", version="1.0", description="A simple API server using LangChain's Runnable interfaces", ) add_routes( app, ChatOpenAI(model="gpt-3.5-turbo-0125"), path="/openai", ) add_routes( app, ChatAnthropic(model="claude-3-haiku-20240307"), path="/anthropic", ) model = ChatAnthropic(model="claude-3-haiku-20240307") prompt = ChatPromptTemplate.from_template("tell me a joke about {topic}") add_routes( app, prompt | model, path="/joke", ) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="localhost", port=8000) 設置 CORS 中介軟體 如果你打算從瀏覽器調用這些端點,還需要設置 CORS 頭: from fastapi.middleware.cors import CORSMiddleware app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], expose_headers=["*"], ) 這樣可以保證你的 API 能夠被來自不同域名的請求訪問。 注意事項與限制 與 LangGraph 的兼容性 LangServe 主要用於部署簡單的 Runnables 和處理 LangChain 核心中的已知基本結構。如果你需要部署 LangGraph 應用,應該考慮使用 LangGraph Cloud(目前處於測試階段),這會更適合你的需求。 客戶端回調尚不支持 目前,LangServe 還不支持對伺服器端事件進行客戶端回調功能,這可能會在未來的版本中進一步完善。 總結 LangServe 是一個強大且靈活的工具,可以讓你輕鬆地將 LangChain 的功能部署為 REST API。在這篇教學中,我們介紹了 LangServe 的主要功能,如何安裝和配置 LangServe,以及如何創建一個基本的 API 伺服器。希望這篇文章能幫助你快速上手 LangServe,並在你的項目中發揮其強大的功能。 如果你有任何問題或建議,歡迎在評論區留言或聯繫我。Happy coding! summary: 在本教學中,我們學習了如何創建一個簡單的 LLM 應用,從語言模型的調用,到解析輸出、創建提示模板,再到使用 LCEL 鏈接模組,並最終部署為 REST API。 本課程只是入門但包含到了自己架設Langchain環境內建的LangServe服務,未來可以進一步學習如何擴展這些應用並應用於更複雜的場景,我們的目的就是從簡單但是完整的應用場景,透過創意想像一步一步推到較複雜甚至是比賽會應用到的場景。