首頁  >  文章  >  web前端  >  搜尋和(法學碩士)轉換

搜尋和(法學碩士)轉換

DDD
DDD原創
2024-09-19 06:22:32996瀏覽

Search And (LLM) Transform

本文展示了文字編輯器中「搜尋與取代」功能的演變,
其中「替換」步驟已被 LLM 轉換取代。
此範例使用 GenAISCript。

批次應用使用
不容易完成的文字轉換可能很有用 正規表示式。

例如,當我們在
中加入使用字串指令的功能時 對於 exec 命令,我們需要將使用參數數組的所有呼叫轉換為以下新語法:

host.exec("cmd", ["arg0", "arg1", "arg2"])


host.exec(`cmd arg0 arg1 arg2`)`

雖然可以將此函數呼叫與正規表示式匹配

host\.exec\s*\([^,]+,\s*\[[^\]]+\]\s*\)

制定替換字串並不容易......除非你能用自然語言描述它:

Convert the call to a single string command shell in TypeScript

以下是 LLM 正確處理變數的一些轉換範例。

  • 將函數呼叫的參數連接成單一字串
- const { stdout } = await host.exec("git", ["diff"])
+ const { stdout } = await host.exec(`git diff`)
  • 連接參數並使用 ${} 語法來插入變數
- const { stdout: commits } = await host.exec("git", [
-     "log",
-     "--author",
-     author,
-     "--until",
-     until,
-     "--format=oneline",
- ])
+ const { stdout: commits } = 
+   await host.exec(`git log --author ${author} --until ${until} --format=oneline`)

搜尋

搜尋步驟是透過workspace.grep
完成的 允許有效地搜尋文件中的模式(這是同一個搜尋引擎
為 Visual Studio Code 搜尋提供支援)。

const { pattern, glob } = env.vars
const patternRx = new RegExp(pattern, "g")
const { files } = await workspace.grep(patternRx, glob)

計算變換

第二步是將正規表示式套用到檔案內容
並使用內嵌提示預先計算每場比賽的 LLM 轉換。

const { transform } = env.vars
...
const patches = {} // map of match -> transformed
for (const file of files) {
    const { content } = await workspace.readText(file.filename)
    for (const match of content.matchAll(patternRx)) {
        const res = await runPrompt(
            (ctx) => {
                ctx.$`
            ## Task

            Your task is to transform the MATCH with the following TRANSFORM.
            Return the transformed text.
            - do NOT add enclosing quotes.

            ## Context
            `
                ctx.def("MATCHED", match[0])
                ctx.def("TRANSFORM", transform)
            },
            { label: match[0], system: [], cache: "search-and-transform" }
        )
        ...

由於 LLM 有時決定將答案用引號引起來,因此我們需要將其刪除。

    ...
    const transformed = res.fences?.[0].content ?? res.text
    patches[match[0]] = transformed

轉換

最後,透過預先計算的轉換,我們將最終的正規表示式替換應用於
使用轉換後的字串修補舊文件內容。

    const newContent = content.replace(
        patternRx,
        (match) => patches[match] ?? match
    )
    await workspace.writeText(file.filename, newContent)
}

參數

此腳本採用三個參數:檔案 glob、要搜尋的模式、要套用的 LLM 轉換。
我們在腳本元資料中聲明這些參數,並從 env.vars 物件中提取它們。

script({ ...,
    parameters: {
        glob: {
            type: "string",
            description: "The glob pattern to filter files",
            default: "*",
        },
        pattern: {
            type: "string",
            description: "The text pattern (regular expression) to search for",
        },
        transform: {
            type: "string",
            description: "The LLM transformation to apply to the match",
        },
    },
})
const { pattern, glob, transform } = env.vars

跑步

要執行此腳本,您可以使用 --vars 選項來傳遞模式和轉換。

genaiscript run st --vars 'pattern=host\.exec\s*\([^,]+,\s*\[[^\]]+\]\s*\)' 'transform=Convert the call to a single string command shell in TypeScript'

以上是搜尋和(法學碩士)轉換的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:首次貢獻下一篇:首次貢獻