本文展示了文字編輯器中「搜尋與取代」功能的演變,
其中「替換」步驟已被 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中文網其他相關文章!