-
Hugging Face์ ๋ฐ๋๋ฐ๋ํ ์ ๊ธฐ๋ฅ Tool, Agent (New Features of Hugging Face: tools and agents)BIG DATA & AI 2023. 5. 13. 15:54๋ฐ์ํ
๐๋ณธ ํฌ์คํ ์ Hugging Face์ ์ ๋ง์ ๋ง ๋ฐ๋๋ฐ๋ํ ์ ๊ธฐ๋ฅ์ธ Tool๊ณผ Agent๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
๋ฌด๋ ค ์ผ์ฃผ์ผ๋ ์ ๋ 23๋ 5์ 10์ผ์ ๋ฆด๋ฆฌ์ฆํ๋ค๋ ์ฌ์ค!Hugging Face๋?
ํ๊น ํ์ด์ค๋ ์์ฐ์ด ์ฒ๋ฆฌ(NLP)๋ฅผ ์ ๋ฌธ์ผ๋ก ํ๋ ํ์ฌ์ด๋ฉฐ, NLP๋ฅผ ์ํ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๊ตฌ ๊ฐ๋ฐ์ ๋ง์ ๊ธฐ์ฌ๋ฅผ ํ๊ณ ์๋ค. ํ๊น ํ์ด์ค๋ ์ธ์ด ๋ฒ์ญ, ํ ์คํธ ๋ถ๋ฅ, ๊ฐ์ฑ ๋ถ์, ์ง๋ฌธ ๋ต๋ณ ๋ฑ ๋ค์ํ NLP ์์ ์ ์ฌ์ฉ๋๋ ์ฌ์ ํ๋ จ๋ ๋ชจ๋ธ์ ์ ๊ณตํ๋ฉฐ, ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ์ ํ์ PyTorch ์์ ๊ตฌ์ถ๋ Transformers ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
ํ๊น ํ์ด์ค๋ Transformers ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ธ์๋ ํ ํฌ๋์ด์ , ๋ฐ์ดํฐ์ , ํ์ดํ๋ผ์ธ ๋ฑ NLP์ ์ฌ์ฉ๋๋ ๋ค์ํ ์คํ์์ค ๋๊ตฌ๋ฅผ ๊ฐ๋ฐํ๊ณ ์๋ค. ๋ํ ํ๊น ํ์ด์ค ํ๋ธ(Hugging Face Hub)๋ผ๋ ์จ๋ผ์ธ ํ๋ซํผ์ ์ด์ํ๋ฉฐ, ์ด๋ NLP ๋ชจ๋ธ๊ณผ ๋ฐ์ดํฐ์ ์ ๊ณต์ ํ๊ณ ํ์ ํ ์ ์๋ ์ ์ฅ์ ์ญํ ์ ํ๋ค.
์ ๋ฐ์ ์ผ๋ก ํ๊น ํ์ด์ค๋ ์คํ์์ค ์ํํธ์จ์ด์ ๋ํ ๊ธฐ์ฌ์ NLP ์ฐ๊ตฌ ๋ฐ ๊ฐ๋ฐ์ ๋ํ ํ์ ์ ์ธ ์ ๊ทผ์ผ๋ก NLP ์ปค๋ฎค๋ํฐ์์ ์ค์ํ ์ญํ ์ ํ๊ณ ์๋ค.Transformers can do anything
์ด๋ฌํ ํ๊น ํ์ด์ค์์ Transformer Agent์ Custom Tools๋ผ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์๋ค. ์ ๋ฐ์ดํธ ๋ ์์ ์ฝ๋์ ์๋์๋ "Transformers can do anything"์ด๋ผ๋ ๋ง๋ฒ์ ์ธ(?) ๋ฌธ๊ตฌ๋ก ์๊ฐ๋๊ณ ์๋๋ฐ, ํ์์ ํจ๊ป ์ดํด๋ณด๋๋ก ํ์. ๐
Agent
Agent์ ๊ตฌ์กฐ๋ฅผ ์ดํด๋ณด๋ฉด ์์ ๊ฐ๋ค. ํ๊ณ ์ ํ๋ instruction์ prompt ํํ๋ก ๋ง๋ค์ด์ Agent๐์๊ฒ ์ฃผ๋ฉด, interpreter๊ฐ prompt์ ๋ง๋ ์ธ์ด ๋ชจ๋ธ์ ์ถ์ฒํด ์ค๋ค. ์์ ์์๋ ์ด ์ผ๋ จ์ ๊ณผ์ ์ ํตํด "A river flowing through a frozen forest" ๋ผ๋ image captioning ์ค๋์ค๊ฐ ์์ฑ๋ ๋ชจ์ต์ ๋ณด์ฌ์ฃผ๊ณ ์๋ค.
์ฌ์ค ๋ชน์ ๊ฐ๋จํ์ง๋ง ์์ฃผ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ด๋ผ๊ณ ํ ์ ์๋ค. Agent ์ด์ ์๋ ๊ฐ feature๋ฅผ ์ํํ๋ class๋ฅผ ๋ณ๋๋ก ์ ์ํ์ฌ ์ฐ๊ฒฐํด ์ฃผ์ด์ผ๋ง ํ๋๋ฐ, ์ด์ ๋ Agent๊ฐ ๊ท์ฐฎ์ ๋ฐ๋ณต์ ์ธ ๊ณผ์ ์ ์์์ ์~ ํด์ฃผ๋ ๊ฒ์ด๋ค. ๋น์ ๋ฅผ ํ์๋ฉด ๊ณ ์ค๊ธ ์๊ณ ๋ฆฌ์ฆ ๋ชจ์์ ์ฐจ๋ก๋ก ๊ฐ๋ค ์ฃผ๋ AI ์ค๋ง์นด์ธ ๊ฐ๋ฌ๊น.
Using Image Generator
๋ณธ ์ฝ๋๋ ์ต์ ๋ฒ์ ์ธ transformer v4.29.0์ด์์์ ๋์ํฉ๋๋ค.
๋ํ Jupyter notebook ํ๊ฒฝ ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. VSCode์์๋ ๊ทธ๋ฆผ์ด ์ ์๋์ต๋๋คใ๊ฐ๋จํ๊ฒ image generator๋ฅผ ๋ง๋ค์ด ๋ณด์. (์ด์ ๋ Agent ๋๋ถ์ ๋ง๋ ๋ค๊ธฐ๋ณด๋ค๋ ๋จ์ ํธ์ถ์ ๊ฐ๊น๋ค.)
# agent_name: "StarCoder (HF Token)" from transformers.tools import HfAgent agent = HfAgent("https://api-inference.huggingface.co/models/bigcode/starcoder") print("StarCoder is initialized ๐ช") boat = agent.run("Generate an image of a boat in the water") boat
boat๋ฅผ ์ถ๋ ฅํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋์จ๋ค. ์์๊ฐ์ ๋ฌผ ์์ ๋ณดํธ ์ฌ์ง์ด ์์ฑ๋์๋ค :)
์ ๋ฆฌํ์๋ฉด,, ์ด์ ๋ ๋จ 2์ค๋ง ์ง๋ฉด ์ด๋ฏธ์ง ์์ฑ ๋ชจ๋ธ์ ์ธ ์ ์๋ ๊ฒ์ด๋ค.. ใ ใ ใ ใ ใ ๋ฐ๋๋ก Agent์๊ฒ ์์ฑํ ์ด๋ฏธ์ง๋ฅผ ์ค๋ช ํด๋ณด๋ผ๊ณ ํด ๋ณด์. (image captioning)
caption = agent.run("Can you caption the `boat_image`?", boat_image=boat) caption
Reading out the Web Page (Plaing Audio)
๊ทธ ๋ค์์ผ๋ก ์๊ฐํ๋ Agent์ ์ฅ๊ธฐ๋ web page๋ฅผ ์ฝ์ด์ฃผ๊ธฐ. beautifulsoup์ผ๋ก ํฌ๋กค๋งํด์ audio๋ก ์ฌ์ํด์ฃผ๋๋ฐ ์๊ฐ๋ณด๋ค ๊ณ ๋ํ๋(?) ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๊น์ง ๋๋๋ค. ์ด๊ฒ๋ ๋จ 2์ค!
audio = agent.run("Read out loud the summary of http://hf.co") play_audio(audio)
ํธ๊ธฐ์ฌ์ด ์๊ฒจ ํ๊ตญ ์ฌ์ดํธ ๋ค์ด๋ฒ๋ ์์ผ ๋ณด์๋๋ฐ, ํฌ๋กค๋ง์ ์ ๋๋ ์ฝ์ด์ฃผ๋ ๋ชจ๋ธ์ ์ ๋์ํ์ง ์๋๋ผ.
Chat Mode
์์ ์ฝ๋๋ OpenAI๋ก ๋๋ฆฐ ๊ฒ ๊ฐ์๋ฐ ํ์๋ OpenAI ๊ณ์ ์ด ์์ด์ HFAgent๋ก ๋๋ ธ๋๋ ์๋ฌ๊ฐ ์ ๋์๊ฐ์ง ์๋๋ค. ๐ ์ถํ์ ๋ฒ๊ทธ๊ฐ ๊ณ ์ณ์ง๊ธธ ๋ฐ๋ ๋ณธ๋ค.
Tools
Hugging Face์ tools๋ ์๋์ ๊ฐ์ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํ๋ค.
These tools are the following:
- Document question answering: given a document (such as a PDF) in image format, answer a question on this document (Donut)
- Text question answering: given a long text and a question, answer the question in the text (Flan-T5)
- Unconditional image captioning: Caption the image! (BLIP)
- Image question answering: given an image, answer a question on this image (VILT)
- Image segmentation: given an image and a prompt, output the segmentation mask of that prompt (CLIPSeg)
- Speech to text: given an audio recording of a person talking, transcribe the speech into text (Whisper)
- Text to speech: convert text to speech (SpeechT5)
- Zero-shot text classification: given a text and a list of labels, identify to which label the text corresponds the most (BART)
- Text summarization: summarize a long text in one or a few sentences (BART)
- Translation: translate the text into a given language (NLLB)
We also support the following community-based tools:
- Text downloader: to download a text from a web URL
- Text to image: generate an image according to a prompt, leveraging stable diffusion
- Image transformation: transforms an image
Adding New Tools
๋๋ฌด๋ ํธ๋ฆฌํ tool๋ค์ด์ง๋ง, ์ฃผ์ด์ง Tool๋ง ์ฐ๊ธฐ์๋ ํญ์ ๋ถ์กฑํ๋ค. ์ปค์คํฐ๋ง์ด์ง์ด ํ์ํ ์์ ์ด๋ค. ๋ด๊ฐ ๋ง๋ ํจ์๋ ๋ชจ๋ธ์ ์ธ์ด๋ชจ๋ธํํ ์ฃผ์ ํด์ ์ฐ๊ณ ์ถ์ผ๋ฉด Custom Tool์ ๋ง๋ค์ด์ Agent์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค. ๐๐
๋ค์๊ณผ ๊ฐ์ด ๊ท์ฌ์ด ๊ณ ์์ด ์คํธ๋ฆผ ํ์ด์ง๊ฐ ์๋ค. ์ด ์ด๋ฏธ์ง๋ ์คํธ๋ฆผ ํํ๋ก ๋งค ์ด๋ง๋ค ์๋ก์ด ์ด๋ฏธ์ง๋ก ๊ฐฑ์ ๋๋๋ฐ, ์ด ์ด๋ฏธ์ง๋ฅผ ๋ชจ์ผ๋ fetcher๋ฅผ ๋ง๋ค์ด์ custom tool๋ก ์ถ๊ฐํด ๋ณด์.
class ์ ์ธ์๋ ๋ช ๊ฐ์ง ๋ฃฐ์ด ์๋ค. Attribute์ ๋ํ ์ด๋ฆ, ์ค๋ช , ๊ทธ๋ฆฌ๊ณ ์ ์ถ๋ ฅ์ ๋ด๊ณ ์์ด์ผ ํ๋ค. ๋ํ call์ด๋ผ๋ ํจ์๋ inference code๋ก์จ ๊ผญ ์ถ๊ฐํด์ฃผ์ด์ผ ํ๋ค. ์์ธํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
This class has a few needs:
- An attribute name, which corresponds to the name of the tool itself. To be in tune with other tools which have a performative name, we'll name it text-download-counter.
- An attribute description, which will be used to populate the prompt of the agent.
- inputs and outputs attributes. Defining this will help the python interpreter make educated choices about types, and will allow for a gradio-demo to be spawned when we push our tool to the Hub. They're both a list of expected values, which can be text, image, or audio.
- A call method which contains the inference code. This is the code we've played with above!
์์ ์กฐ๊ฑด๋ค์ ์ถฉ์กฑํ๋ CatImageFetcher class๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ๋ ์ ์๋ค.
Here’s what our class looks like now:from transformers import Tool from huggingface_hub import list_models class CatImageFetcher(Tool): name = "cat_fetcher" description = ("This is a tool that fetches an actual image of a cat online. It takes no input, and returns the image of a cat.") inputs = [] outputs = ["text"] def __call__(self): return Image.open(requests.get('https://cataas.com/cat', stream=True).raw).resize((256, 256))
CatImageFetcher๋ฅผ ๋จ์ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค๋ฅ. ๐บ
์ ๋ง๋ค์ด์ง ๊ฒ์ ํ์ธํ์ผ๋, ์ด์ custom tool๋ก Agent์ ์ถ๊ฐํด ๋ณด์. ๋จ 1์ค!
from transformers.tools import HfAgent agent = HfAgent("https://api-inference.huggingface.co/models/bigcode/starcoder", additional_tools=[tool])
์ด์ agent์๊ฒ cat image๋ฅผ ๋ณด์ฌ๋ฌ๋ผ๊ณ prompt๋ฅผ ๋ ๋ฆฌ๋ฉด, ์์๋ฑ๊น์ผ์ผ๋ก cat_fetcher()๋ฅผ ์ด์ฉํ์ฌ ์ฐพ์ ์จ๋ค. ์ ๋ง ์ ๊ธฐํ๊ณ ๋ ๋ฉ์ง๋ค ๐๐
์๋์ ๊ฐ์ด ๊ธฐ์กด ์ ๊ณต ๊ธฐ๋ฅ๊ณผ ํผํฉํ์ฌ ์ฌ์ฉํ ์๋ ์๋ค.
AI๋ ๊ธฐ์ ์ ์ผ๋ก์ ๋ฐ์ ๋ฟ๋ง ์๋๋ผ ์ฌ์ฉํ๊ธฐ ์ํ ํธ์์ฑ๋ ๊ฐ์์ฑ์ฅํ๊ณ ์๋ ๋ฏํ๋ค. ์ฌ์ค ์์๋ ์ถ์ํ๊ฐ ๋๋ฌด ๋ง์ด ๋์ด์ ์๋ฉด ์์๋ก ๋ ๋ชจ๋ฅด๊ฒ ๋ค (ambiguous) . ํ์๋ researcher์ ๊ธธ๋ณด๋ค๋ engineer์ ๊ธธ์ด ๋ ๋ง๋ ๋ฏํ๋ค. ์ด์ฌํ ๋ฐ๋ผ์ก์ ๋ณด์ ๐
References
๋ณธ ์ฝ๋์ ์ ๋ฌธ์ github์ ์ ๋ก๋ ํ์์ต๋๋ค. ๋ณธ ์ฝ๋๋ transformers์์ ๋ฐ์ทํ์ฌ ๋ณํํ ์ฝ๋์ ๋๋ค.
https://github.com/yerimJu/transformers/blob/main/Transformers_can_do_anything.ipynb
https://colab.research.google.com/drive/1c7MHD-T1forUPGcC_jlwsIptOzpG3hSj
๋ฐ์ํ'BIG DATA & AI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ