Khóa học
Trong hướng dẫn thực hành này, tôi sẽ dùng mô hình DeepSeek-R1 để xây dựng một trợ lý giải câu đố toán học tích hợp EasyOCR và Gradio.
Tôi sẽ giải thích từng bước cách xây dựng một ứng dụng web hoạt động đầy đủ, có khả năng giải nhiều dạng câu đố toán học và tạo lời giải hữu ích nhờ khả năng suy luận xuất sắc của mô hình DeepSeek R1.
Nếu bạn chỉ muốn có cái nhìn tổng quan về DeepSeek-R1, tôi khuyến nghị xem tổng quan DeepSeek-R1 này. Để fine-tune mô hình, tôi khuyến nghị bài hướng dẫn về fine-tuning DeepSeek-R1.
Dự án Demo DeepSeek-R1: Tổng quan
Để xây dựng trợ lý giải đố, chúng ta sẽ đi qua các bước sau:
- Thiết lập các điều kiện tiên quyết cần thiết.
- Khởi tạo mô hình với cấu hình tối ưu.
- Định nghĩa các chức năng cốt lõi, tận dụng khả năng instruct của mô hình.
- Tích hợp các thành phần vào giao diện Gradio thân thiện để tương tác dễ dàng.
Bước 1: Điều kiện tiên quyết
Trước khi bắt tay vào triển khai, hãy đảm bảo bạn đã cài các công cụ và thư viện sau:
- Python 3.8+
- PyTorch: Để xử lý mô hình học sâu hiệu quả.
- EasyOCR: Mô-đun Python để trích xuất văn bản từ ảnh.
- Gradio: Tạo giao diện web thân thiện với người dùng.
Chạy các lệnh sau để cài đặt các phụ thuộc cần thiết:
!pip install torch gradio pillow easyocr -q
Sau khi cài xong các phụ thuộc trên, chạy các lệnh import sau:
Import torch
from PIL import Image
import easyocr
import requests
import json
import gradio as gr
Bước 2: Thiết lập API DeepSeek-R1
Đoạn mã sau minh họa cách tương tác với API DeepSeek để nhận phản hồi dựa trên lời nhắc của người dùng. Lưu ý rằng API của DeepSeek tương thích với định dạng của OpenAI và dùng một URL gốc cho các yêu cầu API.
Bạn có thể truyền trực tiếp API key (không khuyến nghị vì lý do quyền riêng tư), hoặc nếu dùng Google Colab như tôi, bạn có thể lưu API key bằng tính năng Secrets. Ngoài ra, bạn có thể dùng biến môi trường.
# DeepSeek API configuration
DEEPSEEK_API_URL = "https://api.deepseek.com/v1/chat/completions"
# If you're using Colab and storing your key in the Secrets tab:
from google.colab import userdata
API_KEY = userdata.get('SECRET_KEY')
# If you are running this code elsewhere then, replace 'YOUR_API_KEY' with your actual DeepSeek API key. Uncomment the following line of code.
#API_KEY = 'YOUR_API_KEY'
Tại thời điểm xuất bản bài viết này, dịch vụ của DeepSeek đang chịu tải cao và hiệu năng bị suy giảm—tôi cũng gặp nhiều khó khăn khi chạy mã cho dự án này. Vui lòng kiểm tra trang trạng thái của DeepSeek trước khi thử chạy mã trong dự án này.
Bước 3: Thiết kế các tính năng cốt lõi
Sau khi thiết lập API, chúng ta có thể triển khai các tính năng mã. Ở phần này, chúng ta sẽ xử lý một ảnh chứa câu đố logic, trích xuất văn bản câu đố bằng OCR, tinh chỉnh văn bản, rồi gửi tới API DeepSeek để giải. Hãy xem mã trước, sau đó tôi sẽ giải thích.
reader = easyocr.Reader(['en'])
def solve_puzzle(image):
"""Extracts the puzzle from the image and sends it to DeepSeek for solving."""
try:
# 1. Save the uploaded image temporarily; EasyOCR uses file paths
image_path = "uploaded_image.png"
image.save(image_path)
# 2. Extract text from the image using EasyOCR
results = reader.readtext(image_path)
extracted_text = " ".join([res[1] for res in results])
# Standardize the text to avoid misinterpretation of "??" as "2?"
extracted_text = extracted_text.replace('??', '?')
if "?" not in extracted_text:
extracted_text += "?"
print("Extracted Text:", extracted_text) # Debugging output
# 3. Refine the extracted text to standardize expressions
refined_text = extracted_text.replace('x', '*').replace('X', '*').replace('=', ' = ').strip()
print("Refined Text:", refined_text) # Debugging output
# 4. Compose the user message with concise instructions
puzzle_prompt = (
f"You are an AI specialized in solving puzzles. Analyze the following, identify hidden patterns or rules, and provide the missing value with step-by-step reasoning in text format. Do not return an answer in Latex."
f"\nPuzzle:\n{refined_text}\n"
"Format your response strictly as follows:\n"
"1. **Given Equation**:\n - (original equations)\n"
"2. **Pattern Identified**:\n (explain the hidden logic)\n"
"3. **Step-by-step Calculation**:\n - For (input values):\n (calculation and result)\n"
"4. **Final Answer**:\n (Answer = X)"
)
messages = [
{"role": "user", "content": puzzle_prompt}
]
# 5. Optimized API request for faster response
data = {
"model": "deepseek-reasoner",
"messages": messages,
"temperature": 0,
"max_tokens": 100
}
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
# 6. Send the request to DeepSeek with a timeout
response = requests.post(DEEPSEEK_API_URL, headers=headers, json=data, timeout=15)
# 7. Check the result
if response.status_code == 200:
try:
json_resp = response.json()
return json_resp.get("choices", [{}])[0].get("message", {}).get("content", "Error: No response content.").strip()
except json.JSONDecodeError:
return "Error: Invalid JSON response from DeepSeek API."
else:
return f"Error: DeepSeek API failed with status code {response.status_code}, Response: {response.text}"
except requests.exceptions.Timeout:
return "Error: DeepSeek API request timed out. Please try again."
except Exception as e:
return f"Error: {str(e)}"
Hàm solve_puzzle() xử lý một ảnh chứa câu đố logic và giải nó bằng OCR và mô hình R1. Quy trình gồm các bước:
- Khởi tạo EasyOCR: Bắt đầu bằng cách khởi tạo trình đọc EasyOCR cho tiếng Anh.
- Xử lý ảnh: Ảnh tải lên được lưu tạm thời và xử lý bằng EasyOCR để trích xuất văn bản.
- Tinh chỉnh văn bản: Chuẩn hóa văn bản trích xuất để đảm bảo tính nhất quán và chính xác.
- Soạn truy vấn: Tạo truy vấn có cấu trúc, bao gồm văn bản câu đố đã tinh chỉnh và hướng dẫn cụ thể để giải.
- Tương tác API: Gửi truy vấn tới API DeepSeek để phân tích và giải câu đố. Hãy đảm bảo dùng mô hình
deepseek-reasonerđể sử dụng DeepSeek-R1. Nếu muốn dùng DeepSeek-V3, hãy dùngdeepseek-chat. Và luôn lưu ý về giá, hãy kiểm tra trang giá để có thông tin mới nhất. - Xử lý phản hồi: Phản hồi từ API được xử lý để trích xuất và trả về lời giải hoặc thông báo lỗi phù hợp.
- Xử lý lỗi: Hàm cũng xử lý các sự cố như quá thời gian chờ hoặc ngoại lệ bất ngờ, đảm bảo vận hành ổn định.
Chuỗi xử lý này kết hợp OCR để trích xuất văn bản và API DeepSeek để giải đố một cách thông minh.
Bước 4: Tạo giao diện Gradio
Gradio cho phép chúng ta tạo giao diện web tương tác cho ứng dụng. Đoạn mã sau tạo một giao diện Gradio thân thiện cho hàm solve_puzzle(). Giao diện Gradio nhận đầu vào của người dùng và chuyển đến mô hình để xử lý.
interface = gr.Interface(
fn=solve_puzzle,
inputs=gr.Image(type="pil"),
outputs="text",
title="Logic Puzzle Solver with EasyOCR & DeepSeek",
description="Upload an image of a logic puzzle, and the model will solve it for you."
)
interface.launch(debug=True)
Thiết lập trên gồm ba thành phần:
- Đầu vào: Một thành phần
gr.Imagenơi người dùng có thể tải ảnh lên. - Đầu ra: Thành phần
textđể hiển thị câu trả lời từ DeepSeek-R1. - Giao diện: Hàm gr.Interface() liên kết đầu vào và đầu ra, khởi chạy một ứng dụng web để người dùng tương tác.
Bước 5: Kiểm thử ứng dụng
Hãy kiểm thử ứng dụng với một câu đố về toán và logic.
Nếu bạn nhìn hàng đầu tiên, sẽ thấy 1 + 4 = 5, và có thể nghĩ đây chỉ là phép cộng đơn giản. Nhưng ở hàng thứ hai ta có 2 + 5 = 12, rồi 3 + 6 = 21. Bạn có thể tìm ra quy luật và giải 8 + 11 = ?
Nếu bạn nhìn ở phía bên phải của giao diện Gradio, bạn sẽ thấy ứng dụng Puzzle Solver đã xác định được mẫu quy luật:

Kết luận
Trong hướng dẫn này, chúng ta đã xây dựng một trợ lý giải câu đố toán học dùng DeepSeek R1 kết hợp với OCR và Gradio để giải các bài toán đố. Để cập nhật những điều mới nhất trong AI, tôi khuyến nghị các blog sau:
Tôi là Chuyên gia Google Developers trong lĩnh vực ML (Gen AI), Chuyên gia Kaggle 3x và Đại sứ Women Techmakers với hơn 3 năm kinh nghiệm trong ngành công nghệ. Tôi đồng sáng lập một startup công nghệ y tế vào năm 2020 và hiện đang theo học thạc sĩ khoa học máy tính tại Georgia Tech, chuyên sâu về học máy.
