Skip to main content

Search and answer generation

Nuclia supports 2 different search endpoints:

  • search: returns several result sets according the different search techniques (full-text, fuzzy, semantic).
  • find: returns a single result set where all different results are merged into a hierarchical structure.

Both endpoints support the same query parameters.

  • CLI:

    nuclia kb search search --query="My search"
    nuclia kb search find --query="My search" --filters="['/icon/application/pdf','/classification.labels/region/Asia']"
  • SDK:

    from nuclia import sdk
    search = sdk.NucliaSearch()
    search.search(query="My search", filters=['/icon/application/pdf', '/classification.labels/region/Asia'])
    search.find(query="My search")

Get JSON output:

nuclia kb search find --query="My search" --json

Get YAML output:

nuclia kb search search --query="My search" --yaml

Generative answer

Based on a find request, Nuclia uses a generative AI to answer the question based on the context without hallucinations and with the find result and relations.

  • CLI:

    nuclia kb search ask --query="My question"
  • SDK:

    from nuclia import sdk
    search = sdk.NucliaSearch()
    search.ask(query="My question")

    You can also use the AskRequest item to configure the request with all the parameters supported:

    from nuclia import sdk
    from nucliadb_models.search import AskRequest

    search = sdk.NucliaSearch()
    query = AskRequest(query="My question", prefer_markdown=True, citations=True)
    search.ask(query)

Filtering

Any endpoint that involves search (search, find and ask) also support more advanced filtering expressions. Expressions can have one of the following operators:

  • all: this is the default. Will make search return results containing all specified filter labels.
  • any: returns results containing at least one of the labels.
  • none: returns results that do not contain any of the labels.
  • not_all: returns results that do not contain all specified labels.

Note that multiple expressions can be chained in the filters parameter and the conjunction of all of them will be computed.

Here are some examples:

  • CLI:

    nuclia kb search find --query="My search" --filters="[{'any':['/icon/application/pdf','/icon/image/mp4']}]"
  • SDK:

    from nuclia import sdk
    from nucliadb_models.search import Filter

    search = sdk.NucliaSearch()
    search.ask(
    query="My question",
    filters=[Filter(any=['/classification.labels/region/Europe','/classification.labels/region/Asia'])],
    )

Using RAG strategies

RAG strategies can be used to improve the quality of the answers by extending the search results passed to the LLM as context.

  • CLI:

    nuclia kb search ask --query="My question" --rag_strategies='[{"name":"hierarchy"}]'
  • SDK:

    from nuclia import sdk
    search = sdk.NucliaSearch()
    search.ask(query="My question", rag_strategies=[{"name": "hierarchy"}])

See the RAG strategies documentation for more information.

Complex queries

The Python SDK allows to use all the options supported by the /find and /ask endpoints, but not all of the options can be passed as specific parameter. In these cases, you can just pass your query as a dictionnary in the query parameter.

  • CLI:

    nuclia kb search find --query='{"query": "My search", "filters": ["/icon/application/pdf", "/classification.labels/region/Asia"]}'
    nuclia kb search ask --query='{"query": "My search","top_k": 5}'
  • SDK:

    from nuclia import sdk
    search = sdk.NucliaSearch()
    search.find(query={"query": "My search", "filters": ["/icon/application/pdf", "/classification.labels/region/Asia"]})
    search.ask(query={"query": "My search","top_k": 5})