ホームページ > テクノロジー周辺機器 > AI > 研究と執筆のためのLlamainDexを使用したマルチエージェントワークフロー

研究と執筆のためのLlamainDexを使用したマルチエージェントワークフロー

尊渡假赌尊渡假赌尊渡假赌
リリース: 2025-03-05 11:16:11
オリジナル
465 人が閲覧しました

大規模な言語モデルエージェントは、検索、コンテンツ生成、品質レビューなどのタスクを自動化するための強力なツールです。ただし、特に外部リソース(Web検索など)や複数の専門的な手順(ドラフト対レビューなど)を統合する必要がある場合、単一のエージェントはすべてを効率的に実行できないことがよくあります。マルチエージェントワークフローを使用すると、これらのタスクをさまざまなエージェントに分割できます。それぞれに独自のツール、制約、責任があります。この記事では、各エージェントがインターネット上で簡潔な履歴レポートを作成する特定の部分を処理する3つのエージェントシステム(研究所、WriteAgent、およびReviewAgent)を構築する方法について説明します。また、システムが検索ループに閉じ込められないようにします。これは、時間とクレジットを無駄にする可能性があります。

学習目標

    Multi-AgentワークフローがLLMSでタスクの自動化を強化する方法を理解してください
  • 研究、執筆、レビューのための3エージェントシステムを構築することを学びます。
  • 自動化されたワークフローで無限の検索ループを防ぐためのセーフガードを実装してください。
  • 効率的なデータ検索のためにDuckduckgoのような外部ツールの統合を探索します。
  • 構造化された高品質のコンテンツ生成を保証するLLMを搭載したワークフローを開発します。
  • この記事は、

データサイエンスブログの一部として公開されました。 目次言語モデル(LLM) - OpenAI GPT-4 ワークフローのための必須ツール

タスク実行のためのAIエージェントの定義
    結論
  • 頻繁に尋ねられる質問
  • 言語モデル(LLM) - Openai GPT-4
  • llama-indexのOpenai(model =” gpt-4o”)を使用します。必要に応じて、これを別のLLMと交換できますが、GPT-4は通常、マルチステップの推論タスクに強い選択です。
  • ワークフローに不可欠なツール
  • ツールは、エージェントが独自の言語モデリング以外でアクションを実行するために呼び出すことができる関数です。典型的なツールには次のものが含まれます
  • web検索
ファイルの読み取り/書き込み

数学計算機

外部サービス用の
###############################################################################
# 1. INSTALLATION
###############################################################################
# Make sure you have the following installed:
#   pip install llama-index langchain duckduckgo-search

###############################################################################
# 2. IMPORTS
###############################################################################
%pip install llama-index langchain duckduckgo-search

from llama_index.llms.openai import OpenAI

# For DuckDuckGo search via LangChain
from langchain.utilities import DuckDuckGoSearchAPIWrapper

# llama-index workflow classes
from llama_index.core.workflow import Context
from llama_index.core.agent.workflow import (
    FunctionAgent,
    AgentWorkflow,
    AgentInput,
    AgentOutput,
    ToolCall,
    ToolCallResult,
    AgentStream
)

import asyncio

###############################################################################
# 3. CREATE LLM
###############################################################################
# Replace "sk-..." with your actual OpenAI API key
llm = OpenAI(model="gpt-4", api_key="OPENAI_API_KEY")
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

API

私たちの例では、重要なツールはduckduckgosearchです。これは、フードの下でLangchainのDuckduckgosearchapiwrapperを使用しています。また、メモを録音し、レポートを書き、レビューするヘルパーツールもあります。

タスク実行のためにAIエージェントを定義する
  • 各エージェントは、functionagent
  • のインスタンスです。重要なフィールドには次のものが含まれます。
    • nameand説明
    • System_prompt :その役割と制約についてエージェントに指示します
    • llm:使用された言語モデル
    • ツール:エージェントが
    • を呼び出すことができる機能
    • can_handoff_to:このエージェントが
    • に手渡すことができるエージェント

    ResearchAgent

    • Webを検索します(指定されたクエリの制限まで)
    • 関連する調査結果を「ノート」
    • として保存します
    • 十分な情報が収集されたら、次のエージェントに手渡します

    writeagent

    • 研究員が収集したあらゆるメモを使用して、マークダウンでレポートを作成します
    • フィードバックのために
    • レビューアジェントに渡されます

    ReviewAgent

    • 正確性と完全性のためのドラフトコンテンツを確認します
    • 変更が必要な場合は、手をwriteagentに制御する
    • それ以外の場合は、最終承認を提供します
    ###############################################################################
    # 1. INSTALLATION
    ###############################################################################
    # Make sure you have the following installed:
    #   pip install llama-index langchain duckduckgo-search
    
    ###############################################################################
    # 2. IMPORTS
    ###############################################################################
    %pip install llama-index langchain duckduckgo-search
    
    from llama_index.llms.openai import OpenAI
    
    # For DuckDuckGo search via LangChain
    from langchain.utilities import DuckDuckGoSearchAPIWrapper
    
    # llama-index workflow classes
    from llama_index.core.workflow import Context
    from llama_index.core.agent.workflow import (
        FunctionAgent,
        AgentWorkflow,
        AgentInput,
        AgentOutput,
        ToolCall,
        ToolCallResult,
        AgentStream
    )
    
    import asyncio
    
    ###############################################################################
    # 3. CREATE LLM
    ###############################################################################
    # Replace "sk-..." with your actual OpenAI API key
    llm = OpenAI(model="gpt-4", api_key="OPENAI_API_KEY")
    ログイン後にコピー
    ログイン後にコピー
    ログイン後にコピー
    エージェントワークフロー - タスクの実行の調整

    エージェントワークフローは、エージェント間のメッセージと状態がどのように移動するかを調整します。ユーザーがリクエストを開始したとき(たとえば、「インターネットの歴史に関する簡潔なレポートを書いてください…」)、ワークフロー:

    • ResearchAgent ユーザープロンプトを受信し、Web検索を実行するか、いくつかのメモを記録するかを決定します。
    • writeagent ノートを使用して、構造化またはスタイルの出力(マークダウンドキュメントなど)を作成します。
    • reviewAgent
    • 最終出力をチェックし、改訂のために送り返すか、承認します。 コンテンツが承認され、それ以上の変更が要求されないとワークフローが終了します。 ワークフローを作成します
    • このステップでは、研究、執筆、レビューを含むエージェントワークフローを定義します。 root_agentはResearch_Agentに設定されています。つまり、プロセスは研究の収集から始まります。初期状態には、研究メモ、レポートの内容、およびレビューステータスのプレースホルダーが含まれています。

    ワークフローを実行します

    ワークフローは、レポートでカバーするトピックとキーポイントを指定するユーザーリクエストを使用して実行されます。この例の要求は、その起源、World Wide Webの発展、現代の進化など、インターネットの歴史に関する簡潔なレポートを求めています。ワークフローは、エージェントを調整することにより、この要求を処理します

    デバッグまたは観察のためのストリームイベント

    ###############################################################################
    # 4. DEFINE DUCKDUCKGO SEARCH TOOL WITH SAFEGUARDS
    ###############################################################################
    # We wrap LangChain's DuckDuckGoSearchAPIWrapper with our own logic
    # to prevent repeated or excessive searches.
    
    duckduckgo = DuckDuckGoSearchAPIWrapper()
    
    MAX_SEARCH_CALLS = 2
    search_call_count = 0
    past_queries = set()
    
    async def safe_duckduckgo_search(query: str) -> str:
        """
        A DuckDuckGo-based search function that:
          1) Prevents more than MAX_SEARCH_CALLS total searches.
          2) Skips duplicate queries.
        """
        global search_call_count, past_queries
    
        # Check for duplicate queries
        if query in past_queries:
            return f"Already searched for '{query}'. Avoiding duplicate search."
    
        # Check if we've reached the max search calls
        if search_call_count >= MAX_SEARCH_CALLS:
            return "Search limit reached, no more searches allowed."
    
        # Otherwise, perform the search
        search_call_count += 1
        past_queries.add(query)
    
        # DuckDuckGoSearchAPIWrapper.run(...) is synchronous, but we have an async signature
        result = duckduckgo.run(query)
        return str(result)
        
    ###############################################################################
    # 5. OTHER TOOL FUNCTIONS: record_notes, write_report, review_report
    ###############################################################################
    async def record_notes(ctx: Context, notes: str, notes_title: str) -> str:
        """Store research notes under a given title in the shared context."""
        current_state = await ctx.get("state")
        if "research_notes" not in current_state:
            current_state["research_notes"] = {}
        current_state["research_notes"][notes_title] = notes
        await ctx.set("state", current_state)
        return "Notes recorded."
    
    async def write_report(ctx: Context, report_content: str) -> str:
        """Write a report in markdown, storing it in the shared context."""
        current_state = await ctx.get("state")
        current_state["report_content"] = report_content
        await ctx.set("state", current_state)
        return "Report written."
    
    async def review_report(ctx: Context, review: str) -> str:
        """Review the report and store feedback in the shared context."""
        current_state = await ctx.get("state")
        current_state["review"] = review
        await ctx.set("state", current_state)
        return "Report reviewed."    
    ログイン後にコピー
    ログイン後にコピー
    ワークフローの実行を監視するために、イベントをストリーミングし、エージェントアクティビティに関する詳細を印刷します。これにより、現在動作しているエージェントを追跡し、中間出力を表示し、エージェントが作成したツールコールを検査することができます。ツールの使用や応答などのデバッグ情報は、可視性を向上させるために表示されます。
    ###############################################################################
    # 1. INSTALLATION
    ###############################################################################
    # Make sure you have the following installed:
    #   pip install llama-index langchain duckduckgo-search
    
    ###############################################################################
    # 2. IMPORTS
    ###############################################################################
    %pip install llama-index langchain duckduckgo-search
    
    from llama_index.llms.openai import OpenAI
    
    # For DuckDuckGo search via LangChain
    from langchain.utilities import DuckDuckGoSearchAPIWrapper
    
    # llama-index workflow classes
    from llama_index.core.workflow import Context
    from llama_index.core.agent.workflow import (
        FunctionAgent,
        AgentWorkflow,
        AgentInput,
        AgentOutput,
        ToolCall,
        ToolCallResult,
        AgentStream
    )
    
    import asyncio
    
    ###############################################################################
    # 3. CREATE LLM
    ###############################################################################
    # Replace "sk-..." with your actual OpenAI API key
    llm = OpenAI(model="gpt-4", api_key="OPENAI_API_KEY")
    ログイン後にコピー
    ログイン後にコピー
    ログイン後にコピー

    最終レポートを取得して印刷します

    ワークフローが完了すると、生成されたレポートが含まれる最終状態を抽出します。レポートコンテンツが印刷され、その後、レビューエージェントからのレビューフィードバックが続きます。これにより、出力が完了し、必要に応じてさらに洗練できます。

    ###############################################################################
    # 4. DEFINE DUCKDUCKGO SEARCH TOOL WITH SAFEGUARDS
    ###############################################################################
    # We wrap LangChain's DuckDuckGoSearchAPIWrapper with our own logic
    # to prevent repeated or excessive searches.
    
    duckduckgo = DuckDuckGoSearchAPIWrapper()
    
    MAX_SEARCH_CALLS = 2
    search_call_count = 0
    past_queries = set()
    
    async def safe_duckduckgo_search(query: str) -> str:
        """
        A DuckDuckGo-based search function that:
          1) Prevents more than MAX_SEARCH_CALLS total searches.
          2) Skips duplicate queries.
        """
        global search_call_count, past_queries
    
        # Check for duplicate queries
        if query in past_queries:
            return f"Already searched for '{query}'. Avoiding duplicate search."
    
        # Check if we've reached the max search calls
        if search_call_count >= MAX_SEARCH_CALLS:
            return "Search limit reached, no more searches allowed."
    
        # Otherwise, perform the search
        search_call_count += 1
        past_queries.add(query)
    
        # DuckDuckGoSearchAPIWrapper.run(...) is synchronous, but we have an async signature
        result = duckduckgo.run(query)
        return str(result)
        
    ###############################################################################
    # 5. OTHER TOOL FUNCTIONS: record_notes, write_report, review_report
    ###############################################################################
    async def record_notes(ctx: Context, notes: str, notes_title: str) -> str:
        """Store research notes under a given title in the shared context."""
        current_state = await ctx.get("state")
        if "research_notes" not in current_state:
            current_state["research_notes"] = {}
        current_state["research_notes"][notes_title] = notes
        await ctx.set("state", current_state)
        return "Notes recorded."
    
    async def write_report(ctx: Context, report_content: str) -> str:
        """Write a report in markdown, storing it in the shared context."""
        current_state = await ctx.get("state")
        current_state["report_content"] = report_content
        await ctx.set("state", current_state)
        return "Report written."
    
    async def review_report(ctx: Context, review: str) -> str:
        """Review the report and store feedback in the shared context."""
        current_state = await ctx.get("state")
        current_state["review"] = review
        await ctx.set("state", current_state)
        return "Report reviewed."    
    ログイン後にコピー
    ログイン後にコピー

    研究と執筆のためのLlamainDexを使用したマルチエージェントワークフロー

    研究と執筆のためのLlamainDexを使用したマルチエージェントワークフロー

    研究と執筆のためのLlamainDexを使用したマルチエージェントワークフロー

    無限の検索ループを回避します

    Web検索ツールを使用する場合、LLMが「混乱」し、検索機能を繰り返し呼び出すことができます。これにより、不必要なコストや時間消費につながる可能性があります。それを防ぐために、2つのメカニズムを使用します

    hard limitwe set
      max_search_calls = 2
    • 。したがって、研究ツールは2回しか呼びません。 duplicate detectionweは、まったく同じ検索を複数回繰り返すことを避けるために、セットの過去のクエリ(past_queries
    • )のクエリを保存します。
    • いずれかの条件が満たされている場合(最大検索または重複クエリ)、
    • safe_duckduckgo_search
    関数は、新しい検索を実行する代わりに缶詰のメッセージを返します。

    何を期待しますか?

    ResearchAgent

    インターネットの歴史に関する簡潔なレポートを書くというユーザーのリクエストを受信します。 最大2つの異なるDuckduckgo検索(「インターネットの歴史」と「World Wide Web Tim Berners-Leeなど」などを実行し、Record_Notesを呼び出して要約を保存します。

    • writeagent
    共有コンテキストから「Research_Notes」を読み取ります

    短いマークダウンレポートをドラフトします。 レビューアジェントに手渡します。

    • reviewAgent
    • コンテンツを評価します
    変更が必要な場合は、制御をwriteagentに渡すことができます。それ以外の場合は、レポートを承認します。

    ワークフローが終了します
    • 最終出力は、
    • final_state [“ Report_Content”]に保存されます
    • 結論
    searchwriting、および

    のレビューのために、ワークフローを異なるエージェントに分割することにより、次のような強力でモジュラーシステムを作成できます。

    関連情報を収集します(制御された方法で、過度の検索を防止します)

    構造化された高品質の出力を生成します

    正確性と完全性のためのセルフチェック Langchainを使用したDuckDuckgoの統合は、特殊なAPIキーや資格情報を必要とせずに、マルチエージェントワークフロー用のプラグアンドプレイWeb検索ソリューションを提供します。組み込みのセーフガード(検索コール制限、重複検出)と組み合わせると、このシステムは堅牢で効率的で、幅広い研究およびコンテンツ生成タスクに適しています。

    キーテイクアウト

    • マルチエージェントワークフローは、LLMエージェントに専門的な役割を割り当てることにより、効率を向上させます。
    • duckduckgoのような外部ツールを使用すると、LLMエージェントの研究能力が強化されます。
    • 検索制限などの制約の実装により、不必要なリソース消費が防止されます。
    • 調整されたエージェントワークフローは、構造化された高品質のコンテンツ生成を確保します
    • 適切に設計されたハンドオフメカニズムは、冗長なタスクや無限のループを回避するのに役立ちます。
    • よくある質問
    • q1。単一の万能エージェントの代わりに複数のエージェントを使用するのはなぜですか?エージェント全体で責任を分割する(研究、執筆、レビュー)により、各ステップが明確に定義され、管理しやすくなります。また、モデルの意思決定の混乱を減らし、より正確で構造化された出力を促進します。 Web検索の数を制限するにはどうすればよいですか?コードでは、グローバルカウンター(search_call_count)と定数(max_search_calls = 2)を使用します。検索エージェントがsafe_duckduckgo_searchを呼び出すときはいつでも、カウンターが制限に達したかどうかを確認します。その場合、別の検索を実行する代わりにメッセージを返します。エージェントが同じクエリを複数回繰り返した場合はどうなりますか?繰り返しのクエリを検出するために、Past_queriesと呼ばれるPythonセットを維持します。クエリがすでにそのセットにある場合、ツールは実際の検索を実行して短いメッセージを返し、複製クエリが実行されないようにします。プロンプトを変更して、このワークフローを別のトピックまたはスタイルに適合させることはできますか?絶対に。各エージェントのSystem_Promptを編集して、希望するドメインまたはライティングスタイルに指示を調整できます。たとえば、Writeagentに、箇条書きリスト、物語のエッセイ、または技術的な要約を作成するように指示できます。 GPT-4が必要ですか、それとも別のモデルを使用できますか? Llama-Index(例:GPT-3.5、さらにはローカルモデル)でサポートされている別のモデルに、OpenAI(Model =” GPT-4″)を交換できます。アーキテクチャは同じままですが、一部のモデルは異なる品質の出力を生成する可能性があります。
    この記事に示されているメディアは、Analytics Vidhyaが所有しておらず、著者の裁量で使用されています。

以上が研究と執筆のためのLlamainDexを使用したマルチエージェントワークフローの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート