SerperDevWebSearch

SerperDevWebSearch

SerperDevWebSearch 는 SerperDev API를 사용하는 검색 엔진 컴포넌트예요. 질의를 넣으면 검색 결과로 나온 문서와 링크 목록을 반환해 주죠. 웹 검색을 파이프라인에 넣어 RAG를 구성할 때 자주 쓰여요.

출처: 문서

본문

개요 (Overview)

SerperDevWebSearch 에 질의를 주면 검색과 가장 관련 있는 URL 목록을 돌려줘요. 이때 전체 페이지를 읽는 대신 페이지 스니펫(검색 결과에서 페이지 제목 아래에 표시되는 텍스트 조각)을 이용해 답을 찾아요.

웹 페이지의 본문 내용을 검색하려면 LinkContentFetcher 컴포넌트를 쓰세요.

SerperDevWebSearch 는 동작에 SerperDev 키가 필요해요. 기본적으로 SERPERDEV_API_KEY 환경 변수를 사용하고, 초기화 시점에 api_key 를 직접 넘겨줄 수도 있어요(아래 코드 예시 참고).

대안 검색: Search API를 대안으로 쓰고 싶다면 해당 문서 페이지를 참고하세요.

사용법 (Usage)

SerperDevWebSearch 컴포넌트를 쓰려면 serperdev-haystack 패키지를 설치해야 해요:

pip install serperdev-haystack

단독으로 쓰기

다음은 SerperDevWebSearch 가 질의에 대한 답을 웹에서 찾아, 결과의 내용 스니펫과 URL 문자열을 담은 문서 목록으로 변환하는 예시예요.

from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch
from haystack.utils import Secret

web_search = SerperDevWebSearch(api_key=Secret.from_token(""))
query = "What is the capital of Germany?"
response = web_search.run(query)

파이프라인에서 쓰기

RAG 파이프라인 예시예요. SerperDevWebSearch 로 질의에 대한 답을 찾고, 결과 문서를 LinkContentFetcher 에 넘겨 URL에서 전체 텍스트를 가져와요. 마지막으로 ChatPromptBuilder 와 OpenAIChatGenerator 가 협력해 최종 답변을 만듭니다.

from haystack import Pipeline
from haystack.utils import Secret
from haystack.components.builders.chat_prompt_builder import ChatPromptBuilder
from haystack.components.fetchers import LinkContentFetcher
from haystack.components.converters import HTMLToDocument
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch
from haystack.dataclasses import ChatMessage
from haystack.utils import Secret

web_search = SerperDevWebSearch(api_key=Secret.from_token(""), top_k=2)
link_content = LinkContentFetcher()
html_converter = HTMLToDocument()

prompt_template = [
    ChatMessage.from_system("You are a helpful assistant."),
    ChatMessage.from_user(
        "Given the information below:\n"
        "{% for document in documents %}{{ document.content }}{% endfor %}\n"
        "Answer question: {{ query }}.\nAnswer:"
    ),
]

prompt_builder = ChatPromptBuilder(
    template=prompt_template,
    required_variables={"query", "documents"},
)
llm = OpenAIChatGenerator(
    api_key=Secret.from_token(""),
)

pipe = Pipeline()
pipe.add_component("search", web_search)
pipe.add_component("fetcher", link_content)
pipe.add_component("converter", html_converter)
pipe.add_component("prompt_builder", prompt_builder)
pipe.add_component("llm", llm)

pipe.connect("search.links", "fetcher.urls")
pipe.connect("fetcher.streams", "converter.sources")
pipe.connect("converter.documents", "prompt_builder.documents")
pipe.connect("prompt_builder.prompt", "llm.messages")

query = "What is the most famous landmark in Berlin?"
pipe.run(data={"search": {"query": query}, "prompt_builder": {"query": query}})

YAML로 쓰기

위 RAG 파이프라인의 YAML 표현이에요. 웹을 검색하고 결과 페이지를 가져와 텍스트로 변환한 뒤, 내용으로 프롬프트를 만들고 채팅 모델로 답변을 생성해요. 핵심 구조는 아래와 같아요:

components:
  search:
    init_parameters:
      api_key:
        env_vars:
        - SERPERDEV_API_KEY
        strict: true
        type: env_var
      top_k: 2
    type: haystack_integrations.components.websearch.serperdev.websearch.SerperDevWebSearch
  fetcher:
    type: haystack.components.fetchers.link_content.LinkContentFetcher
  converter:
    type: haystack.components.converters.html.HTMLToDocument
  prompt_builder:
    type: haystack.components.builders.chat_prompt_builder.ChatPromptBuilder
  llm:
    init_parameters:
      model: gpt-4o-mini
    type: haystack.components.generators.chat.openai.OpenAIChatGenerator
connections:
- receiver: fetcher.urls
  sender: search.links
- receiver: converter.sources
  sender: fetcher.streams
- receiver: prompt_builder.documents
  sender: converter.documents
- receiver: llm.messages
  sender: prompt_builder.prompt

참고: 위 YAML은 구조 위주의 요약본이에요. 전체 세부 설정(타임아웃, 리트라이, 각 템플릿 상세 등)은 원문에서 확인할 수 있어요.

추가 자료 (Additional References)

📓 튜토리얼: 조건부 라우팅으로 웹검색 폴백(Fallback) 구축하기

더 알아보기 (Learn more)