Hướng dẫn: Tạo Chatbot đơn giản với Python và API của ChatGPT và FastAPI
Giải ngố AI
Danh sách bài học
Hướng dẫn: Tạo Chatbot đơn giản với Python và API của ChatGPT và FastAPI
�� Hướng dẫn: Tạo API Chatbot với FastAPI và Dữ liệu Tùy Chỉnh
💡 Bạn có muốn tạo một chatbot thông minh có khả năng trả lời dựa trên dữ liệu của riêng mình?
Hôm nay, mình sẽ hướng dẫn bạn cách sử dụng FastAPI để xây dựng một API chatbot đơn giản, hoạt động dựa trên dữ liệu từ file. Hệ thống sẽ trả lời câu hỏi nếu tìm thấy sự phù hợp, hoặc yêu cầu người dùng cung cấp thêm thông tin cụ thể hơn nếu không có câu trả lời phù hợp.
1. Chuẩn bị dữ liệu
Bạn cần tạo một file data.txt
với nội dung như sau:
Câu hỏi 1|Câu trả lời 1
Câu hỏi 2|Câu trả lời 2
Làm thế nào để học Python?|Bạn có thể bắt đầu với các khóa học cơ bản trên YouTube hoặc tài liệu tại python.org.
Python có khó học không?|Python là ngôn ngữ lập trình dễ học, đặc biệt phù hợp cho người mới bắt đầu.
File này sẽ được chatbot sử dụng để trả lời câu hỏi của người dùng.
2. Cài đặt môi trường
Hãy cài đặt Python và thư viện cần thiết. Mở terminal và chạy lệnh sau:
pip install fastapi pydantic scikit-learn numpy openai uvicorn
3. Tạo mã Python cho API
Sau đây là mã Python đầy đủ để tạo API chatbot:
from fastapi import FastAPI
from pydantic import BaseModel
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
import openai
# Đặt API Key của OpenAI
openai.api_key = "YOU_API_KEY"
app = FastAPI()
# Đọc dữ liệu từ file
def load_data(file_path):
data = {}
with open(file_path, "r", encoding="utf-8") as f:
for line in f:
if "|" in line:
question, answer = line.strip().split("|", 1)
data[question] = answer
return data
data = load_data("data.txt")
# Hàm tạo embedding
def get_embedding(text):
response = openai.Embedding.create(
model="text-embedding-ada-002",
input=text
)
return response['data'][0]['embedding']
# Tạo embedding cho tất cả câu hỏi trong dữ liệu
def generate_embeddings(data):
embeddings = {}
for question in data.keys():
embeddings[question] = get_embedding(question)
return embeddings
# Tạo embedding cho dữ liệu ban đầu
embeddings = generate_embeddings(data)
# Định nghĩa mô hình yêu cầu từ người dùng
class UserQuestion(BaseModel):
user_question: str
# Tìm câu hỏi tương đồng dựa trên embedding
def find_closest_questions(user_question, data, embeddings, top_n=10):
user_embedding = get_embedding(user_question)
question_similarities = [
(question, cosine_similarity([user_embedding], [embedding])[0][0])
for question, embedding in embeddings.items()
]
# Sắp xếp câu hỏi theo điểm tương đồng
question_similarities = sorted(question_similarities, key=lambda x: x[1], reverse=True)
return [q[0] for q in question_similarities[:top_n]]
# So sánh câu hỏi của người dùng với dữ liệu
def find_best_match(user_question, data, embeddings):
top_questions = find_closest_questions(user_question, data, embeddings)
prompt = f"""
Dưới đây là danh sách câu hỏi:
{', '.join(top_questions)}
Câu hỏi của tôi: "{user_question}"
Hãy trả về câu hỏi nào trong danh sách trên có câu hỏi gần giống nhất, mang ý nghĩa tương tự với câu hỏi của tôi. Cấu trúc trả ra là duy nhất chuỗi câu hỏi. Nếu không có câu hỏi nào tương đồng, trả về "Không tìm thấy câu hỏi tương đồng".
"""
response = openai.ChatCompletion.create(
model="gpt-4-turbo",
messages=[
{"role": "system", "content": "Bạn là một trợ lý chuyên giúp tìm kiếm câu hỏi phù hợp nhất."},
{"role": "user", "content": prompt}
],
matokens=100,
temperature=0
)
return response.choices[0].message["content"].strip()
# Định nghĩa mô hình dữ liệu cho Body yêu cầu
class UserQuestion(BaseModel):
user_question: str
@app.post("/chat/")
def chatbot(request: UserQuestion):
user_question = request.user_question
best_match = find_best_match(user_question, data, embeddings)
if best_match == "Không tìm thấy câu hỏi tương đồng":
return {"question": user_question, "answer": "Mình có thể cho em thông tin cụ thể hơn không ạ?"}
else:
return {"question": user_question, "answer": data.get(best_match, "Mình chưa có câu trả lời cho câu hỏi này.")}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
4. Chạy API
Lưu mã trên vào file app.py
và chạy hoặc F5.
Truy cập Swagger UI để kiểm tra và thử nghiệm API.
5. Ví dụ sử dụng API
Sau khi API chạy, bạn có thể thử các câu hỏi:
- Câu hỏi:
Làm thế nào để học Python?
- Kết quả:
Bạn có thể bắt đầu với các khóa học cơ bản trên YouTube hoặc tài liệu tại python.org.
Nếu câu hỏi không tìm thấy trong dữ liệu:
- Câu hỏi:
Câu hỏi không có trong dữ liệu
- Kết quả:
Mình có thể cho em thông tin cụ thể hơn không ạ?
6. Ứng dụng thực tế
- Hỗ trợ khách hàng: Trả lời các câu hỏi thường gặp.
- Trợ lý cá nhân: Tự động hóa các tác vụ hỏi đáp.
- Học tập: Xây dựng chatbot trả lời dựa trên tài liệu học tập.
7. Nâng cấp thêm
- Quản lý dữ liệu: Thêm endpoint để thêm, sửa, xóa câu hỏi trong file dữ liệu.
- Sử dụng cơ sở dữ liệu: Chuyển từ file sang SQLite hoặc PostgreSQL để quản lý dữ liệu tốt hơn.
- Triển khai API: Đưa API lên Heroku hoặc AWS để sử dụng từ xa.
💬 Hãy thử ngay và chia sẻ kết quả của bạn! 🚀
Tải xuống
Tài liệu
Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Hướng dẫn: Tạo Chatbot đơn giản với Python và API của ChatGPT và FastAPI dưới dạng file PDF trong link bên dưới.
Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com
Đừng quên like và share để ủng hộ Kteam và tác giả nhé!
Thảo luận
Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.
Nội dung bài viết
Tác giả/Dịch giả
Nhà sáng lập Howkteam.com, KQuiz.vn & tác giả các khóa học C#, Auto, Unity3D, Python....
Với mong muốn mang đến kiến thức chất lượng, miễn phí cho mọi người, với tâm huyết phá bỏ rào cản kiến thức từ việc giáo dục thu phí. Tôi đã cùng đội ngũ Kteam đã lập nên trang website này để thế giới phẳng hơn.
Hãy cùng chúng tôi lan tỏa kiến thức đến cộng đồng!
Khóa học
Series này sẽ tập trung vào ứng dụng AI, train AI bằng ngôn ngữ lập trình python. Có thể dùng google colab để tăng tốc train.
Very wonderful!