開源 AI 食譜文件

從任何LLM推理提供商建立Transformers Agent

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

Open In Colab

從任何LLM推理提供商建立Transformers Agent

作者:Aymeric Roucher

本教程基於Agent知識:要了解更多Agent,您可以從這個介紹性筆記本開始

Transformers Agents是一個用於構建Agent的庫,它使用LLM作為llm_engine引數的動力。這個引數旨在為使用者提供選擇任何LLM的最大自由。

讓我們看看如何從一些領先提供商的API構建這個llm_engine

HuggingFace無伺服器API和專用端點

Transformers agents提供了一個內建的HfEngine類,允許您透過無伺服器API或您自己的專用端點使用Hub上的任何模型。這是使用HF agents的首選方式。

!pip install openai anthropic "transformers[agents]" --upgrade -q
from huggingface_hub import notebook_login

notebook_login()
>>> from transformers.agents import HfApiEngine, ReactCodeAgent

>>> repo_id = "meta-llama/Meta-Llama-3.1-8B-Instruct"
>>> endpoint_url = "your_endpoint_url"

>>> llm_engine = HfApiEngine(model=repo_id)  # you could use model=endpoint_url here

>>> agent = ReactCodeAgent(tools=[], llm_engine=llm_engine)

>>> agent.run("What's the 10th Fibonacci number?")
['unicodedata', 're', 'math', 'collections', 'queue', 'itertools', 'random', 'time', 'stat', 'statistics']

Agent的llm_engine初始化引數可以是一個簡單的可呼叫物件,例如

def llm_engine(messages, stop_sequences=[]) -> str:
    return response(messages)

此可呼叫物件是LLM引擎的核心。它應遵循以下要求:

  • 接受聊天模板格式的訊息列表作為輸入,並輸出一個str
  • 接受一個stop_sequences引數,Agent系統將在此引數中傳遞應停止生成的序列。

讓我們仔細看看我們使用的HfEngine的程式碼

from typing import List, Dict
from transformers.agents.llm_engine import MessageRole, get_clean_message_list
from huggingface_hub import InferenceClient

llama_role_conversions = {
    MessageRole.TOOL_RESPONSE: MessageRole.USER,
}


class HfApiEngine:
    def __init__(self, model: str = "meta-llama/Meta-Llama-3.1-8B-Instruct"):
        self.model = model
        self.client = InferenceClient(model=self.model, timeout=120)

    def __call__(self, messages: List[Dict[str, str]], stop_sequences=[]) -> str:
        # Get clean message list
        messages = get_clean_message_list(messages, role_conversions=llama_role_conversions)

        # Get LLM output
        response = self.client.chat_completion(messages, stop=stop_sequences, max_tokens=1500)
        response = response.choices[0].message.content

        # Remove stop sequences from LLM output
        for stop_seq in stop_sequences:
            if response[-len(stop_seq) :] == stop_seq:
                response = response[: -len(stop_seq)]
        return response

這裡的引擎不是一個函式,而是一個帶有__call__方法的類,這增加了儲存客戶端等屬性的可能性。

我們還使用get_clean_message_list()實用程式將連續的訊息連線到相同的角色。此方法接受一個role_conversions引數,用於將Transformers Agents支援的角色範圍轉換為LLM接受的角色。

這個方案可以適用於任何LLM!讓我們看看其他示例。

適用於任何LLM的方案

使用上述方案,您可以將任何LLM推理源用作您的llm_engine。只需記住兩個主要約束:

  • llm_engine是一個可呼叫物件,它接收聊天模板格式的訊息列表作為輸入,並輸出一個str
  • 它接受一個stop_sequences引數。

OpenAI

import os
from openai import OpenAI

openai_role_conversions = {
    MessageRole.TOOL_RESPONSE: MessageRole.USER,
}


class OpenAIEngine:
    def __init__(self, model_name="gpt-4o"):
        self.model_name = model_name
        self.client = OpenAI(
            api_key=os.getenv("OPENAI_API_KEY"),
        )

    def __call__(self, messages, stop_sequences=[]):
        messages = get_clean_message_list(messages, role_conversions=openai_role_conversions)

        response = self.client.chat.completions.create(
            model=self.model_name,
            messages=messages,
            stop=stop_sequences,
            temperature=0.5,
        )
        return response.choices[0].message.content

Anthropic

from anthropic import Anthropic, AnthropicBedrock


# Cf this page for using Anthropic from Bedrock: https://docs.anthropic.com/en/api/claude-on-amazon-bedrock
class AnthropicEngine:
    def __init__(self, model_name="claude-3-5-sonnet-20240620", use_bedrock=False):
        self.model_name = model_name
        if use_bedrock:
            self.model_name = "anthropic.claude-3-5-sonnet-20240620-v1:0"
            self.client = AnthropicBedrock(
                aws_access_key=os.getenv("AWS_BEDROCK_ID"),
                aws_secret_key=os.getenv("AWS_BEDROCK_KEY"),
                aws_region="us-east-1",
            )
        else:
            self.client = Anthropic(
                api_key=os.getenv("ANTHROPIC_API_KEY"),
            )

    def __call__(self, messages, stop_sequences=[]):
        messages = get_clean_message_list(messages, role_conversions=openai_role_conversions)
        index_system_message, system_prompt = None, None
        for index, message in enumerate(messages):
            if message["role"] == MessageRole.SYSTEM:
                index_system_message = index
                system_prompt = message["content"]
        if system_prompt is None:
            raise Exception("No system prompt found!")

        filtered_messages = [message for i, message in enumerate(messages) if i != index_system_message]
        if len(filtered_messages) == 0:
            print("Error, no user message:", messages)
            assert False

        response = self.client.messages.create(
            model=self.model_name,
            system=system_prompt,
            messages=filtered_messages,
            stop_sequences=stop_sequences,
            temperature=0.5,
            max_tokens=2000,
        )
        full_response_text = ""
        for content_block in response.content:
            if content_block.type == "text":
                full_response_text += content_block.text
        return full_response_text

後續步驟

繼續為transformers.agents實現您自己的llm_engine,並使用您自己的LLM推理提供商!

然後,要使用這個閃亮的新llm_engine,請檢視以下用例:

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.