Skip to content

Commit e328c88

Browse files
authored
Merge pull request #27 from mindsdb/feature/evaluate_kb
Added the Syntax for EVALUATE KNOWLEDGE_BASE
2 parents 8bc502b + 4aa173e commit e328c88

File tree

4 files changed

+108
-3
lines changed

4 files changed

+108
-3
lines changed

mindsdb_sql_parser/ast/mindsdb/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
from .drop_job import DropJob
1616
from .chatbot import CreateChatBot, UpdateChatBot, DropChatBot
1717
from .trigger import CreateTrigger, DropTrigger
18-
from .knowledge_base import CreateKnowledgeBase, DropKnowledgeBase, CreateKnowledgeBaseIndex, DropKnowledgeBaseIndex
18+
from .knowledge_base import CreateKnowledgeBase, DropKnowledgeBase, CreateKnowledgeBaseIndex, DropKnowledgeBaseIndex \
19+
, EvaluateKnowledgeBase
1920
from .skills import CreateSkill, DropSkill, UpdateSkill
2021

2122
# remove it in next release

mindsdb_sql_parser/ast/mindsdb/knowledge_base.py

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from mindsdb_sql_parser.ast.base import ASTNode
2+
from mindsdb_sql_parser.ast import Identifier
23
from mindsdb_sql_parser.utils import indent
34

45

@@ -106,6 +107,7 @@ def get_string(self, *args, **kwargs):
106107
out_str = f'DROP KNOWLEDGE_BASE {"IF EXISTS " if self.if_exists else ""}{self.name.to_string()}'
107108
return out_str
108109

110+
109111
class CreateKnowledgeBaseIndex(ASTNode):
110112
"""
111113
Create a new index in the knowledge base
@@ -127,6 +129,7 @@ def get_string(self, *args, **kwargs):
127129
out_str = f'CREATE INDEX ON KNOWLEDGE_BASE {self.name.to_string()}'
128130
return out_str
129131

132+
130133
class DropKnowledgeBaseIndex(ASTNode):
131134
"""
132135
Delete an index in the knowledge base
@@ -146,4 +149,61 @@ def to_tree(self, *args, level=0, **kwargs):
146149

147150
def get_string(self, *args, **kwargs):
148151
out_str = f'DROP INDEX ON KNOWLEDGE_BASE {self.name.to_string()}'
149-
return out_str
152+
return out_str
153+
154+
155+
class EvaluateKnowledgeBase(ASTNode):
156+
"""
157+
Evaluate a knowledge base.
158+
"""
159+
def __init__(self, name: Identifier, params: dict = None, *args, **kwargs):
160+
"""
161+
Args:
162+
name: Identifier -- name of the knowledge base to evaluate.
163+
params: dict -- parameters to pass to the evaluation.
164+
"""
165+
super().__init__(*args, **kwargs)
166+
self.name = name
167+
self.params = params if params is not None else {}
168+
169+
def to_tree(self, *args, level=0, **kwargs):
170+
ind = indent(level)
171+
172+
param_str = ""
173+
if self.params:
174+
param_items = []
175+
for k, v in self.params.items():
176+
if isinstance(v, Identifier):
177+
param_items.append(f"{ind} {k}={v.to_string()}")
178+
else:
179+
param_items.append(f"{ind} {k}={repr(v)}")
180+
param_str = ",\n".join(param_items)
181+
182+
output_str = (
183+
f"{ind}EvaluateKnowledgeBase(\n"
184+
f"{ind} name={self.name.to_string()},\n"
185+
f"{param_str}\n"
186+
f"{ind})"
187+
)
188+
189+
return output_str
190+
191+
def get_string(self, *args, **kwargs):
192+
using_str = ""
193+
194+
if self.params:
195+
using_args = []
196+
for k, v in self.params.items():
197+
if isinstance(v, Identifier):
198+
using_args.append(f"{k}={v.to_string()}")
199+
else:
200+
using_args.append(f"{k}={repr(v)}")
201+
202+
using_str = "USING " + ", ".join(using_args)
203+
204+
output_str = (
205+
f"EVALUATE KNOWLEDGE_BASE {self.name.to_string()} "
206+
f"{using_str}"
207+
)
208+
209+
return output_str.strip()

mindsdb_sql_parser/parser.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from mindsdb_sql_parser.ast.mindsdb.latest import Latest
1818
from mindsdb_sql_parser.ast.mindsdb.evaluate import Evaluate
1919
from mindsdb_sql_parser.ast.mindsdb.knowledge_base import CreateKnowledgeBase, DropKnowledgeBase, \
20-
CreateKnowledgeBaseIndex, DropKnowledgeBaseIndex
20+
CreateKnowledgeBaseIndex, DropKnowledgeBaseIndex, EvaluateKnowledgeBase
2121
from mindsdb_sql_parser.ast.mindsdb.skills import CreateSkill, DropSkill, UpdateSkill
2222
from mindsdb_sql_parser.exceptions import ParsingException
2323
from mindsdb_sql_parser.ast.mindsdb.retrain_predictor import RetrainPredictor
@@ -89,6 +89,7 @@ class MindsDBParser(Parser):
8989
'drop_trigger',
9090
'create_kb',
9191
'drop_kb',
92+
'evaluate_kb',
9293
'create_skill',
9394
'drop_skill',
9495
'update_skill',
@@ -149,6 +150,13 @@ def drop_index(self, p):
149150
def drop_kb(self, p):
150151
return DropKnowledgeBase(name=p.identifier, if_exists=p.if_exists_or_empty)
151152

153+
@_('EVALUATE KNOWLEDGE_BASE identifier USING kw_parameter_list')
154+
def evaluate_kb(self, p):
155+
return EvaluateKnowledgeBase(
156+
name=p.identifier,
157+
params={k.lower(): v for k, v in p.kw_parameter_list.items()}
158+
)
159+
152160
# -- Skills --
153161
@_('CREATE SKILL if_not_exists_or_empty identifier USING kw_parameter_list')
154162
def create_skill(self, p):

tests/test_mindsdb/test_knowledgebase.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from mindsdb_sql_parser.ast.mindsdb.knowledge_base import (
33
CreateKnowledgeBase,
44
DropKnowledgeBase,
5+
EvaluateKnowledgeBase
56
)
67
from mindsdb_sql_parser.ast import (
78
Select,
@@ -370,3 +371,38 @@ def test_insert_into_knowledge_base(self):
370371
),
371372
)
372373
assert ast == expected_ast
374+
375+
def test_evaluate_knowledge_base(self):
376+
sql = """
377+
EVALUATE KNOWLEDGE_BASE my_knowledge_base
378+
USING
379+
TEST_TABLE = my_database.some_table_1,
380+
SAVE_TO = my_database.some_table_2,
381+
LLM = {
382+
"provider": "openai",
383+
"model": "gpt-3.5-turbo",
384+
"api_key": "my_api_key"
385+
},
386+
GENERATE_DATA = {
387+
"from_sql": "SELECT content FROM my_database.some_table",
388+
"count": 100
389+
}
390+
"""
391+
ast = parse_sql(sql)
392+
expected_ast = EvaluateKnowledgeBase(
393+
name=Identifier("my_knowledge_base"),
394+
params={
395+
"test_table": Identifier(parts=["my_database", "some_table_1"]),
396+
"save_to": Identifier(parts=["my_database", "some_table_2"]),
397+
"llm": {
398+
"provider": "openai",
399+
"model": "gpt-3.5-turbo",
400+
"api_key": "my_api_key"
401+
},
402+
"generate_data": {
403+
"from_sql": "SELECT content FROM my_database.some_table",
404+
"count": 100
405+
}
406+
}
407+
)
408+
assert ast == expected_ast

0 commit comments

Comments
 (0)