- Notifications
You must be signed in to change notification settings - Fork568
Open Source Deep Research Alternative to Reason and Search on Private Data. Written in Python.
License
zilliztech/deep-searcher
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
DeepSearcher combines cutting-edge LLMs (OpenAI o3, Qwen3, DeepSeek, Grok 3, Claude 3.7 Sonnet, Llama 4, QwQ, etc.) and Vector Databases (Milvus, Zilliz Cloud etc.) to perform search, evaluation, and reasoning based on private data, providing highly accurate answer and comprehensive report. This project is suitable for enterprise knowledge management, intelligent Q&A systems, and information retrieval scenarios.
- Private Data Search: Maximizes the utilization of enterprise internal data while ensuring data security. When necessary, it can integrate online content for more accurate answers.
- Vector Database Management: Supports Milvus and other vector databases, allowing data partitioning for efficient retrieval.
- Flexible Embedding Options: Compatible with multiple embedding models for optimal selection.
- Multiple LLM Support: Supports DeepSeek, OpenAI, and other large models for intelligent Q&A and content generation.
- Document Loader: Supports local file loading, with web crawling capabilities under development.
Install DeepSearcher using one of the following methods:
Create and activate a virtual environment(Python 3.10 version is recommended).
python -m venv .venvsource .venv/bin/activate
Install DeepSearcher
pip install deepsearcher
For optional dependencies, e.g., ollama:
pip install"deepsearcher[ollama]"
We recommend usinguv for faster and more reliable installation. Follow theoffical installation instructions to install it.
Clone the repository and navigate to the project directory:
git clone https://github.com/zilliztech/deep-searcher.git&&cd deep-searcher
Synchronize and install dependencies:
uv syncsource .venv/bin/activate
For more detailed development setup and optional dependency installation options, seeCONTRIBUTING.md.
To run this quick start demo, please prepare yourOPENAI_API_KEY
in your environment variables. If you change the LLM in the configuration, make sure to prepare the corresponding API key.
fromdeepsearcher.configurationimportConfiguration,init_configfromdeepsearcher.online_queryimportqueryconfig=Configuration()# Customize your config here,# more configuration see the Configuration Details section below.config.set_provider_config("llm","OpenAI", {"model":"o1-mini"})config.set_provider_config("embedding","OpenAIEmbedding", {"model":"text-embedding-ada-002"})init_config(config=config)# Load your local datafromdeepsearcher.offline_loadingimportload_from_local_filesload_from_local_files(paths_or_directory=your_local_path)# (Optional) Load from web crawling (`FIRECRAWL_API_KEY` env variable required)fromdeepsearcher.offline_loadingimportload_from_websiteload_from_website(urls=website_url)# Queryresult=query("Write a report about xxx.")# Your question here
config.set_provider_config("llm", "(LLMName)", "(Arguments dict)")
The "LLMName" can be one of the following: ["DeepSeek", "OpenAI", "XAI", "SiliconFlow", "Aliyun", "PPIO", "TogetherAI", "Gemini", "Ollama", "Novita"]
The "Arguments dict" is a dictionary that contains the necessary arguments for the LLM class.
Example (OpenAI)
Make sure you have prepared your OPENAI API KEY as an env variableOPENAI_API_KEY
.
config.set_provider_config("llm", "OpenAI", {"model": "o1-mini"})
More details about OpenAI models:https://platform.openai.com/docs/models
Example (Qwen3 from Aliyun Bailian)
Make sure you have prepared your Bailian API KEY as an env variableDASHSCOPE_API_KEY
.
config.set_provider_config("llm", "Aliyun", {"model": "qwen-plus-latest"})
More details about Aliyun Bailian models:https://bailian.console.aliyun.com
Example (Qwen3 from OpenRouter)
config.set_provider_config("llm", "OpenAI", {"model": "qwen/qwen3-235b-a22b:free", "base_url": "https://openrouter.ai/api/v1", "api_key": "OPENROUTER_API_KEY"})
More details about OpenRouter models:https://openrouter.ai/qwen/qwen3-235b-a22b:free
Example (DeepSeek from official)
Make sure you have prepared your DEEPSEEK API KEY as an env variableDEEPSEEK_API_KEY
.
config.set_provider_config("llm", "DeepSeek", {"model": "deepseek-reasoner"})
More details about DeepSeek:https://api-docs.deepseek.com/
Example (DeepSeek from SiliconFlow)
Make sure you have prepared your SILICONFLOW API KEY as an env variableSILICONFLOW_API_KEY
.
config.set_provider_config("llm", "SiliconFlow", {"model": "deepseek-ai/DeepSeek-R1"})
More details about SiliconFlow:https://docs.siliconflow.cn/quickstart
Example (DeepSeek from TogetherAI)
Make sure you have prepared your TOGETHER API KEY as an env variableTOGETHER_API_KEY
.
config.set_provider_config("llm", "TogetherAI", {"model": "deepseek-ai/DeepSeek-R1"})
config.set_provider_config("llm", "TogetherAI", {"model": "meta-llama/Llama-4-Scout-17B-16E-Instruct"})
You need to install together before running, execute:pip install together
. More details about TogetherAI:https://www.together.ai/
Example (XAI Grok)
Make sure you have prepared your XAI API KEY as an env variableXAI_API_KEY
.
config.set_provider_config("llm", "XAI", {"model": "grok-2-latest"})
More details about XAI Grok:https://docs.x.ai/docs/overview#featured-models
Example (Claude)
Make sure you have prepared your ANTHROPIC API KEY as an env variableANTHROPIC_API_KEY
.
config.set_provider_config("llm", "Anthropic", {"model": "claude-3-7-sonnet-latest"})
More details about Anthropic Claude:https://docs.anthropic.com/en/home
Example (Google Gemini)
Make sure you have prepared your GEMINI API KEY as an env variableGEMINI_API_KEY
.
config.set_provider_config('llm', 'Gemini', { 'model': 'gemini-2.0-flash' })
You need to install gemini before running, execute:pip install google-genai
. More details about Gemini:https://ai.google.dev/gemini-api/docs
Example (DeepSeek from PPIO)
Make sure you have prepared your PPIO API KEY as an env variablePPIO_API_KEY
. You can create an API Keyhere.
config.set_provider_config("llm", "PPIO", {"model": "deepseek/deepseek-r1-turbo"})
More details about PPIO:https://ppinfra.com/docs/get-started/quickstart.html?utm_source=github_deep-searcher
Example (Ollama)
Followthese instructions to set up and run a local Ollama instance:
Download and install Ollama onto the available supported platforms (including Windows Subsystem for Linux).
View a list of available models via themodel library.
Fetch available LLM models viaollama pull <name-of-model>
Example:ollama pull qwen3
To chat directly with a model from the command line, useollama run <name-of-model>
.
By default, Ollama has a REST API for running and managing models onhttp://localhost:11434.
config.set_provider_config("llm", "Ollama", {"model": "qwen3"})
Example (Volcengine)
Make sure you have prepared your Volcengine API KEY as an env variableVOLCENGINE_API_KEY
. You can create an API Keyhere.
config.set_provider_config("llm", "Volcengine", {"model": "deepseek-r1-250120"})
More details about Volcengine:https://www.volcengine.com/docs/82379/1099455?utm_source=github_deep-searcher
Example (GLM)
Make sure you have prepared your GLM API KEY as an env variableGLM_API_KEY
.
config.set_provider_config("llm", "GLM", {"model": "glm-4-plus"})
You need to install zhipuai before running, execute:pip install zhipuai
. More details about GLM:https://bigmodel.cn/dev/welcome
Example (Amazon Bedrock)
Make sure you have prepared your Amazon Bedrock API KEY as an env variableAWS_ACCESS_KEY_ID
andAWS_SECRET_ACCESS_KEY
.
config.set_provider_config("llm", "Bedrock", {"model": "us.deepseek.r1-v1:0"})
You need to install boto3 before running, execute:pip install boto3
. More details about Amazon Bedrock:https://docs.aws.amazon.com/bedrock/
config.set_provider_config("embedding", "(EmbeddingModelName)", "(Arguments dict)")
The "EmbeddingModelName" can be one of the following: ["MilvusEmbedding", "OpenAIEmbedding", "VoyageEmbedding", "SiliconflowEmbedding", "PPIOEmbedding", "NovitaEmbedding"]
The "Arguments dict" is a dictionary that contains the necessary arguments for the embedding model class.
Example (OpenAI embedding)
Make sure you have prepared your OpenAI API KEY as an env variableOPENAI_API_KEY
.
config.set_provider_config("embedding", "OpenAIEmbedding", {"model": "text-embedding-3-small"})
More details about OpenAI models:https://platform.openai.com/docs/guides/embeddings/use-cases
Example (OpenAI embedding Azure)
Make sure you have prepared your OpenAI API KEY as an env variableOPENAI_API_KEY
.
config.set_provider_config("embedding", "OpenAIEmbedding", { "model": "text-embedding-ada-002", "azure_endpoint": "https://.openai.azure.com/", "api_version": "2023-05-15"})
Example (Pymilvus built-in embedding model)
Use the built-in embedding model in Pymilvus, you can set the model name as"default"
,"BAAI/bge-base-en-v1.5"
,"BAAI/bge-large-en-v1.5"
,"jina-embeddings-v3"
, etc.
See [milvus_embedding.py](deepsearcher/embedding/milvus_embedding.py) for more details.
config.set_provider_config("embedding", "MilvusEmbedding", {"model": "BAAI/bge-base-en-v1.5"})
config.set_provider_config("embedding", "MilvusEmbedding", {"model": "jina-embeddings-v3"})
For Jina's embedding model, you needJINAAI_API_KEY
.
You need to install pymilvus model before running, execute:pip install pymilvus.model
. More details about Pymilvus:https://milvus.io/docs/embeddings.md
Example (VoyageAI embedding)
Make sure you have prepared your VOYAGE API KEY as an env variableVOYAGE_API_KEY
.
config.set_provider_config("embedding", "VoyageEmbedding", {"model": "voyage-3"})
You need to install voyageai before running, execute:pip install voyageai
. More details about VoyageAI:https://docs.voyageai.com/embeddings/
Example (Amazon Bedrock embedding)
config.set_provider_config("embedding", "BedrockEmbedding", {"model": "amazon.titan-embed-text-v2:0"})
You need to install boto3 before running, execute:pip install boto3
. More details about Amazon Bedrock:https://docs.aws.amazon.com/bedrock/
Example (Novita AI embedding)
Make sure you have prepared your Novita AI API KEY as an env variableNOVITA_API_KEY
.
config.set_provider_config("embedding", "NovitaEmbedding", {"model": "baai/bge-m3"})
More details about Novita AI:https://novita.ai/docs/api-reference/model-apis-llm-create-embeddings?utm_source=github_deep-searcher&utm_medium=github_readme&utm_campaign=link
Example (Siliconflow embedding)
Make sure you have prepared your Siliconflow API KEY as an env variableSILICONFLOW_API_KEY
.
config.set_provider_config("embedding", "SiliconflowEmbedding", {"model": "BAAI/bge-m3"})
More details about Siliconflow:https://docs.siliconflow.cn/en/api-reference/embeddings/create-embeddings
Example (Volcengine embedding)
Make sure you have prepared your Volcengine API KEY as an env variableVOLCENGINE_API_KEY
.
config.set_provider_config("embedding", "VolcengineEmbedding", {"model": "doubao-embedding-text-240515"})
More details about Volcengine:https://www.volcengine.com/docs/82379/1302003
Example (GLM embedding)
Make sure you have prepared your GLM API KEY as an env variableGLM_API_KEY
.
config.set_provider_config("embedding", "GLMEmbedding", {"model": "embedding-3"})
You need to install zhipuai before running, execute:pip install zhipuai
. More details about GLM:https://bigmodel.cn/dev/welcome
Example (Google Gemini embedding)
Make sure you have prepared your Gemini API KEY as an env variableGEMINI_API_KEY
.
config.set_provider_config("embedding", "GeminiEmbedding", {"model": "text-embedding-004"})
You need to install gemini before running, execute:pip install google-genai
. More details about Gemini:https://ai.google.dev/gemini-api/docs
Example (Ollama embedding)
config.set_provider_config("embedding", "OllamaEmbedding", {"model": "bge-m3"})
You need to install ollama before running, execute:pip install ollama
. More details about Ollama Python SDK:https://github.com/ollama/ollama-python
Example (PPIO embedding)
Make sure you have prepared your PPIO API KEY as an env variablePPIO_API_KEY
.
config.set_provider_config("embedding", "PPIOEmbedding", {"model": "baai/bge-m3"})
More details about PPIO:https://ppinfra.com/docs/get-started/quickstart.html?utm_source=github_deep-searcher
config.set_provider_config("vector_db", "(VectorDBName)", "(Arguments dict)")
The "VectorDBName" can be one of the following: ["Milvus"] (Under development)
The "Arguments dict" is a dictionary that contains the necessary arguments for the Vector Database class.
Example (Milvus)
config.set_provider_config("vector_db", "Milvus", {"uri": "./milvus.db", "token": ""})
More details about Milvus Config:
- Setting the
uri
as a local file, e.g../milvus.db
, is the most convenient method, as it automatically utilizesMilvus Lite to store all data in this file.
- If you have a large-scale dataset, you can set up a more performant Milvus server usingDocker or Kubernetes. In this setup, use the server URI, e.g.,
http://localhost:19530
, as youruri
.
- If you want to useZilliz Cloud, the fully managed cloud service for Milvus, adjust the
uri
andtoken
according to thePublic Endpoint and API Key in Zilliz Cloud.
Example (AZURE AI Search)
config.set_provider_config("vector_db", "AzureSearch", { "endpoint": "https://.search.windows.net", "index_name": "", "api_key": "", "vector_field": ""})
More details about Milvus Config:
config.set_provider_config("file_loader", "(FileLoaderName)", "(Arguments dict)")
The "FileLoaderName" can be one of the following: ["PDFLoader", "TextLoader", "UnstructuredLoader"]
The "Arguments dict" is a dictionary that contains the necessary arguments for the File Loader class.
Example (Unstructured)
You can use Unstructured in two ways:
- With API: Set environment variables
UNSTRUCTURED_API_KEY
andUNSTRUCTURED_API_URL
- Without API: Use the local processing mode by simply not setting these environment variables
config.set_provider_config("file_loader", "UnstructuredLoader", {})
- Currently supported file types: ["pdf"] (Under development)
- Installation requirements:
- Install ingest pipeline:
pip install unstructured-ingest
- For all document formats:
pip install "unstructured[all-docs]"
- For specific formats (e.g., PDF only):
pip install "unstructured[pdf]"
- Install ingest pipeline:
- More information:
- Unstructured documentation:https://docs.unstructured.io/ingestion/overview
- Installation guide:https://docs.unstructured.io/open-source/installation/full-installation
Example (Docling)
config.set_provider_config("file_loader", "DoclingLoader", {})
Currently supported file types: please refer to the Docling documentation:https://docling-project.github.io/docling/usage/supported_formats/#supported-output-formats
You need to install docling before running, execute:pip install docling
. More details about Docling:https://docling-project.github.io/docling/
config.set_provider_config("web_crawler", "(WebCrawlerName)", "(Arguments dict)")
The "WebCrawlerName" can be one of the following: ["FireCrawlCrawler", "Crawl4AICrawler", "JinaCrawler"]
The "Arguments dict" is a dictionary that contains the necessary arguments for the Web Crawler class.
Example (FireCrawl)
Make sure you have prepared your FireCrawl API KEY as an env variableFIRECRAWL_API_KEY
.
config.set_provider_config("web_crawler", "FireCrawlCrawler", {})
More details about FireCrawl:https://docs.firecrawl.dev/introduction
Example (Crawl4AI)
Make sure you have runcrawl4ai-setup
in your environment.
config.set_provider_config("web_crawler", "Crawl4AICrawler", {"browser_config": {"headless": True, "verbose": True}})
You need to install crawl4ai before running, execute:pip install crawl4ai
. More details about Crawl4AI:https://docs.crawl4ai.com/
Example (Jina Reader)
Make sure you have prepared your Jina Reader API KEY as an env variableJINA_API_TOKEN
orJINAAI_API_KEY
.
config.set_provider_config("web_crawler", "JinaCrawler", {})
More details about Jina Reader:https://jina.ai/reader/
Example (Docling)
config.set_provider_config("web_crawler", "DoclingCrawler", {})
Currently supported file types: please refer to the Docling documentation:https://docling-project.github.io/docling/usage/supported_formats/#supported-output-formats
You need to install docling before running, execute:pip install docling
. More details about Docling:https://docling-project.github.io/docling/
deepsearcher load"your_local_path_or_url"# load into a specific collectiondeepsearcher load"your_local_path_or_url" --collection_name"your_collection_name" --collection_desc"your_collection_description"
Example loading from local file:
deepsearcher load"/path/to/your/local/file.pdf"# or more files at oncedeepsearcher load"/path/to/your/local/file1.pdf""/path/to/your/local/file2.md"
Example loading from url (SetFIRECRAWL_API_KEY
in your environment variables, seeFireCrawl for more details):
deepsearcher load"https://www.wikiwand.com/en/articles/DeepSeek"
deepsearcher query"Write a report about xxx."
More help information
deepsearcher --help
For more help information about a specific subcommand, you can usedeepsearcher [subcommand] --help
.
deepsearcher load --helpdeepsearcher query --help
You can configure all arguments by modifyingconfig.yaml to set up your system with default modules.For example, set yourOPENAI_API_KEY
in thellm
section of the YAML file.
The main script will run a FastAPI service with default addresslocalhost:8000
.
$ python main.py
You can open urlhttp://localhost:8000/docs in browser to access the web service.Click on the button "Try it out", it allows you to fill the parameters and directly interact with the API.
Q1: Why I failed to parse LLM output format / How to select the LLM?
A1: Small LLMs struggle to follow the prompt to generate a desired response, which usually cause the format parsing problem. A better practice is to use large reasoning models e.g. deepseek-r1 671b, OpenAI o-series, Claude 3.7 sonnet, etc. as your LLM.
Q2:OSError: We couldn't connect to 'https://huggingface.co' to load this file, couldn't find it in the cached files and it looks like GPTCache/paraphrase-albert-small-v2 is not the path to a directory containing a file named config.json.Checkout your internet connection or see how to run the library in offline mode at 'https://huggingface.co/docs/transformers/installation#offline-mode'.
A2: This is mainly due to abnormal access to huggingface, which may be a network or permission problem. You can try the following two methods:
- If there is a network problem, set up a proxy, try adding the following environment variable.
export HF_ENDPOINT=https://hf-mirror.com
- If there is a permission problem, set up a personal token, try adding the following environment variable.
export HUGGING_FACE_HUB_TOKEN=xxxx
Q3: DeepSearcher doesn't run in Jupyter notebook.
A3: Installnest_asyncio
and then put this code block in front of your jupyter notebook.
pip install nest_asyncio
import nest_asyncionest_asyncio.apply()
- Open-source embedding models
- OpenAI (
OPENAI_API_KEY
env variable required) - VoyageAI (
VOYAGE_API_KEY
env variable required) - Amazon Bedrock (
AWS_ACCESS_KEY_ID
andAWS_SECRET_ACCESS_KEY
env variable required) - FastEmbed
- PPIO (
PPIO_API_KEY
env variable required) - Novita AI (
NOVITA_API_KEY
env variable required)
- OpenAI (
OPENAI_API_KEY
env variable required) - DeepSeek (
DEEPSEEK_API_KEY
env variable required) - XAI Grok (
XAI_API_KEY
env variable required) - Anthropic Claude (
ANTHROPIC_API_KEY
env variable required) - SiliconFlow Inference Service (
SILICONFLOW_API_KEY
env variable required) - PPIO (
PPIO_API_KEY
env variable required) - TogetherAI Inference Service (
TOGETHER_API_KEY
env variable required) - Google Gemini (
GEMINI_API_KEY
env variable required) - SambaNova Cloud Inference Service (
SAMBANOVA_API_KEY
env variable required) - Ollama
- Novita AI (
NOVITA_API_KEY
env variable required)
- Local File
- PDF(with txt/md) loader
- Unstructured (under development) (
UNSTRUCTURED_API_KEY
andUNSTRUCTURED_URL
env variables required)
- Web Crawler
- FireCrawl (
FIRECRAWL_API_KEY
env variable required) - Jina Reader (
JINA_API_TOKEN
env variable required) - Crawl4AI (You should run command
crawl4ai-setup
for the first time)
- FireCrawl (
- Milvus andZilliz Cloud (fully managed Milvus)
- Qdrant
See theEvaluation directory for more details.
- Enhance web crawling functionality
- Support more vector databases (e.g., FAISS...)
- Add support for additional large models
- Provide RESTful API interface (DONE)
We welcome contributions! Star & Fork the project and help us build a more powerful DeepSearcher! 🎯
About
Open Source Deep Research Alternative to Reason and Search on Private Data. Written in Python.