最近生成式 AI 好像有點退燒,所以也少了一點研究,當然自己工作最近也忙了起來,比較沒時間。但最近隨著 Nvidia 股價噴出,多少還是要研究一點,不然貴森森的 RTX4090 就白花了。
之前研究的 GPT2 都是自動生成完整內容,於是想著怎樣在每句話產生前都可以看出其下一步選詞的方式呢?於是就有了下面的程式,可以每一步選詞或自動選詞。以下就是目前的成果
透過前文的內容,GPT 可以推測下一步該選哪個字的機率,用戶可以依機率來選擇要使用的詞,這樣就可以生成一段看似專業的文章,這應該就是基本的 GPT 原理吧。
網頁架設
要生成如上的影片,第一步其實就是要架設網站,看似突然轉到了一個不相干的領域,但這也是很真實的。如何結合 GPT 推論與 WEB,以產生具互動性的網頁,也是一門必需具備的知識。
下面就是一個基本的程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# -*- coding: utf-8 -*- # vim: expandtab from http.server import BaseHTTPRequestHandler, HTTPServer import logging from furl import furl import argparse def query_handler(furl_path): f = furl_path out="" for key in f.query.params: out += key+":" + f.args[key]+"<br>" return out class S(BaseHTTPRequestHandler): def _set_response(self): self.send_response(200) self.send_header('Content-type', 'text/html;charset=utf-8') self.send_header('Access-Control-Allow-Origin', 'http://192.168.2.188:8080') self.end_headers() def do_GET(self): global tokenizer global model logging.info("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers)) self._set_response() print("GET request for {} <BR>".format(self.path).encode('utf-8')) f = furl(self.path) out = query_handler(f) self.wfile.write(out.encode("utf-8")) def do_POST(self): content_length = int(self.headers['Content-Length']) # <--- Gets the size of data post_data = self.rfile.read(content_length) # <--- Gets the data itself logging.info("POST request,\nPath: %s\nHeaders:\n%s\n\nBody:\n%s\n", str(self.path), str(self.headers), post_data.decode('utf-8')) self._set_response() self.wfile.write("POST request for {}".format(self.path).encode('utf-8')) def run(server_class=HTTPServer, handler_class=S, port=8080): logging.basicConfig(level=logging.INFO) server_address = ('', port) httpd = server_class(server_address, handler_class) logging.info('Starting httpd...\n') try: httpd.serve_forever() except KeyboardInterrupt: pass httpd.server_close() logging.info('Stopping httpd...\n') parser = argparse.ArgumentParser() parser.add_argument('--port', default=8080, type=int, required=False, help='Listen Port') args = parser.parse_args() run(port=args.port) |
這個範例展式了如何用 Python 架設一個 web server ,並處理 GET 的訊息。這邊需要安裝的 module 如下
1 |
pip3 install furl |
這邊展示的範例僅是一個 GET (do_GET)的動作,把所有的參數給列出來。當判斷完參數後,使用者就可以把 HTML 網頁給輸出了。這邊還只有用到 GET 的動作,POST 動作暫時還不需要。GET 的動作,會導入到 query_handler() ,用戶可以依據參數來做事情,這也是後面要新增的部份,本文就只先介紹基本的網頁架設。
當將來在使用的時候,就可以依據用戶從GET指定的 model 和前文的內容,來推論出接下來可能的字語機率,也就可以達成開頭影片的功能了。