Những câu trích dẫn tạo động lực đã khá thịnh hành vào thời mà chuyển tiếp MMS và email còn phổ biến. Tôi nhớ bố mẹ tôi đã chuyển tiếp cho tôi vào đầu mỗi buổi sáng. Tua nhanh đến ngày hôm nay, nếu may mắn, bạn là thành viên của một nhóm chuyển tiếp nào đó trên ứng dụng nhắn tin mà bạn chọn (Whatsapp, Telegram, v.v.).
Lấy cảm hứng từ cùng một ý tưởng, hôm nay chúng tôi sẽ xây dựng một dịch vụ gửi cho bạn bè và gia đình của chúng tôi một câu trích dẫn tạo động lực trong ngày do AI tạo ra. Thay vì mã hóa cứng một danh sách các câu trích dẫn tạo động lực, chúng tôi sẽ sử dụng mô hình học máy để tạo một câu trích dẫn theo yêu cầu để chúng tôi không bao giờ hết các câu trích dẫn để chia sẻ!
Mô hình OpenAI GPT-2 được đề xuất trong Language Models are Unsupervised Multitask Learners của Alec Radford, Jeffrey Wu, Rewon Child, David Luan, Dario Amodei và Ilya Sutskever. Đó là một trình biến đổi nhân quả được đào tạo trước bằng cách sử dụng mô hình ngôn ngữ trên một kho văn bản rất lớn ~40 GB dữ liệu văn bản.
Để đơn giản hóa điều này, ở cấp độ cao OpenAI GPT2 là một mô hình ngôn ngữ lớn đã được đào tạo trên lượng dữ liệu khổng lồ. Mô hình này có thể được sử dụng để dự đoán mã thông báo tiếp theo trong một chuỗi nhất định.
Nếu điều đó nghe có vẻ quá phức tạp, đừng lo lắng, bạn không cần biết bất kỳ Máy học hoặc AI nào để theo dõi dự án này. Các thư viện như
Chúng tôi sẽ sử dụng
May mắn thay, trong trường hợp của chúng tôi, có một mô hình tinh chỉnh đã được đào tạo trên tập dữ liệu báo giá 500k -
Với Hugging Face, việc sử dụng mô hình này dễ dàng như tạo mã thông báo
from transformers import AutoTokenizer, AutoModelWithLMHead, pipeline tokenizer = AutoTokenizer.from_pretrained("nandinib1999/quote-generator")
sau đó xây dựng một mô hình từ mô hình được đào tạo trước
model = AutoModelWithLMHead.from_pretrained("nandinib1999/quote-generator")
và cuối cùng, xây dựng trình tạo mà chúng ta có thể sử dụng để tạo báo giá
generator = pipeline("text-generation", model=model, tokenizer=tokenizer) # use a starting prompt generator("Keep an open mind and") [{'generated_text': 'Keep an open mind and a deep love for others'}]
Bây giờ chúng tôi có một cách để tạo báo giá cho chúng tôi, chúng tôi phải suy nghĩ về cách chúng tôi có thể sử dụng điều này trong ứng dụng của mình. Có nhiều cách để xây dựng cái này.
Một điểm cộng quan trọng của tùy chọn thứ hai là khi mô hình được tải, API có thể phản hồi chúng tôi nhanh chóng và cũng có thể được sử dụng trong các ứng dụng khác. FWIW, tùy chọn đầu tiên cũng là một cách tiếp cận hoàn toàn hợp lệ.
Chúng tôi có thể sử dụng __ API nhanh __ để tạo API phục vụ nhanh. Đây là những gì nó trông giống như
# in file api.py from pydantic import BaseModel from fastapi import FastAPI, HTTPException from transformers import AutoTokenizer, AutoModelWithLMHead, pipeline ## create the pipeline tokenizer = AutoTokenizer.from_pretrained("nandinib1999/quote-generator") model = AutoModelWithLMHead.from_pretrained("nandinib1999/quote-generator") generator = pipeline("text-generation", model=model, tokenizer=tokenizer) app = FastAPI() class QuoteRequest(BaseModel): text: str class QuoteResponse(BaseModel): text: str ### Serves the Model API to generate quote @app.post("/generate", response_model=QuoteResponse) async def generate(request: QuoteRequest): resp = generator(request.text) if not resp[0] and not resp[0]["generated_text"]: raise HTTPException(status_code=500, detail='Error in generation') return QuoteResponse(text=resp[0]["generated_text"])
Hãy thử nghiệm nó
$ uvicorn api:app INFO: Started server process [40767] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
Bây giờ chúng ta có thể bắt đầu gửi yêu cầu đến /generate
điểm cuối sẽ tạo báo giá cho chúng ta.
Bây giờ chúng tôi có một cách để tạo báo giá theo yêu cầu, chúng tôi có thể dừng tại đây và bắt đầu gửi báo giá này qua
Với API của chúng tôi, giờ đây chúng tôi có thể thực hiện các thao tác sau để tạo báo giá
from random import choice # feel free to add more starting prompts for more variety canned_seeds = ["Always remember to", "Start today with", "It is okay to"] seed = choice(canned_seeds) resp = requests.post('http://127.0.0.1:8000/generate', data=json.dumps({"text": seed})) return resp.json()["text"]
Thử thách đầu tiên là có được một hình nền đẹp cho câu trích dẫn của chúng ta. Để làm được điều đó, chúng tôi sẽ sử dụng API Unsplash cung cấp một điểm cuối đẹp mắt để trả về một hình ảnh ngẫu nhiên phù hợp với một truy vấn. Khai mạc
Để giữ cho mọi thứ thú vị, chúng tôi có thể sử dụng các cụm từ truy vấn khác nhau, chẳng hạn như sao, v.v. Đây là mã để tải xuống hình nền của chúng tôi trông như thế nào -
from random import choice image_backgdrops = ['nature', 'stars', 'mountains', 'landscape'] backdrop = choice(image_backdrops) response = requests.get("https://source.unsplash.com/random/800×800/?"+ backdrop, stream=True) # write the output the img.png on our filesystem with open('img.png', 'wb') as out_file: shutil.copyfileobj(response.raw, out_file) del response
Ok, bây giờ chúng ta đã có hình nền và một câu trích dẫn, nghĩa là chúng ta có thể làm việc để lắp ráp hình ảnh cuối cùng sẽ được gửi đến người nhận. Ở cấp độ cao, chúng tôi muốn đặt một số văn bản trên một hình ảnh nhưng ngay cả nhiệm vụ đơn giản này cũng có thể là một thách thức. Để bắt đầu, có một số câu hỏi để chúng tôi trả lời
Câu trả lời cho một số câu hỏi này phức tạp hơn những câu hỏi khác. Để đơn giản, chúng ta sẽ đặt văn bản ở giữa và thực hiện một số thao tác ngắt dòng để văn bản trông đẹp mắt. Cuối cùng, bây giờ chúng ta sẽ sử dụng văn bản màu sáng. Đối với tất cả thao tác hình ảnh, chúng tôi sẽ sử dụng Thư viện hình ảnh Python (PIL) để giúp chúng tôi thực hiện việc này dễ dàng.
# use the image we downloaded in the above step img = Image.open("img.png") width, height = img.size image_editable = ImageDraw.Draw(img) # wrap text lines = textwrap.wrap(text, width=40) # get the line count and generate a starting offset on y-axis line_count = len(lines) y_offset = height/2 - (line_count/2 * title_font.getbbox(lines[0])[3]) # for each line of text, we generate a (x,y) to calculate the positioning for line in lines: (_, _, line_w, line_h) = title_font.getbbox(line) x = (width - line_w)/2 image_editable.text((x,y_offset), line, (237, 230, 211), font=title_font) y_offset += line_h img.save("result.jpg") print("generated " + filename) return filename
Điều này tạo ra hình ảnh cuối cùng được gọi là result.jpg
Đối với bước áp chót, chúng tôi cần tải hình ảnh lên để có thể sử dụng hình ảnh đó với Courier. Trong trường hợp này, tôi đang sử dụng Firebase Storage nhưng bạn có thể thoải mái sử dụng bất cứ thứ gì bạn thích.
import firebase_admin from firebase_admin import credentials from firebase_admin import storage cred = credentials.Certificate('serviceaccount.json') firebase_admin.initialize_app(cred, {...}) bucket = storage.bucket() blob = bucket.blob(filename) blob.upload_from_filename(filename) blob.make_public() return blob.public_url
Cuối cùng, chúng ta đã có mọi thứ cần thiết để bắt đầu gửi những câu trích dẫn tuyệt vời đến bạn bè và gia đình. Chúng ta có thể sử dụng Courier để tạo một mẫu email đẹp mắt.
Gửi tin nhắn với Courier thật dễ dàng. Mặc dù Courier có SDK riêng có thể giúp việc tích hợp trở nên dễ dàng, nhưng tôi thích sử dụng điểm cuối API của nó hơn để mọi thứ trở nên đơn giản. Với AUTH_TOKEN
và TEMPLATE_ID
của tôi trong tay, chúng tôi có thể sử dụng đoạn mã sau để gửi hình ảnh của mình
import requests headers = { "Accept": "application/json", "Content-Type": "application/json", "Authorization": "Bearer {}".format(os.environ['COURIER_AUTH_TOKEN']) } message={ "to": { "email": os.environ["COURIER_RECIPIENT"] }, "data": { "date": datetime.today().strftime("%B %d, %Y"), "img": image_url ## this is image url we generated earlier }, "routing": { "method": "single", "channels": [ "email" ] }, "template": os.environ["COURIER_TEMPLATE"] } requests.post("https://api.courier.com/send", json={"message": message}, headers=headers)
Khóa API có thể được tìm thấy trong
Hướng dẫn này cho thấy việc bắt đầu với máy học & Chuyển phát nhanh dễ dàng như thế nào.
Nếu bạn muốn tiếp tục và cải thiện dự án này, đây là một số ý tưởng thú vị để thử
🔗