Skip to content

Commit f9c72c1

Browse files
authored
[ES\QL] Text embedding function constant folding (#135710)
1 parent 8938100 commit f9c72c1

File tree

19 files changed

+903
-43
lines changed

19 files changed

+903
-43
lines changed

docs/reference/query-languages/esql/_snippets/functions/description/text_embedding.md

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/reference/query-languages/esql/_snippets/functions/examples/text_embedding.md

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/reference/query-languages/esql/_snippets/functions/layout/text_embedding.md

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/reference/query-languages/esql/_snippets/functions/parameters/text_embedding.md

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/reference/query-languages/esql/_snippets/functions/types/text_embedding.md

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/reference/query-languages/esql/kibana/definition/functions/text_embedding.json

Lines changed: 20 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/plugin/esql/qa/server/src/main/java/org/elasticsearch/xpack/esql/qa/rest/EsqlSpecTestCase.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.RERANK;
7878
import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.SEMANTIC_TEXT_FIELD_CAPS;
7979
import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.SOURCE_FIELD_MAPPING;
80+
import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.TEXT_EMBEDDING_FUNCTION;
8081
import static org.elasticsearch.xpack.esql.qa.rest.RestEsqlTestCase.assertNotPartial;
8182
import static org.elasticsearch.xpack.esql.qa.rest.RestEsqlTestCase.hasCapabilities;
8283

@@ -224,7 +225,8 @@ protected boolean requiresInferenceEndpoint() {
224225
SEMANTIC_TEXT_FIELD_CAPS.capabilityName(),
225226
RERANK.capabilityName(),
226227
COMPLETION.capabilityName(),
227-
KNN_FUNCTION_V5.capabilityName()
228+
KNN_FUNCTION_V5.capabilityName(),
229+
TEXT_EMBEDDING_FUNCTION.capabilityName()
228230
).anyMatch(testCase.requiredCapabilities::contains);
229231
}
230232

Lines changed: 78 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,91 @@
1-
placeholder
1+
text_embedding using a row source operator
22
required_capability: text_embedding_function
3-
required_capability: not_existing_capability
3+
required_capability: dense_vector_field_type_released
44

55
// tag::embedding-eval[]
66
ROW input="Who is Victor Hugo?"
77
| EVAL embedding = TEXT_EMBEDDING("Who is Victor Hugo?", "test_dense_inference")
88
;
99
// end::embedding-eval[]
1010

11+
input:keyword | embedding:dense_vector
12+
Who is Victor Hugo? | [56.0, 50.0, 48.0]
13+
;
14+
15+
16+
text_embedding using a row source operator with query build using CONCAT
17+
required_capability: text_embedding_function
18+
required_capability: dense_vector_field_type_released
19+
20+
ROW input="Who is Victor Hugo?"
21+
| EVAL embedding = TEXT_EMBEDDING(CONCAT("Who is ", "Victor Hugo?"), "test_dense_inference")
22+
;
1123

1224
input:keyword | embedding:dense_vector
1325
Who is Victor Hugo? | [56.0, 50.0, 48.0]
1426
;
1527

28+
29+
text_embedding with knn on semantic_text_dense_field
30+
required_capability: text_embedding_function
31+
required_capability: dense_vector_field_type_released
32+
required_capability: knn_function_v5
33+
required_capability: semantic_text_field_caps
34+
35+
FROM semantic_text METADATA _score
36+
| EVAL query_embedding = TEXT_EMBEDDING("be excellent to each other", "test_dense_inference")
37+
| WHERE KNN(semantic_text_dense_field, query_embedding)
38+
| SORT _score DESC
39+
| LIMIT 10
40+
| KEEP semantic_text_field, query_embedding
41+
;
42+
43+
semantic_text_field:text | query_embedding:dense_vector
44+
be excellent to each other | [45.0, 55.0, 54.0]
45+
live long and prosper | [45.0, 55.0, 54.0]
46+
all we have to decide is what to do with the time that is given to us | [45.0, 55.0, 54.0]
47+
;
48+
49+
text_embedding with knn (inline) on semantic_text_dense_field
50+
required_capability: text_embedding_function
51+
required_capability: dense_vector_field_type_released
52+
required_capability: knn_function_v5
53+
required_capability: semantic_text_field_caps
54+
55+
FROM semantic_text METADATA _score
56+
| WHERE KNN(semantic_text_dense_field, TEXT_EMBEDDING("be excellent to each other", "test_dense_inference"))
57+
| SORT _score DESC
58+
| LIMIT 10
59+
| KEEP semantic_text_field
60+
;
61+
62+
semantic_text_field:text
63+
be excellent to each other
64+
live long and prosper
65+
all we have to decide is what to do with the time that is given to us
66+
;
67+
68+
69+
text_embedding with multiple knn queries in fork
70+
required_capability: text_embedding_function
71+
required_capability: dense_vector_field_type_released
72+
required_capability: knn_function_v5
73+
required_capability: fork_v9
74+
required_capability: semantic_text_field_caps
75+
76+
FROM semantic_text METADATA _score
77+
| FORK (EVAL query_embedding = TEXT_EMBEDDING("be excellent to each other", "test_dense_inference") | WHERE KNN(semantic_text_dense_field, query_embedding))
78+
(EVAL query_embedding = TEXT_EMBEDDING("live long and prosper", "test_dense_inference") | WHERE KNN(semantic_text_dense_field, query_embedding))
79+
| SORT _score DESC, _fork ASC
80+
| LIMIT 10
81+
| KEEP semantic_text_field, query_embedding, _fork
82+
;
83+
84+
semantic_text_field:text | query_embedding:dense_vector | _fork:keyword
85+
be excellent to each other | [45.0, 55.0, 54.0] | fork1
86+
live long and prosper | [50.0, 57.0, 56.0] | fork2
87+
live long and prosper | [45.0, 55.0, 54.0] | fork1
88+
be excellent to each other | [50.0, 57.0, 56.0] | fork2
89+
all we have to decide is what to do with the time that is given to us | [45.0, 55.0, 54.0] | fork1
90+
all we have to decide is what to do with the time that is given to us | [50.0, 57.0, 56.0] | fork2
91+
;

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/execution/PlanExecutor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public void esql(
8888
indexResolver,
8989
enrichPolicyResolver,
9090
preAnalyzer,
91-
new LogicalPlanPreOptimizer(new LogicalPreOptimizerContext(foldContext)),
91+
new LogicalPlanPreOptimizer(new LogicalPreOptimizerContext(foldContext, services.inferenceService())),
9292
functionRegistry,
9393
new LogicalPlanOptimizer(new LogicalOptimizerContext(cfg, foldContext)),
9494
mapper,

0 commit comments

Comments
 (0)