2023-03-25

讓 ChatGPT 能料事如神

首度使用 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.` 。

沒有留言:

張貼留言