22
22
* THE SOFTWARE.
23
23
* """
24
24
25
+ from openai .embeddings_utils import get_embedding , cosine_similarity
25
26
from ast import literal_eval
26
27
from os .path import exists
27
28
import json
33
34
import NAR
34
35
os .chdir (cwd )
35
36
from Truth import *
37
+ import time
36
38
37
- def RetrieveQuestionContent (memory , attention_buf , inp , max_LTM_retrievals = 5 ):
39
+ def get_embedding_robust (inp ):
40
+ while True :
41
+ try :
42
+ ret = get_embedding (inp )
43
+ except :
44
+ print ("//Failed get embedding, will retry API call in 10s" )
45
+ time .sleep (10 )
46
+ continue
47
+ break
48
+ return ret
49
+
50
+ def ProductPrettify (term ):
51
+ if " --> " in term and " * " in term .split (" --> " )[0 ]:
52
+ arg1 = term .split (" * " )[0 ].strip ()
53
+ arg2 = term .split (" * " )[1 ].split (" --> " )[0 ].strip ()
54
+ relarg = term .split (" --> " )[1 ].strip ()
55
+ term = arg1 + " " + relarg + " " + arg2
56
+ return term .replace ("(" ,"" ).replace (")" ,"" )
57
+
58
+ def Term_AsSentence (T ):
59
+ term = T [1 :- 1 ] if "<" in T else T
60
+ if "=/>" not in term :
61
+ term = ProductPrettify (term )
62
+ else :
63
+ if " =/> " in term :
64
+ prec_op = [ProductPrettify (p ) for p in term .split (" =/> " )[0 ].split (" &/ " )]
65
+ removeParentheses = lambda u : u .replace (" --> [" ," hasproperty " ).replace (" --> " ," isa " ).replace (" - " , " and not " ).replace ("(" ,"" ). \
66
+ replace ("<" ,"" ).replace (")" ,"" ).replace (">" ,"" ).replace (" " ," " ).strip ()
67
+ precs = removeParentheses (" and when then " .join (prec_op [:- 1 ]))
68
+ op = prec_op [- 1 ]
69
+ if " --> " in op :
70
+ op = removeParentheses (prec_op [- 1 ].split (" --> " )[1 ] + " " + prec_op [- 1 ].split (" --> " )[0 ]).replace ("{SELF} *" , "" )
71
+ term = "When '" + precs + "' then '" + removeParentheses (op ) + "' causes '" + removeParentheses (term .split (" =/> " )[1 ]) + "'"
72
+ term = term .replace (" --> [" , " hasproperty " ).replace ("]" ,"" ).replace ("[" ,"" ).replace (" --> " , " isa " ).replace (" &/ " , " then " ).replace (" =/> " , " causes " )
73
+ return term
74
+
75
+ def Term_Embedded (T ):
76
+ return get_embedding_robust (Term_AsSentence (T ).replace ("-" ," " ).replace ("_" ," " ))
77
+
78
+ def RetrieveQuestionContent (memory , attention_buf , inp , max_LTM_retrievals = 30 ):
38
79
primed = {}
39
- words = [x .strip ().replace ("?" ,"" ) for x in inp .split (" " )]
40
- for x in words :
41
- n = Lemmatize (x , wordnet .NOUN )
42
- v = Lemmatize (x , wordnet .VERB )
43
- for m in list (memory .items ()):
44
- padded = lambda w : " " + w .replace (">" ," " ).replace ("<" ," " ).replace ("(" ," " ).replace (")" ," " ) + " "
45
- if padded (n ) in padded (m [0 ][0 ]) or padded (v ) in padded (m [0 ][0 ]):
46
- if m not in attention_buf :
47
- matchQuality = 2 if (padded (n ) in padded (m [0 ][0 ]) and padded (v ) in padded (m [0 ][0 ])) else 1
48
- if m [0 ] not in primed :
49
- primed [m [0 ]] = (matchQuality , m [1 ])
50
- else :
51
- primed [m [0 ]] = (primed [m [0 ]][0 ] + matchQuality , primed [m [0 ]][1 ])
80
+ qu_embed = get_embedding_robust (inp )
81
+ for m in list (memory .items ()):
82
+ if m not in attention_buf :
83
+ matchQuality = cosine_similarity (qu_embed , m [1 ][3 ])
84
+ primed [m [0 ]] = (matchQuality , m [1 ])
52
85
primed = list (primed .items ())
53
86
primed .sort (key = lambda x : (- x [1 ][0 ], - Truth_Expectation (x [1 ][1 ][2 ]))) #sort by query match first then by truth expectation
54
87
primed = primed [:max_LTM_retrievals ]
55
88
#for m in primed:
56
- # print("//Retrieved from LTM:", m)
89
+ # print("//Retrieved from LTM:", m[0], m[1][:-1] )
57
90
primed = [(x [0 ],x [1 ][1 ]) for x in primed ]
58
91
return list (reversed (primed ))
59
92
60
93
def Memory_attention_buffer (memory , attention_buffer_size , inpQuestion = None ):
61
94
attention_buf = []
62
- relevant_item_list = list (memory .items ())
95
+ # relevant_item_list = list(memory.items())
63
96
#find attention_buffer_size/2 newest items:
64
- relevant_item_list .sort (key = lambda x : - x [1 ][0 ])
65
- attention_buf += reversed (relevant_item_list [0 :int (attention_buffer_size / 2 )]) #newer comes later in prompt
97
+ # relevant_item_list.sort(key=lambda x: -x[1][0])
98
+ # attention_buf += reversed(relevant_item_list[0:int(attention_buffer_size/2)]) #newer comes later in prompt
66
99
#find additional attention_buffer_size/2 useful items which were not already part of the newest
67
- relevant_item_list .sort (key = lambda x : - x [1 ][1 ])
68
- for x in attention_buf :
69
- if x in relevant_item_list :
70
- relevant_item_list .remove (x ) #so we won't select it as it is already part of mem
71
- i = 0
72
- while len (attention_buf ) < attention_buffer_size and i < len (relevant_item_list ):
73
- attention_buf = [relevant_item_list [i ]] + attention_buf
74
- i += 1
100
+ # relevant_item_list.sort(key=lambda x: -x[1][1])
101
+ # for x in attention_buf:
102
+ # if x in relevant_item_list:
103
+ # relevant_item_list.remove(x) #so we won't select it as it is already part of mem
104
+ # i = 0
105
+ # while len(attention_buf) < attention_buffer_size and i < len(relevant_item_list):
106
+ # attention_buf = [relevant_item_list[i]] + attention_buf
107
+ # i += 1
75
108
#pull in question content that is not already included
76
109
if inpQuestion is not None :
77
- attention_buf = RetrieveQuestionContent (memory , attention_buf , inpQuestion ) + attention_buf
110
+ attention_buf = RetrieveQuestionContent (memory , attention_buf , inpQuestion ) # + attention_buf
78
111
return attention_buf
79
112
80
- def ProductPrettify (term ):
81
- if " --> " in term and " * " in term .split (" --> " )[0 ]:
82
- arg1 = term .split (" * " )[0 ].strip ()
83
- arg2 = term .split (" * " )[1 ].split (" --> " )[0 ].strip ()
84
- relarg = term .split (" --> " )[1 ].strip ()
85
- term = arg1 + " " + relarg + " " + arg2
86
- return term .replace ("(" ,"" ).replace (")" ,"" )
87
-
88
113
def Memory_generate_prompt (currentTime , memory , prompt_start , prompt_end , attention_buffer_size , inpQuestion = None , TimeHandling = True ):
89
114
prompt_memory = ""
90
115
buf = Memory_attention_buffer (memory , attention_buffer_size , inpQuestion )
@@ -110,20 +135,7 @@ def Memory_generate_prompt(currentTime, memory, prompt_start, prompt_end, attent
110
135
flags .append ("Contradictory" )
111
136
certainty = Truth_Expectation ((f ,c ))
112
137
truthtype = '"' + " " .join (flags ) + '"'
113
- term = x [0 ][0 ][1 :- 1 ] if "<" in x [0 ][0 ] else x [0 ][0 ]
114
- if "=/>" not in term :
115
- term = ProductPrettify (term )
116
- else :
117
- if " =/> " in term :
118
- prec_op = [ProductPrettify (p ) for p in term .split (" =/> " )[0 ].split (" &/ " )]
119
- removeParentheses = lambda u : u .replace (" --> [" ," hasproperty " ).replace (" --> " ," isa " ).replace (" - " , " and not " ).replace ("(" ,"" ). \
120
- replace ("<" ,"" ).replace (")" ,"" ).replace (">" ,"" ).replace (" " ," " ).strip ()
121
- precs = removeParentheses (" and when then " .join (prec_op [:- 1 ]))
122
- op = prec_op [- 1 ]
123
- if " --> " in op :
124
- op = removeParentheses (prec_op [- 1 ].split (" --> " )[1 ] + " " + prec_op [- 1 ].split (" --> " )[0 ]).replace ("{SELF} *" , "" )
125
- term = "When '" + precs + "' then '" + removeParentheses (op ) + "' causes '" + removeParentheses (term .split (" =/> " )[1 ]) + "'"
126
- term = term .replace (" --> [" , " hasproperty " ).replace ("]" ,"" ).replace ("[" ,"" ).replace (" --> " , " isa " ).replace (" &/ " , " then " ).replace (" =/> " , " causes " )
138
+ term = Term_AsSentence (x [0 ][0 ])
127
139
prompt_memory += f"i={ i } : { term } . { timeterm } truthtype={ truthtype } certainty={ certainty } \n "
128
140
return buf , prompt_start + prompt_memory + prompt_end
129
141
@@ -153,7 +165,7 @@ def query(currentTime, memory, term, time):
153
165
return currentTime
154
166
if (term , time ) not in retrieved and (term , time ) in memory :
155
167
retrieved .add ((term , time ))
156
- (_ , _ , (f , c )) = memory [(term , time )]
168
+ (_ , _ , (f , c ), _ ) = memory [(term , time )]
157
169
if time == "eternal" :
158
170
_ , currentTime = ProcessInput (currentTime , memory , f"{ term } . {{{ f } { c } }}" )
159
171
if time == currentTime :
@@ -162,7 +174,7 @@ def query(currentTime, memory, term, time):
162
174
parts = term .split ("?1" )
163
175
bestTerm , bestTruth , bestTime = (None , (0.0 , 0.5 ), "eternal" )
164
176
for (term2 , time2 ) in memory :
165
- (_ , _ , (f2 , c2 )) = memory [(term2 , time2 )]
177
+ (_ , _ , (f2 , c2 ), _ ) = memory [(term2 , time2 )]
166
178
if time2 == time and term2 .startswith (parts [0 ]) and term2 .endswith (parts [1 ]):
167
179
if Truth_Expectation ((f2 , c2 )) > Truth_Expectation ((bestTruth [0 ], bestTruth [1 ])):
168
180
bestTerm = term2
@@ -206,11 +218,11 @@ def ProcessInput(currentTime, memory, inputforNAR, backups = ["input", "answers"
206
218
c2 = float (derivation ["truth" ]["confidence" ])
207
219
usefulnessAddition = 1000000 if "Priority" not in derivation or derivation ["Priority" ] == 1.0 else 1
208
220
if (term , time ) in memory :
209
- (t , usefulness , (f , c )) = memory [(term , time )]
221
+ (t , usefulness , (f , c ), embedding ) = memory [(term , time )]
210
222
if c2 > c :
211
- memory [(term , time )] = (currentTime , usefulness + usefulnessAddition , (f2 , c2 ))
223
+ memory [(term , time )] = (currentTime , usefulness + usefulnessAddition , (f2 , c2 ), embedding )
212
224
else :
213
- memory [(term , time )] = (currentTime , usefulnessAddition , (f2 , c2 ))
225
+ memory [(term , time )] = (currentTime , usefulnessAddition , (f2 , c2 ), Term_Embedded ( term ) )
214
226
if ">." in inputforNAR or "! :|:" in inputforNAR :
215
227
currentTime += 1
216
228
if inputforNAR .isdigit ():
@@ -220,7 +232,7 @@ def ProcessInput(currentTime, memory, inputforNAR, backups = ["input", "answers"
220
232
relations = set (["isa" , "are" , "hasproperty" ])
221
233
def Relation (inp , currentTime , memory , s , v , p , punctuation_tv ):
222
234
global relations
223
- if s .replace ("_" , " " ) not in inp or p .replace ("_" , " " ) not in inp :
235
+ if s .replace ("_" , " " ) not in inp . replace ( ". " , " " ). replace ( "'" , "" ) or p .replace ("_" , " " ) not in inp . replace ( ". " , " " ). replace ( "'" , "" ) :
224
236
#print("//!!!! filtered out", s, v, p)
225
237
return False , currentTime
226
238
s = Lemmatize (s , wordnet .NOUN )
@@ -238,7 +250,7 @@ def Relation(inp, currentTime, memory, s, v, p, punctuation_tv):
238
250
return True , currentTime
239
251
240
252
def Property (inp , currentTime , memory , s , p , punctuation_tv ):
241
- if s .replace ("_" , " " ) not in inp or p .replace ("_" , " " ) not in inp :
253
+ if s .replace ("_" , " " ) not in inp . replace ( ". " , " " ). replace ( "'" , "" ) or p .replace ("_" , " " ) not in inp . replace ( ". " , " " ). replace ( "'" , "" ) :
242
254
#print("//!!!! filtered out", s, "hasproperty", p)
243
255
return False , currentTime
244
256
s = Lemmatize (s , wordnet .NOUN )
@@ -252,6 +264,7 @@ def Property(inp, currentTime, memory, s, p, punctuation_tv):
252
264
hadRelation = set ([])
253
265
def Memory_digest_sentence (inp , currentTime , memory , sentence , truth , PrintMemoryUpdates , TimeHandling ):
254
266
global lastTime , hadRelation
267
+ #print(">>>>", sentence)
255
268
if currentTime != lastTime :
256
269
hadRelation = set ([])
257
270
if sentence in hadRelation :
@@ -312,7 +325,7 @@ def Memory_Eternalize(currentTime, memory, eternalizationDistance = 3):
312
325
belief = memory [(m , t )]
313
326
if t != "eternal" and currentTime - t > eternalizationDistance :
314
327
deletes .append ((m , t ))
315
- additions .append (((m , "eternal" ), (belief [0 ], belief [1 ], Truth_Eternalize (belief [2 ]))))
328
+ additions .append (((m , "eternal" ), (belief [0 ], belief [1 ], Truth_Eternalize (belief [2 ]), belief [ 3 ] )))
316
329
for k in deletes :
317
330
del memory [k ]
318
331
for (k , v ) in additions :
0 commit comments