###### tags: `F3762`
# F4762(F3762 改版) 寫作事項
## 程式碼注意事項
1. 本書單純程式碼示範都使用 Colab, 每章一個 colab 筆記本檔, 設計好 Colab 檔後請儲存副本到 flagtec@gmail.com 的帳號內, 該章開頭提供 Colab 檔分享檢視的短網址讓讀者可以開啟後儲存副本到他們的帳戶內。檔名都以 GPT4Dev_chxx 格式命名 (注意沒有福檔名 .ipynb)。
3. 需要公開網址運作的範例都以 Replit 為開發平台, 請使用以下連結加入 flagtech 團隊:
https://replit.com/teams/join/islteupscvegwqwmtpudguohjddgcrgc-flagtech
範例專案請設定 owner 為 flagtech 團隊, 在內文中直接提供專案網址給讀者開啟後 fork 到他自己的帳戶。專案名稱都以 GTP4Dev_xxxxx 命名。
4. Replit 中請使用 Github Light Theme, 以便在需要抓圖時都是白底, 避免書上印出一大片黑色底的圖片, 也方便讀者閱讀:

1. 書中完整程式碼前面要加上行號, 解說時可以直接以行號讓讀者知道你在講哪一行?要幫程式加上行號, 我有撰寫 word 巨集, 可在這裡[下載檔案](https://1drv.ms/w/s!Ak4g-w1Hg7LqgcYhyy7xTopbGInJgg?e=mgSv67), 只要開啟該檔, 在稿件中選取要加上行號的程式碼區段, 執行『**檢視/巨集**』:

如上執行 `lineNumber` 巨集, 會先詢問起始行號:

然後就會自動加上行號:

它會自動計算最後所需位數, 必要時會補空白, 例如:
```
1: @app.route("/", methods=['POST'])
2: def callback():
3: # get X-Line-Signature header value
4: signature = request.headers['X-Line-Signature']
5:
6: # get request body as text
7: body = request.get_data(as_text=True)
8: app.logger.info("Request body: " + body)
9:
10: # handle webhook body
11: try:
12: handler.handle(body, signature)
13: except InvalidSignatureError:
14: print("電子簽章錯誤, 請檢查密鑰/權杖是否正確?")
15: abort(400)
16:
17: return 'OK'
```
5. 程式碼裡名稱的命名規則:
- 常數:全部大寫, 單字間用底線連接,
- 例如 DAYS_IN_A_WEEK
- 變數/函式等:小寫, 單字間用底線連接, 例如 total_cars
- 類別名稱:駝峰式, 例如 ChatCompletion
1. Colab 請設定為如下:

這樣抓圖時才會是白底, 深色主題在螢幕上很好, 但是印刷上會一團黑, 看起來髒髒的。
程式碼統一使用這個 [Fira code 字型](https://github.com/ryanoasis/nerd-fonts/releases/download/v3.0.2/FiraCode.zip)
截圖時請統一抓到左邊 run 按鈕

輸出結果如無特殊需要, 請複製輸出文字不要截圖
1. 彩色書程式碼顏色請將 VSCode 設定為以下主題:

這個主題配色和前面 Replit 的設定比較接近。另外請開啟 VSCode 的這個設定:

請把程式碼貼到 VSCode 後再複製回 Word, 就樣就會連同顏色一起貼到 Word。
1. 礙於紙張寬度, 程式碼單行請以 67 個字為限, 必要時請想辦法在合於語法的情況下折行。
### ch08 稿件意見
- 三個角色要分清楚:
- Assistant 就是助理的設定, 包含要使用的模型、工具
- Thread 就是討論串, 負責對話記錄, 這個 Thread 跟執行緒的 Thread 沒有關係
- Run 負責執行一輪對話, 其實就是從目前的對話記錄再接下一句
- 詞彙要明確:
- Thread 是指單一討論串, threads 是指提供方法建立與處理討論串的物件, Assistant 和 assistants、Run 和 runs 的關係也是一樣
- 討論串是由訊息組成, 如果講對話, 就是指至少一問一答, 所以不會是單一訊息
- 識別碼的作用:Assistants API 建立的物件都是靜態物件, 不會隨伺服端狀態變化而自動更新內容, 要知道最新狀態, 都要依靠識別碼重新取得物件, 像是 Run 物件的狀態就是最直接的例子, 要顯示討論串內容也不是直接使用 Thread 物件, 而是要指定討論串的識別碼才能撈出訊息。Assistants API 建立的物件只是呈現建立物件當時的狀態
- Run 執行的是 Assistant, 不是 Thread, 討論串就是記錄對話, 無法執行
- 要適度加上中標、小標, 讓文章有段落感, 讀者也才會比較知道大概在幹嘛, 找東西也比較好找
- 沒有要介紹的就先不要提, 等到真正要介紹的時候再說明即可, 不然會讓解說變複雜、也容易混亂焦點, 讓讀者留下疑惑。像是設定助理的文件清單時, 還沒有要介紹檢索器, 就不用一起更新工具清單的設定。
- code interpreter 的功能是在模型準備好的封閉環境內執行模型餵給它的 Python 程式碼, 而且可以透過程式碼讀取文件或是生文件, 生出的文件可以透過我們自己的程式碼下載回來。它並不負責生要執行的程式碼。
- 顯示物件內容時, 不一定要完整, 除頭尾外, 只要顯勢必要的屬性, 其餘部分用 ...(略) 表示即可, 避免浪費篇幅