FastAPI x OpenAI | 建立API & 整合ChatGPT
目錄
- 安裝及運行FastAPI
- 建立GET和POST端點
- 傳遞查詢和主體參數
- 使用Python請求庫訪問API端點
- 使用Python識別模型進行數據驗證
- 將Chat GPT集成到FastAPI
- 使用Swagger文檔測試和說明API
- 生成產品描述
- 構建Chat GPT後端
- 常見問題解答
安裝及運行FastAPI
在本節中,我們將介紹如何安裝和運行FastAPI。我們將使用VS Code作為IDE並使用虛擬環境。首先,我們將創建一個虛擬環境,用於隔離我們的項目依賴。
- 打開命令提示符或終端並導航到項目文件夾。
- 創建一個虛擬環境:
python -m venv fast-env
- 激活虛擬環境:
.\fast-env\Scripts\activate
- 安裝FastAPI和uvicorn(Web伺服器):
pip install fastapi uvicorn
- 在VS Code中打開專案文件夾。
現在,我們已經準備好開始使用FastAPI。
建立GET和POST端點
在本節中,我們將學習如何在FastAPI中創建GET和POST端點。我們將使用示例端點來呈現如何處理請求和返回響應。
GET端點
首先,讓我們創建一個GET端點,用於處理根路徑請求:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
在這個例子中,我們創建了一個GET端點,將根路徑("/")的請求映射到名為read_root
的函數。在該函數中,我們返回了一個JSON對象{"Hello": "World"}
作為響應。
POST端點
現在,我們來創建一個POST端點,用於處理在/items/{item_id}
路徑下的請求:
from fastapi import FastAPI
app = FastAPI()
@app.post("/items/{item_id}")
def create_item(item_id: int, item: Item):
return {"item_id": item_id, "item": item}
在這個例子中,我們創建了一個POST端點,將/items/{item_id}
路徑的請求映射到名為create_item
的函數。該函數接收兩個參數:item_id
(整數類型)和item
(Item模型的實例)。我們將這兩個參數作為JSON對象返回。
傳遞查詢和主體參數
在本節中,我們將學習如何在FastAPI中傳遞查詢參數和主體參數。我們將修改上一節的示例,以傳遞額外的參數。
傳遞查詢參數
讓我們修改GET端點,以接受名為name
的查詢參數:
from fastapi import FastAPI
app = FastAPI()
@app.get("/greet")
def greet(name: str):
return f"Hello, {name}!"
在這個例子中,我們在函數的參數中聲明了name
參數。FastAPI將自動解析URL中的查詢參數並將其傳遞給greet
函數。我們將返回一個包含name
的歡迎消息。
傳遞主體參數
現在,讓我們修改POST端點,以接受一個用戶的註冊信息:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class User(BaseModel):
name: str
email: str
@app.post("/register")
def register(user: User):
return {"message": "User registered successfully", "user": user}
在這個例子中,我們定義了一個名為User
的Pydantic模型,用於描述用戶的名字和電子郵件。在register
函數中,我們接受一個名為user
的User
模型實例作為主體參數。我們將返回一個成功註冊的消息和用戶信息。
使用Python請求庫訪問API端點
在本節中,我們將學習如何使用Python請求庫(如requests)訪問FastAPI的API端點。我們將修改上一節的示例,並使用requests庫發起請求。
首先,讓我們安裝requests庫:
pip install requests
接下來,讓我們修改之前的GET和POST端點並添加一些新功能:
from fastapi import FastAPI
from pydantic import BaseModel
import requests
app = FastAPI()
class Item(BaseModel):
name: str
price: float
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.post("/items")
def create_item(item: Item):
return {"item": item}
@app.post("/prediction")
def make_prediction(item: Item):
response = requests.post("https://api.example.com/predict", json=item.dict())
return response.json()
在這個例子中,我們添加了一個新的POST端點/prediction
,其中我們使用requests庫向外部API發送了一個POST請求。我們使用item.Dict()
將Item
模型轉換為字典並作為請求的主體。
現在,我們可以使用requests庫來測試我們的API端點:
import requests
# 發送GET請求到根路徑
response = requests.get("http://localhost:8000/")
print(response.json()) # 輸出:{"Hello": "World"}
# 發送POST請求到/items
data = {"name": "Apple", "price": 1.00}
response = requests.post("http://localhost:8000/items", json=data)
print(response.json()) # 輸出:{"item": {"name": "Apple", "price": 1.0}}
# 發送POST請求到/prediction
data = {"name": "Apple", "price": 1.00}
response = requests.post("http://localhost:8000/prediction", json=data)
print(response.json()) # 輸出:預測結果
使用requests庫,我們可以輕鬆地發送GET和POST請求並處理API的響應。
使用Python識別模型進行數據驗證
在本節中,我們將學習如何使用Python識別模型進行數據驗證。我們將修改上一節的示例,並使用識別模型驗證POST請求的數據。
首先,讓我們安裝識別庫:
pip install pydantic
接下來,讓我們修改之前的POST端點並添加數據驗證:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
@app.post("/items")
def create_item(item: Item):
return {"item": item}
在這個例子中,我們使用Pydantic庫定義了一個名為Item
的識別模型。在create_item
函數中,我們接受一個名為item
的Item
模型實例作為主體參數。如果請求的數據無效(不符合模型的結構),FastAPI將返回相應的錯誤信息。
現在,當我們發送POST請求並提供正確的數據時,我們應該收到一個成功的響應:
import requests
data = {"name": "Apple", "price": 1.00}
response = requests.post("http://localhost:8000/items", json=data)
print(response.json()) # 輸出:{"item": {"name": "Apple", "price": 1.0}}
使用識別模型進行數據驗證可以幫助我們確保我們接收的數據符合預期的結構和類型。
將Chat GPT集成到FastAPI
在本節中,我們將學習如何將Chat GPT集成到FastAPI。我們將使用Chat GPT API來生成產品描述。
首先,讓我們安裝所需的庫:
pip install OpenAI pydantic
接下來,我們將創建一個名為Product
的識別模型,用於描述產品的名稱和特點:
from pydantic import BaseModel
class Product(BaseModel):
name: str
features: str
現在,讓我們創建一個POST端點,用於接收產品信息並生成產品描述:
from fastapi import FastAPI
from openai import ChatCompletion
app = FastAPI()
chat_gpt = ChatCompletion()
@app.post("/product-description")
def generate_product_description(product: Product):
instruction = "Generate a multi-paragraph rich text description for the product."
message = [{"role": "system", "content": instruction}]
message.append({"role": "user", "content": f"What are the key features of {product.name}?"})
chat_input = {
"messages": message,
"model": "gpt3.5-turbo",
"temperature": 0.6,
"max_tokens": 100,
"n": 1
}
response = chat_gpt.create_chat_completion(chat_input)
description = response["choices"][0]["message"]["content"]
return {"description": description}
在這個例子中,我們創建了一個名為generate_product_description
的POST端點。在該函數中,我們首先建立了與Chat GPT的對話輸入,該輸入包含用戶的指令(instruction)和產品特點的詢問(user message)。我們使用ChatCompletion類來向OpenAI Chat GPT API發送請求,並獲取生成的產品描述。
現在,當我們發送POST請求來創建產品描述時,我們應該收到描述作為響應:
import requests
data = {"name": "Apple iPhone 12", "features": "Dual-camera system, A14 Bionic chip"}
response = requests.post("http://localhost:8000/product-description", json=data)
print(response.json()) # 輸出:{"description": "產品描述"}
使用Chat GPT,我們可以動態生成產品描述,這對於電子商務網站和產品展示頁面非常有用。
使用Swagger文檔測試和說明API
在本節中,我們將學習如何使用Swagger文檔來測試和說明我們的API。FastAPI具有內置的Swagger UI,可以自動生成API的交互式文檔。
首先,讓我們安裝相關的庫:
pip install fastapi uvicorn
接下來,我們將修改之前的代碼並添加一些新功能:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.post("/items")
def create_item(item: Item):
return {"item": item}
現在,讓我們運行我們的FastAPI應用程序:
uvicorn main:app --reload
當應用程序運行時,您可以在本地計算機上訪問Swagger文檔。打開瀏覽器,導航到地址http://localhost:8000/docs
。
您應該能夠在Swagger UI中看到您的API端點和模型。您可以使用Swagger UI來測試API並查看相應的文檔。
生成產品描述
在本節中,我們將使用Chat GPT API生成產品描述。我們將創建一個POST端點,用於接收產品信息並生成描述。
首先,讓我們安裝所需的庫:
pip install openai pydantic
接下來,讓我們修改我們的代碼:
from fastapi import FastAPI
from openai import ChatCompletion
from pydantic import BaseModel
app = FastAPI()
chat_gpt = ChatCompletion()
class Product(BaseModel):
name: str
features: str
@app.post("/product-description")
def generate_product_description(product: Product):
instruction = "Generate a multi-paragraph rich text description for the product."
message = [{"role": "system", "content": instruction}]
message.append({"role": "user", "content": f"What are the key features of {product.name}?"})
chat_input = {
"messages": message,
"model": "gpt3.5-turbo",
"temperature": 0.6,
"max_tokens": 100,
"n": 1
}
response = chat_gpt.create_chat_completion(chat_input)
description = response["choices"][0]["message"]["content"]
return {"description": description}
現在,當我們發送POST請求並提供產品信息時,我們應該收到一個生成的描述:
import requests
data = {"name": "Apple iPhone 12", "features": "Dual-camera system, A14 Bionic chip"}
response = requests.post("http://localhost:8000/product-description", json=data)
print(response.json()) # 輸出:{"description": "產品描述"}
使用Chat GPT,我們可以動態生成產品描述,這對於電子商務網站和產品展示頁面非常有用。
構建Chat GPT後端
在本節中,我們將構建Chat GPT的後端,以實現將對話記錄傳遞給Chat GPT並保持會話狀態。我們將創建一個POST端點,用於接收用戶發送的消息並返回Chat GPT的回覆。
首先,讓我們安裝所需的庫:
pip install openai pydantic
接下來,讓我們修改我們的代碼:
from fastapi import FastAPI
from openai import ChatCompletion
from pydantic import BaseModel
app = FastAPI()
chat_gpt = ChatCompletion()
class Message(BaseModel):
content: str
role: str
class Session(BaseModel):
messages: List[Message]
@app.post("/chat")
def chat(session: Session):
chat_input = {
"messages": session.messages,
"model": "gpt3.5-turbo",
"temperature": 0.6,
"max_tokens": 100,
"n": 1
}
response = chat_gpt.create_chat_completion(chat_input)
reply = response["choices"][0]["message"]["content"]
return {"reply": reply}
在這個例子中,我們創建了一個名為chat
的POST端點。該端點接收一個名為session
的Session
模型實例作為主體參數。該Session
模型包含一個用戶發送的消息列表。
使用Chat GPT API,我們將用戶發送的消息傳遞給Chat GPT並獲取回覆。最後,我們將回覆作為響應返回。
現在,當我們發送POST請求並提供一個會話的消息時,我們應該收到Chat GPT的回覆:
import requests
data = {
"messages": [
{"role": "user", "content": "Hello"},
{"role": "assistant", "content": "How can I help you?"},
{"role": "user", "content": "I need assistance with a product"}
]
}
response = requests.post("http://localhost:8000/chat", json=data)
print(response.json()) # 輸出:{"reply": "Chat GPT回覆"}
構建Chat GPT的後端,我們可以實現將對話記錄傳遞給Chat GPT並保持會話狀態。
常見問題解答
Q: FastAPI支持哪些HTTP方法?
A: FastAPI支持常見的HTTP方法,例如GET、POST、PUT、DELETE等。您可以通過@app.get
、@app.post
等裝飾器將方法映射到相應的URL路徑。
Q: FastAPI可以使用任何Python web伺服器嗎?
A: 是的,FastAPI可以與任何兼容的Python web伺服器一起使用。您可以使用內置的uvicorn伺服器,也可以將FastAPI應用程序嵌入到其他伺服器中。
Q: 我可以在FastAPI中處理身分驗證嗎?
A: 是的,FastAPI具有身分驗證和授權的內置支持。您可以使用OAuth 2.0、JWT等進行身分驗證。
Q: 在FastAPI中如何處理文件上傳?
A: FastAPI支持文件上傳。您可以通過將文件包含在Form
類型的主體參數中,使用upload_file
方法處理文件上傳。
結語
在本文中,我們學習了如何使用FastAPI創建具有GET和POST端點的API。我們學習了如何傳遞查詢參數和主體參數,以及如何使用Python請求庫訪問API端點。我們還學習了如何使用識別模型進行數據驗證,並將Chat GPT集成到FastAPI。
FastAPI是一個強大而靈活的框架,可用於構建高性能的API。它具有優秀的文件和測試支持,並兼容現代Python的異步編程模型。
與傳統的Python web框架相比,FastAPI具有更好的性能和效率。它適用於構建Web API、微服務和WebSocket應用程序。
該頁面包含的內容是由FastAPI官方文檔和OpenAI官方文檔提供的。請查閱這些文檔獲取更多詳細信息和指南。
希望您喜歡這篇文章,並能夠運用所學知識創建出令人印象深刻的FastAPI應用程序!如果您有任何問題,請隨時提問。感謝您的閱讀!