Haystack 시작하기

Haystack 시작하기 (Get Started)

이 페이지에서는 Haystack을 빠르게 설치하고 첫 RAG 파이프라인을 만들고, 도구를 호출하는 에이전트(Agent)를 만드는 법을 차근차근 살펴봐요. 처음 시작하는 분들이나, 이미 다른 LLM 프레임워크를 다루다가 Haystack으로 옮겨온 분들 모두 여기서 출발하면 돼요.

출처: 공식문서

첫 RAG 애플리케이션 만들기

먼저 Retrieval Augmented Generation(RAG) 파이프라인을 하나 만들어 볼게요. RAG는 검색(Retrieval)과 생성(Generation)을 합친 방식이라, 문서를 먼저 찾고 그 문서를 바탕으로 질문에 답합니다. Haystack이 어떻게 질문에 답하는지 직접 보면 감이 잡혀요.

가장 최소 형태의 Haystack을 설치해요.

pip install haystack-ai

아래 예제에서는 API 키를 Haystack의 Secret으로 설정하는 방식을 보여줄게요. 원하는 LLM 제공자를 탭에서 고르면 되는데, 더 편하게 쓰고 싶다면 API 키를 환경 변수로 설정해도 돼요.

OpenAIChatGeneratorhaystack-ai 패키지에 포함되어 있어요.

from haystack import Pipeline, Document
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.components.retrievers import InMemoryBM25Retriever
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.builders import ChatPromptBuilder
from haystack.utils import Secret
from haystack.dataclasses import ChatMessage

document_store = InMemoryDocumentStore()

document_store.write_documents(
    [
        Document(content="My name is Jean and I live in Paris."),
        Document(content="My name is Mark and I live in Berlin."),
        Document(content="My name is Giorgio and I live in Rome."),
    ]
)

prompt_template = [
    ChatMessage.from_system(
        """
        Given these documents, answer the question.

        Documents:
        {% for doc in documents %}
        {{ doc.content }}
        {% endfor %}
        """,
    ),
    ChatMessage.from_user("{{question}}"),
]

retriever = InMemoryBM25Retriever(document_store=document_store)
prompt_builder = ChatPromptBuilder(template=prompt_template, required_variables="*")
llm = OpenAIChatGenerator(
    api_key=Secret.from_env_var("OPENAI_API_KEY"),
    model="gpt-4o-mini",
)

rag_pipeline = Pipeline()
rag_pipeline.add_component("retriever", retriever)
rag_pipeline.add_component("prompt_builder", prompt_builder)
rag_pipeline.add_component("llm", llm)

rag_pipeline.connect("retriever", "prompt_builder.documents")
rag_pipeline.connect("prompt_builder", "llm")

question = "Who lives in Paris?"
results = rag_pipeline.run(
    {
        "retriever": {"query": question},
        "prompt_builder": {"question": question},
    },
)

print(results["llm"]["replies"])

흐름을 다시 짚어 볼게요. retriever가 질문과 관련된 문서를 골라내면, prompt_builder가 그 문서들을 프롬프트에 넣고, 마지막으로 llm이 답변을 생성해요. connect로 컴포넌트 사이를 이어 주는 부분을 잘 봐 두면 나중에 파이프라인을 이해하는 데 큰 도움이 돼요.

좀 더 깊게 파고 싶다면 Creating Your First QA Pipeline with Retrieval-Augmentation 튜토리얼에서 자신의 데이터로 완전한 RAG 파이프라인을 만드는 과정을 따라 해 볼 수 있어요.

도구를 호출하는 에이전트 만들기

에이전트는 도구(tool)를 사용해서 정보를 모으고, 동작을 수행하고, 외부 시스템과 상호작용하는 AI 시스템이에요. 여기서는 웹을 검색해서 질문에 답하는 에이전트를 만들어 볼게요.

이 예제는 웹 검색을 위해 SerperDev API 키가 필요해요. SERPERDEV_API_KEY 환경 변수로 설정해 두세요.

from haystack.components.agents import Agent
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.dataclasses import ChatMessage
from haystack.tools import ComponentTool
from haystack.components.websearch import SerperDevWebSearch
from haystack.utils import Secret

search_tool = ComponentTool(component=SerperDevWebSearch())

agent = Agent(
    chat_generator=OpenAIChatGenerator(
        api_key=Secret.from_env_var("OPENAI_API_KEY"),
        model="gpt-4o-mini",
    ),
    tools=[search_tool],
    system_prompt="You are a helpful assistant that can search the web for information.",
)

result = agent.run(messages=[ChatMessage.from_user("What is Haystack AI?")])
print(result["last_message"].text)

여기서 Agent는 LLM 호출과 도구 실행, 반복을 스스로 관리해요. 사용자가 질문을 던지면 에이전트가 필요한 곳에서 search_tool을 호출하고, 그 결과를 바탕으로 최종 답변을 내놓죠. 보다 심화된 내용, 즉 컴포넌트와 파이프라인을 도구로 감싸 사용하는 방법은 Build a Tool-Calling Agent 튜토리얼을 참고해요.

더 알아보기 (Learn more)