paint-brush
Sử dụng Courier và GPT2 để tạo trích dẫn tạo động lực trong ngàytừ tác giả@courier
559 lượt đọc
559 lượt đọc

Sử dụng Courier và GPT2 để tạo trích dẫn tạo động lực trong ngày

từ tác giả Courier8m2023/02/13
Read on Terminal Reader

dài quá đọc không nổi

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. Thay vì mã hóa cứng 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 ra một câu trích dẫn theo yêu cầu. Chúng tôi sẽ sử dụng thư viện Hugging Face để tải và cung cấp mô hình ML sẽ tạo báo giá cho chúng tôi.
featured image - Sử dụng Courier và GPT2 để tạo trích dẫn tạo động lực trong ngày
Courier HackerNoon profile picture
0-item


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ẻ!

Hướng dẫn

Phần 1: Sử dụng AI để tạo trích dẫn động lực

OpenGPT2 và các mô hình ngôn ngữ

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ư ôm mặt làm cho việc sử dụng mô hình này trong ứng dụng của chúng tôi trở nên rất dễ dàng.

ôm mặt

Chúng tôi sẽ sử dụng ôm mặt thư viện để tải và phục vụ mô hình ML sẽ tạo báo giá cho chúng tôi. Hugging Face giúp dễ dàng sử dụng các mô hình máy biến áp (trong đó có GPT2) trong các dự án của chúng tôi mà không cần bất kỳ kiến thức nào về ML hoặc AI. Như đã đề cập trước đó, GPT2 là một mô hình ngôn ngữ có mục đích chung, có nghĩa là nó rất tốt trong việc dự đoán văn bản chung cho một chuỗi đầu vào. Trong trường hợp của chúng tôi, chúng tôi cần một mô hình phù hợp hơn để tạo báo giá. Để làm điều đó, chúng ta có hai lựa chọn:

  1. Chúng tôi có thể tinh chỉnh mô hình GPT2 bằng cách sử dụng văn bản của riêng mình mà chúng tôi sẽ cần một bộ dữ liệu tốt về các trích dẫn.
  2. Hoặc chúng ta có thể tìm một mô hình đã có sẵn đã được tinh chỉnh với một số trích dẫn.

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 - https://huggingface.co/nandinib1999/quote-generator

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'}]

Xây dựng API để phục vụ mô hình

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.

  1. Tải mô hình mỗi khi chúng tôi muốn chạy tập lệnh để gửi tập lệnh.
  2. Tạo một API hoặc dịch vụ phục vụ mô hình GPT2 này để tạo báo giá cho chúng tôi theo yêu cầu.

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.

Phần 2: Xây dựng Trình tạo báo giá

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 chuyển phát nhanh . Nhưng chúng ta đang đùa với ai, không ai đọc văn bản nữa! Chúng ta có thể làm cho điều này trở nên thú vị bằng cách sử dụng một hình ảnh đẹp và đặt câu trích dẫn của chúng ta lên đó để làm cho nó trông giống như một tấm áp phích.

tạo báo giá

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"]

Đang tải xuống hình nền

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 https://source.unsplash.com/random/800×800/?nature trong trình duyệt của chúng tôi trả về một hình ảnh tự nhiên đẹp.

Để 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

Tạo hình ảnh với trích dẫn

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

  1. Văn bản sẽ được đặt trên hình ảnh như thế nào?
  2. Điều gì về gói văn bản?
  3. Văn bản nên có màu gì để có thể nhìn thấy trên hình nền?
  4. Làm cách nào để chúng tôi thực hiện việc này đối với hình ảnh có chiều rộng và chiều cao khác nhau?

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

Đang tải hình ảnh lên

Đố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


Bước 3: Tích hợp với Courier

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.

Bắt đầu bằng cách tạo một tài khoản.

Tạo mẫu trong Courier

gửi tin nhắn

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_TOKENTEMPLATE_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 Cài đặt và ID mẫu có thể được tìm thấy trong thiết kế mẫu cài đặt. Và thế là xong!

kết luận

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ử

  • Hình nền tốt hơn: Sử dụng thuật ngữ từ trích dẫn được tạo để tìm kiếm hình ảnh?
  • Màu nền tốt hơn cho văn bản: Sử dụng màu tốt hơn cho văn bản. Một ý tưởng hay là sử dụng màu bổ sung từ màu chính của hình ảnh. Bạn có thể sử dụng phân cụm k-means để tìm ra điều đó.
  • Thêm nhiều kênh hơn: Mở rộng điều này cho các tin nhắn trên ứng dụng nhắn tin và sms!

Giới thiệu về tác giả

Prakhar là một kỹ sư phần mềm cấp cao tại Google, nơi anh ấy làm việc về xây dựng các công cụ dành cho nhà phát triển. Anh ấy là một nhà phát triển mã nguồn mở đầy đam mê và thích chơi ghita khi rảnh rỗi.

đường dẫn nhanh

🔗 Tài liệu chuyển phát nhanh

🔗 ôm mặt

🔗 API nhanh

🔗 API không hiển thị