首度使用 ChatGPT 的體驗如何?
會不會覺得:「不怎麼樣嗎?!它的表現,不像外傳,那般的神嘛!」
非 ChatGPT 股東;更不是它們家員工的我,對此有話要說,想提供另一種持平的觀點!
【註】:個人為 ChatGPT Plus 訂戶;所以我的使用感受,系基於這個前提開啟的。
個人喜歡用 Markdown 文檔寫「規格文件」、「備忘錄」。最近,遇有需求:「原 Markdown 文檔中的某些內容,想放上我的 Google Blog 」。所以,我想要透過我的 Neovim 0.8 + Lua Script 將 Markdown 文檔中的一個個純文字段落,轉換成帶有 <p> tag 的 HTML 文檔。
昨天我向 GPT-4 提需求,要求它提供程式碼。結果,第一次,他弄錯了意思,所以,首版的產出,根本就不能用。經過:文字補述,詳敘我的需求,以這樣的方式與 GPT-4「溝通」,終於在十幾回合的往返後,GPT-4 滿足了敞人的需求。
今天,我又向 GPT-4 提: Markdown 文檔中「重編號」的需求,這次僅一個來回,它就提供了我所需要的程式。
-- 將 reorder_ordered_list 函數的定義添加到 init.lua
function _G.reorder_ordered_list()
-- 獲取選取的文字區域
local line_start, line_end = unpack(vim.api.nvim_buf_get_mark(0, "<")), unpack(vim.api.nvim_buf_get_mark(0, ">"))
-- 將選取的文字區域讀入到一個表格中
local lines = vim.api.nvim_buf_get_lines(0, line_start - 1, line_end, false)
-- 初始化變數,存放重新排序後的有序列表項目
local reordered_lines = {}
-- 初始化列表項目編號
local item_number = 1
-- 迭代選取的每一行文字
for _, line in ipairs(lines) do
-- 使用正則表達式匹配有序列表項目
if string.match(line, "^%s*%d+%..+") then
-- 替換列表項目編號
local new_line = string.gsub(line, "^%s*%d+%.", tostring(item_number) .. ".")
table.insert(reordered_lines, new_line)
-- 更新列表項目編號
item_number = item_number + 1
else
-- 將未匹配的行保持原樣添加到 reordered_lines 中
table.insert(reordered_lines, line)
end
end
-- 將重新排序後的有序列表項目替換原來的文字區域
vim.api.nvim_buf_set_lines(0, line_start - 1, line_end, false, reordered_lines)
end
-- 在 init.lua 中定義命令:執行 reorder_ordered_list 函數
vim.cmd("command! Reorder :lua _G.reorder_ordered_list()")
【總結】:
別把 ChatGPT 當神,認為它能洞悉我們要的是什麼;但我們可以訓練它,一旦它知道 了我們的「習慣」後,其「料事如神」的本事,便會逐漸顯現。
【參考】
最後,為說明上面那段 Lua Script 是怎麼產生的,附上個實際應用案例。以下,將今天我跟 GPT-4 溝通需求的過程及方式。
Markdown 文檔,原有 Ordered Lists 項目如下:
1. First item
2. Second item
3. Third item
4. Fourth item
但在插入新行後,原有的編號順序會被打亂:
1. First item
2. Lorem ipsum dolor sit amet consectetur
3. Second item
4. Third item
5. Fourth item
請仿以下 Lua Script ,撰寫程式。令我可依如下操作,重調 Ordered Lists 編號。
1. 按 `V` 鍵;
2. 移動游標;
3. 按 `V` 鍵;(自此完成了,使用 V-LINE 選擇一個區段的文字)
4. 按 `:` 鍵,要求在 Command Line 輸入 Neovim 指令;
5. 輸入 `Reorder` ,按 Enter 鍵。
------------------------------------------------------------------------------
-- 將選取的文字區域轉換成帶有 和
標籤的 HTML 內容
------------------------------------------------------------------------------
-- 將 convert_to_html 函數的定義添加到 init.lua
function _G.convert_to_html()
-- 獲取選取的文字區域
local line_start, line_end = unpack(vim.api.nvim_buf_get_mark(0, "<")), unpack(vim.api.nvim_buf_get_mark(0, ">"))
-- 將選取的文字區域讀入到一個表格中
local lines = vim.api.nvim_buf_get_lines(0, line_start - 1, line_end, false)
-- 初始化變數,存放轉換後的 HTML 內容
local html_lines = {}
-- 在開始之前添加 標籤
table.insert(html_lines, "
")
-- 迭代選取的每一行文字
for i, line in ipairs(lines) do
-- 判斷是否為空行
if line == "" then
-- 如果上一行不為空,則添加
標籤
if i > 1 and lines[i - 1] ~= "" then
table.insert(html_lines, "")
-- 在 標籤後添加空白行
table.insert(html_lines, "")
end
-- 如果下一行不為空,則添加 標籤
if i < #lines and lines[i + 1] ~= "" then table.insert(html_lines, "
") end
else
-- 將非空行添加到 html_lines 中
table.insert(html_lines, line)
end
end
-- 在結束時添加
標籤
table.insert(html_lines, "")
table.insert(html_lines, "")
-- 將轉換後的 HTML 內容替換原來的文字區域
vim.api.nvim_buf_set_lines(0, line_start - 1, line_end, false, html_lines)
end
-- 在 init.lua 中定義命令:執行 convert_to_html 函數
vim.cmd("command! ConvertToHTML :lua _G.convert_to_html()")
需求細節:
1. Code 說明使用繁體字;
2. 若需使用 Lua Global Function / Global Variable ,需於其前加 `_G.`(如:`_G.convert_to_html()` ),這是為了令 Lua Linter 不會認為程式碼撰寫不符合規範)
以上這段洛洛長的文字,怕您看了頭暈,甚而有不知所云之感,所以,我需要將文章做個結構性的解析。
第 1 至 22 行,用於向 GPT-4 說明,我需要它代為撰碼的「功能需求」。第 18 至 22 行,則是參考 UML Scenario 的概念,用於向 GPT-4 詳述,我所要的「功能」,其操作使用的步驟系如何進行。
第 24 至 68 行,透過範例碼(Example Code),向 GPT-4 說明個人對程式撰碼的風格,進行規範:例如:要求 GPT-4 對於 Global Function 的命名方式,一定要在前頭加上 _G. ,免得 Neovim 0.8 預設的 LSP ,其 Linter 功能又要抱怨我在 Global Function 的使用沒照规規來;儘可能為程式碼加上中文註釋。
第 70 至 73 行,「需求細節」則是用於特別指定 GPT-4 在「產出」時,務必遵循的執行要點。譬如 72 行的第一點,就是要 GPT-4 別又突然轉用簡體中文;第二點則是再次提醒它,若是程式碼中需要用到 Lua Global Function 時,務必在 Funcation Name 之前補上 `_G.` 。