見出し画像

コマンドラインでのファイル編集にGPT(LLM)を活用する

こんな記事を眺めていたところ、

「そもそも処理自体GPTにさせてしまっても良いのでは」と思い、プロトタイプを作ってみたのが今日のお題となります。

問題の背景

ブログ記事のネタづくりに

  • テーマの提案(AIでやってみた、QoL爆上げ、など)

  • テーマに対するキーワードの連想

みたいなことをOpenAI APIで自動化したりして遊んでいた訳ですが、連想した中で良さげなキーワードを20個絞り込んで、みたいなことをするのに、いちいちデータをコピペしてプロンプト作成するのは面倒くさいな、と思ったのでした。

コードの使い方

こんな感じで、処理対象のファイル名とプロンプトを指定すると、処理対象のファイルにプロンプトを適用した結果を返します。

$ ./apply_lines [処理対象のファイル名] --prompt [プロンプト]

具体例

$ ./apply_lines self_study.txt --prompt ファイル内の単語のうち、ブログの記事として人気の出そうな単語で10個に絞り込んで下さい。意味の重複する単語を重複して含めないようにして下さい。
独学
ブログ
キャリア
教材
モチベーション
成功例
スキルアップ
転職
英語学習
オンライン学習

コード(apply_lines)

#!/usr/bin/env python
import argparse
from typing import List

from langchain.llms import OpenAIChat
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import PromptTemplate

def read_input_file(file_path: str) -> str:
    with open(file_path, 'r') as f:
        input_text = f.read()
    return input_text

def generate_prompt(query: str, input_text: str, output_parser: CommaSeparatedListOutputParser) -> str:
    format_instructions = output_parser.get_format_instructions()
    template = """
Apply the query-based process to the contents of the received file.
# format instruction:
{format_instructions}
# query:
{query}
# received:
{input}
    """
    prompt = PromptTemplate(
        template=template,
        input_variables=["query", "input"],
        partial_variables={"format_instructions": format_instructions}
    )
    return prompt.format(query=query, input=input_text)

def parse_arguments() -> argparse.Namespace:
    parser = argparse.ArgumentParser()
    parser.add_argument('input', type=str, help='処理対象のファイル')
    parser.add_argument('--prompt', type=str, help='プロンプト')
    args = parser.parse_args()
    return args

def parse_output(output: str, output_parser: CommaSeparatedListOutputParser) -> List[str]:
    lines = output_parser.parse(output)
    return lines

def main():
    args = parse_arguments()
    input_text = read_input_file(args.input)
    output_parser = CommaSeparatedListOutputParser()
    prompt = generate_prompt(args.prompt, input_text, output_parser)
    llm = OpenAIChat(temperature=0.0)
    output = llm(prompt)
    lines = parse_output(output, output_parser)
    for line in lines:
        print(line)

if __name__ == "__main__":
    main()

適当に書いたコードを入力に「このコードをリファクタリングして」とChatGPTに伝えたら、それっぽい感じに関数に分割した上、ちゃんと型定義までしてくれました。

実際に使う際はapply_linesというファイル名で保存した上で、こんな感じに実行権限をつけてお使い下さい。

chmod +x apply_lines

APIをコールしているのでレスポンスが返ってくるまで30秒ほど待つ感じにはなりますが、ふわっとした処理をコマンドラインでさせられるのは便利でございます。

現場からは以上です。

この記事が気に入ったらサポートをしてみませんか?