DDGSWebSearch
DDGSWebSearch
DDGSWebSearch는 ddgs(Dux Distributed Global Search, 메타서치 라이브러리)로 웹을 검색해요. 여러 검색 엔진의 결과를 API 키 없이 집계합니다.
출처: 문서
본문
| 항목 | 내용 |
|---|---|
| 파이프라인에서의 일반적인 위치 | ChatPromptBuilder 앞 또는 인덱싱 파이프라인의 시작 부분 |
| 필수 init 변수 | 없음. ddgs는 API 키가 필요 없어요. |
| 필수 run 변수 | query — 검색 쿼리 문자열 |
| 출력 변수 | documents — 검색 결과 스니펫을 담은 Haystack Document 리스트(결과 제목과 URL은 메타데이터에) / links — 결과 URL 문자열 리스트 |
| API reference | ddgs API |
| GitHub link | https://github.com/deepset-ai/haystack-core-integrations/blob/main/integrations/ddgs/src/haystack_integrations/components/websearch/ddgs/ddgs_websearch.py |
| Package name | ddgs-haystack |
Overview
DDGSWebSearch에 쿼리를 주면 ddgs로 웹을 검색하고 결과 스니펫을 Haystack Document 객체로 반환해요. 또한 소스 URL 리스트도 반환합니다.
다른 websearch 컴포넌트와 달리 DDGSWebSearch는 API 키도 계정도 필요 없어요. ddgs는 공개 검색 엔진을 직접 쿼리하는 무료 메타서치 라이브러리로, DuckDuckGo, Google, Bing, Brave, Yahoo, Yandex, Mullvad 같은 백엔드의 결과를 집계합니다.
다음으로 검색을 구성할 수 있습니다:
backend— 쿼리할 ddgs 백엔드의 쉼표 구분 리스트. 예:"duckduckgo, google, brave", 또는 ddgs가 고르게 할"auto". 전체 백엔드 목록은 ddgs 문서 참고.region— 검색의 지역·로케일. 예:"us-en","de-de", 또는 지역 없는"wt-wt".safesearch— 세이프서치 수준."on","moderate","off"중 하나.top_k— 반환할 최대 결과 수.search_params— 기본DDGS().text()호출에 전달되는 추가 키워드 인자(page나timelimit등). 여기 설정한 값이backend,region,safesearch,top_k보다 우선합니다.
이 모든 것은 run()에 전달해 단일 검색에 대해 재정의할 수 있어요. run()에 넘긴 search_params 딕셔너리는 초기화 시 설정한 것과 병합되지 않고 완전히 대체한다는 점에 유의하세요.
DDGSWebSearch는 run_async()를 통한 비동기 실행도 지원해요. ddgs에는 네이티브 async API가 없으므로, 블로킹 검색이 워커 스레드에서 실행됩니다. 기본 클라이언트는 첫 검색 시 지연 생성되어요. 첫 호출의 콜드 스타트 지연을 피하려면 warm_up()을 명시적으로 호출하면 됩니다.
best-effort 결과:
ddgs는 API 계약 없이 공개 검색 엔진을 쿼리하므로 결과는 best-effort입니다. 실행마다 다를 수 있고, 과도한 사용은 제한되거나 일시적으로 차단될 수 있어요. 예측 가능한 비율 제한이 필요한 프로덕션 워크로드에는TavilyWebSearch나SerperDevWebSearch처럼 상용 검색 API로 뒷받침되는 컴포넌트를 고려하세요.
Usage
DDGSWebSearch 컴포넌트를 사용하려면 ddgs-haystack 패키지를 설치하세요:
pip install ddgs-haystack
On its own
DDGSWebSearch가 쿼리를 바탕으로 웹을 검색하고 문서 리스트를 반환하는 빠른 예시예요. API 키가 필요 없습니다.
from haystack_integrations.components.websearch.ddgs import DDGSWebSearch
web_search = DDGSWebSearch(top_k=5)
query = "What is Haystack by deepset?"
response = web_search.run(query=query)
for doc in response["documents"]:
print(doc.meta["url"])
print(doc.content)
특정 백엔드와 특정 지역으로 검색하려면:
web_search = DDGSWebSearch(
top_k=5,
backend="duckduckgo, brave",
region="de-de",
safesearch="off",
)
In a pipeline
DDGSWebSearch로 웹에서 답을 찾는 RAG(검색 증강 생성) 파이프라인 예시예요.
from haystack import Pipeline
from haystack.utils import Secret
from haystack.components.builders.chat_prompt_builder import ChatPromptBuilder
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack_integrations.components.websearch.ddgs import DDGSWebSearch
from haystack.dataclasses import ChatMessage
web_search = DDGSWebSearch(top_k=3)
prompt_template = [
ChatMessage.from_system("You are a helpful assistant."),
ChatMessage.from_user(
"Given the information below:\n"
"{% for document in documents %}{{ document.content }}\n{% endfor %}\n"
"Answer the following question: {{ query }}.\nAnswer:",
),
]
prompt_builder = ChatPromptBuilder(
template=prompt_template,
required_variables={"query", "documents"},
)
llm = OpenAIChatGenerator(
api_key=Secret.from_env_var("OPENAI_API_KEY"),
)
pipe = Pipeline()
pipe.add_component("search", web_search)
pipe.add_component("prompt_builder", prompt_builder)
pipe.add_component("llm", llm)
pipe.connect("search.documents", "prompt_builder.documents")
pipe.connect("prompt_builder.prompt", "llm.messages")
query = "What is Haystack by deepset?"
result = pipe.run(data={"search": {"query": query}, "prompt_builder": {"query": query}})
print(result["llm"]["replies"][0].text)
ddgs는 전체 페이지 내용이 아닌 짧은 스니펫만 반환하므로, 더 많은 컨텍스트가 필요할 때는 검색 뒤에 LinkContentFetcher와 컨버터를 추가해 실제 웹 페이지를 가져와 읽을 수 있어요.
더 알아보기 (Learn more)
- DDGSWebSearch — Haystack 공식 문서