ray88’s diary

お仕事で困ったとき用の自分用の覚書

コード解説 第6章(app.py)

from langchain.agents import initialize_agent, Tool
from langchain.utilities import GoogleSearchAPIWrapper
from langchain.prompts import PromptTemplate
from langchain.agents import AgentType
from langchain.chat_models import ChatOpenAI

def create_prompt(usr_input):
    prompt = PromptTemplate(
        input_variables=["theme"],
        template="""
        あなたはニュース記事を書くブロガーです。
        下記のテーマについて、Google検索で最新情報を取得し、取得した情報に基づいてニュース記事を書いてください。1000文字以上で、日本語で出力してください。記事の末尾に参考にしたURLを参照元としてタイトルとURLを出力してください。
        ###
        テーマ:{theme}
        """
    )
    return prompt.format(theme=usr_input)

def define_tools():
    search = GoogleSearchAPIWrapper()
    return [
        Tool(
            name="Search",
            func=search.run,
            description="質問に答えるために必要な情報を取得するためのツールです。"
        ),
    ]

def write_response_to_file(response, filename):
    with open(filename, 'w', encoding='utf-8-sig') as file:
        file.write(response)
    print('出力が完了しました')

def main():
    llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo", max_tokens=2000)
    tools = define_tools()
    agent = initialize_agent(tools, llm, agent=AgentType.OPENAI_FUNCTIONS)
    prompt = create_prompt(input("記事のテーマを入力してください:"))
    response = agent.run(prompt)
    write_response_to_file(response, 'output.txt')

if __name__ == "__main__":
    main()
```

コードの詳細解説:**

1. **インポート文:**
- `initialize_agent` と `Tool` を `langchain.agents` からインポートしています。`initialize_agent` はエージェントの初期化に使用され、`Tool` はエージェントが利用するツールを定義するためのクラスです。
- `GoogleSearchAPIWrapper` を `langchain.utilities` からインポートしています。これはGoogle検索を行うためのラッパークラスです。
- `PromptTemplate` を `langchain.prompts` からインポートしています。プロンプトのテンプレートを作成するためのクラスです。
- `AgentType` を `langchain.agents` からインポートしています。エージェントのタイプを指定するための列挙型です。
- `ChatOpenAI` を `langchain.chat_models` からインポートしています。OpenAIのチャットモデルを利用するためのクラスです。

2. **`create_prompt` 関数:**
- ユーザーからの入力を受け取り、ニュース記事作成のためのプロンプトを生成します。
- `PromptTemplate` を使用して、テンプレート内の `{theme}` をユーザー入力で置き換えたプロンプトを作成します。

3. **`define_tools` 関数:**
- Google検索を行うためのツールを定義します。
- `GoogleSearchAPIWrapper` のインスタンスを作成し、それを `Tool` クラスでラップしてリストとして返します。

4. **`write_response_to_file` 関数:**
- エージェントからの応答を指定されたファイルに書き込みます。
- ファイルはUTF-8シグネチャ付きでエンコードされ、書き込み完了後にメッセージを表示します。

5. **`main` 関数:**
- `ChatOpenAI` のインスタンスを作成し、温度、モデル、最大トークン数を設定します。
- `define_tools` 関数で定義したツールを取得します。
- `initialize_agent` を使用して、エージェントを初期化します。ここで、ツール、LLM、エージェントタイプを指定します。
- ユーザーから記事のテーマを入力として受け取り、`create_prompt` 関数でプロンプトを生成します。
- エージェントの `run` メソッドを使用して、プロンプトに基づく応答を生成します。
- 生成された応答を `write_response_to_file` 関数を使用してファイルに書き込みます。

6. **エントリーポイント:**
- `if __name__ == "__main__":` ブロック内で `main` 関数を呼び出しています。これにより、このスクリプトが直接実行された場合に `main` 関数が実行されます。

**注意点:**

- **非推奨警告について:**
- コンソールに表示された警告は、現在使用している `ChatOpenAI` クラスや `initialize_agent` 関数が将来的に非推奨となり、削除される予定であることを示しています。これらの警告は、将来的なコードの互換性を維持するために、新しいメソッドやクラスへの移行を検討する必要があることを示唆しています。

  • **エージェントの初期化:**

- `initialize_agent` 関数は、エージェントを初期化するための関数で、ツール、LLM、エージェントタイプを引数として受け取ります。ただし、将来的に非推奨となる予定のため、最新のドキュメントを参照し、適切な初期化方法を確認することをおすすめします。

  • **プロンプトの作成:**

- `PromptTemplate` を使用してプロンプトを作成しています。テンプレート内の `{theme}` プレースホルダが、ユーザーからの入力で置き換えられます。これにより、動的にプロンプトを生成することが可能です。

- **ツールの定義:**
- `GoogleSearchAPIWrapper` を使用してGoogle検索を行うツールを定義しています。`Tool` クラスでラップ