mirror of
https://github.com/GreptimeTeam/greptimedb.git
synced 2026-10-26 13:46:23 +00:00
* feat: add experimental Jev SQL filtering Signed-off-by: Lei, HUANG <ratuthomm@gmail.com> * feat: gate Jev filtering behind an opt-in Cargo feature Signed-off-by: Lei, HUANG <ratuthomm@gmail.com> * ci: verify Jev registration with default features Run the existing registry regression without the jev feature in both PR tests and merge-queue coverage, alongside the existing feature-enabled test runs. Signed-off-by: Lei, HUANG <ratuthomm@gmail.com> * docs: clarify Jev concurrency scope and stabilization work Document the per-expression/batch concurrency bound and track process-wide limiting, rate-limit backoff, and request budgets and metrics as stabilization prerequisites. Signed-off-by: Lei, HUANG <ratuthomm@gmail.com> * feat: enable renamed ai-functions feature by default Rename the Jev Cargo feature across the command, query, and function crates and enable it in their defaults. Update CI and documentation, retaining an isolated no-default-features registry check and the runtime API opt-in. Signed-off-by: Lei, HUANG <ratuthomm@gmail.com> * ci: remove extra AI feature-off checks Use the regular AI-enabled unit and coverage runs for the default feature configuration. Keep feature-off validation available locally and update the usage guide to match. Signed-off-by: Lei, HUANG <ratuthomm@gmail.com> * refactor: rename AI feature to ai_functions Signed-off-by: Lei, HUANG <ratuthomm@gmail.com> --------- Signed-off-by: Lei, HUANG <ratuthomm@gmail.com>
120 lines
4.5 KiB
Markdown
120 lines
4.5 KiB
Markdown
# Natural-language filtering with Jev (experimental MVP)
|
|
|
|
`jev(text, statement, threshold)` returns whether Jev judges the statement true
|
|
for the text with probability **greater than or equal to** the threshold.
|
|
It is an asynchronous SQL scalar function usable in `WHERE` and `SELECT`.
|
|
|
|
## Start GreptimeDB
|
|
|
|
Jev is compiled and registered by the **default-enabled Cargo feature
|
|
`ai_functions`**. Enable API evaluation separately in the server process:
|
|
|
|
```sh
|
|
export GREPTIMEDB_EXPERIMENTAL_JEV=true
|
|
export JEV_API_KEY='<your TypeSafe API key>'
|
|
cargo run -p cmd -- standalone start
|
|
```
|
|
|
|
If your key is already exported in `~/.zshrc`, run `source ~/.zshrc` first.
|
|
The optional `JEV_MODEL` defaults to `jev-latest`; `JEV_ENDPOINT` defaults to
|
|
`https://api.typesafe.ai/v1/systemone` (the full evaluation endpoint URL).
|
|
The MVP uses environment variables rather than TOML configuration.
|
|
The Cargo feature includes the SQL function in the build; the runtime environment
|
|
variables enable and configure its API calls. Default compilation does not turn
|
|
on external API calls. To enable the feature explicitly, use
|
|
`--features ai_functions`.
|
|
|
|
## Query
|
|
|
|
For a new example table, quote `service` and `message` in the DDL because the
|
|
current parser treats them as keywords:
|
|
|
|
```sql
|
|
CREATE TABLE events (
|
|
occurred_at TIMESTAMP TIME INDEX,
|
|
"service" STRING,
|
|
"message" STRING,
|
|
PRIMARY KEY ("service")
|
|
);
|
|
```
|
|
|
|
```sql
|
|
SELECT occurred_at, service, message
|
|
FROM events
|
|
WHERE occurred_at >= '2026-09-19T00:00:00Z'
|
|
AND occurred_at < '2026-09-20T00:00:00Z'
|
|
AND service = 'payments'
|
|
AND jev(
|
|
(message),
|
|
'The event reports that a payment still failed after retries.',
|
|
0.8
|
|
)
|
|
ORDER BY occurred_at;
|
|
```
|
|
|
|
The first two arguments are strings and the third is a number in `[0, 1]`.
|
|
`(message)` is an ordinary parenthesized string expression. For several columns,
|
|
combine them explicitly, for example `concat(service, ': ', message)`.
|
|
Any null argument produces SQL `NULL`, which `WHERE` excludes, without an API call.
|
|
|
|
## MVP behavior
|
|
|
|
- Each non-null row makes one HTTP request: the text is `state`, and the statement
|
|
is a `noul` question's `instructions`. The returned `noul` probability is compared
|
|
with the threshold locally; this is not the separate Choice/Score confidence.
|
|
- Up to eight requests run concurrently per expression/batch invocation, not per
|
|
query or process. Concurrent partitions and queries can exceed eight requests
|
|
in total. Each request has a 30-second timeout. Errors (including rate limits
|
|
and invalid responses) fail the query. There is no automatic retry or
|
|
cross-query cache.
|
|
- Start with small, time-bounded queries. Ordinary SQL predicates can reduce the
|
|
candidate set, but SQL does not guarantee left-to-right predicate evaluation or
|
|
that `LIMIT` bounds the number of API calls.
|
|
- Text passed to the function is sent to the configured TypeSafe endpoint.
|
|
The API key remains in the server environment, not in SQL.
|
|
- This MVP is intended for standalone use. A distributed deployment would need
|
|
the environment on every node evaluating the function and separate validation.
|
|
|
|
API reference: <https://docs.typesafe.ai/api>
|
|
|
|
## Before stabilizing
|
|
|
|
The experimental MVP still needs the following controls before stabilization:
|
|
|
|
- A process-wide concurrency limit shared by Jev invocations, such as a semaphore.
|
|
- Bounded retries with exponential backoff for HTTP `429` and `529`, following
|
|
TypeSafe's rate-limit guidance.
|
|
- Request budgets and metrics for API calls, latency, retries, and rate-limit errors.
|
|
|
|
These are follow-up work, not guarantees provided by the current implementation.
|
|
|
|
## Validation
|
|
|
|
Check both the default build (where `jev` is registered) and an isolated
|
|
`common-function` build without default features. Jev's regular tests use a local
|
|
HTTP server and need no API key:
|
|
|
|
```sh
|
|
cargo nextest run -p common-function
|
|
cargo nextest run -p common-function --no-default-features
|
|
cargo nextest run -p common-function --no-default-features --features ai_functions
|
|
```
|
|
|
|
The sqlness runner explicitly includes `ai_functions` when building its test binary:
|
|
|
|
```sh
|
|
cargo sqlness bare -t jev
|
|
```
|
|
|
|
If using `--bins-dir`, provide a binary built with `ai_functions` (included by
|
|
default). CI covers the AI-enabled path through the regular unit tests and
|
|
sqlness tests; the feature-off checks above can be run locally when needed.
|
|
|
|
An opt-in test calls the real service on synthetic payment events:
|
|
|
|
```sh
|
|
source ~/.zshrc
|
|
GREPTIMEDB_EXPERIMENTAL_JEV=true cargo nextest run -p common-function \
|
|
-E 'test(test_jev_live)' --run-ignored ignored-only
|
|
```
|