@@ -41,83 +41,110 @@ def process(self, input_statement: Statement, additional_response_selection_para
4141 break
4242
4343 self .chatbot .logger .info ('Selecting "{}" as a response to "{}" with a confidence of {}' .format (
44- closest_match .in_response_to , input_statement .text , closest_match .confidence
44+ closest_match .text , input_statement .text , closest_match .confidence
4545 ))
4646
47- recent_repeated_responses = filters .get_recent_repeated_responses (
48- self .chatbot ,
49- input_statement .conversation
50- )
51-
52- for index , recent_repeated_response in enumerate (recent_repeated_responses ):
53- self .chatbot .logger .info ('{}. Excluding recent repeated response of "{}"' .format (
54- index , recent_repeated_response
55- ))
56-
57- response_selection_parameters = {
58- 'search_text' : closest_match .search_text ,
59- 'persona_not_startswith' : 'bot:' ,
60- 'exclude_text' : recent_repeated_responses ,
61- 'exclude_text_words' : self .excluded_words
62- }
63-
64- alternate_response_selection_parameters = {
65- 'search_in_response_to' : self .chatbot .tagger .get_text_index_string (
66- input_statement .text
67- ),
68- 'persona_not_startswith' : 'bot:' ,
69- 'exclude_text' : recent_repeated_responses ,
70- 'exclude_text_words' : self .excluded_words
71- }
72-
73- if additional_response_selection_parameters :
74- response_selection_parameters .update (
75- additional_response_selection_parameters
76- )
77- alternate_response_selection_parameters .update (
78- additional_response_selection_parameters
47+ # Semantic vector search vs indexed text search have different architectures:
48+ #
49+ # For SQL with indexed text search:
50+ # - Phase 1 finds a match based on string similarity (Levenshtein distance)
51+ # - Phase 2 finds variations of that match to get diverse responses
52+ # - This makes sense because you might have multiple instances of similar statements
53+ # learned from different conversations that provide different response options
54+ #
55+ # For Redis with semantic vectors:
56+ # - Phase 1 finds semantically similar responses using vector embeddings
57+ # - The semantic similarity already captures the "closeness" we want
58+ # - Phase 2 would be redundant - we already have the best semantic match
59+ # - The vector search inherently considers the entire semantic space, not just
60+ # exact string matches, so additional variation searching is unnecessary
61+ #
62+ # NOTE: This difference of functionality may need to be modified in the future
63+ # if the redis adapter is determined to benefit from a Phase 2 style response
64+ # selection. The main symptom that would drive such a change would be low
65+ # quality or repetitive responses when using semantic vector search.
66+ #
67+ # Therefore, semantic vector search returns the Phase 1 result directly.
68+ if self .search_algorithm .name == 'semantic_vector_search' and closest_match .confidence > 0 :
69+ response = closest_match
70+ self .chatbot .logger .info ('Using semantic search result directly: "{}"' .format (response .text ))
71+ else :
72+ # For other search algorithms (indexed_text_search, text_search),
73+ # we need to find responses to the closest match
74+ recent_repeated_responses = filters .get_recent_repeated_responses (
75+ self .chatbot ,
76+ input_statement .conversation
7977 )
8078
81- # Get all statements with text similar to the closest match
82- response_list = list (self .chatbot .storage .filter (** response_selection_parameters ))
83-
84- if response_list :
85- response = self .select_response (
86- input_statement ,
87- response_list ,
88- self .chatbot .storage
89- )
79+ for index , recent_repeated_response in enumerate (recent_repeated_responses ):
80+ self .chatbot .logger .info ('{}. Excluding recent repeated response of "{}"' .format (
81+ index , recent_repeated_response
82+ ))
9083
91- response .confidence = closest_match .confidence
92- self .chatbot .logger .info ('Selecting "{}" from {} optimal responses.' .format (
93- response .text ,
94- len (response_list )
95- ))
96- else :
97- '''
98- The case where there was no responses returned for the selected match
99- but a value exists for the statement the match is in response to.
100- '''
101- self .chatbot .logger .info ('No responses found. Generating alternate response list.' )
84+ response_selection_parameters = {
85+ 'search_text' : closest_match .search_text ,
86+ 'persona_not_startswith' : 'bot:' ,
87+ 'exclude_text' : recent_repeated_responses ,
88+ 'exclude_text_words' : self .excluded_words
89+ }
90+
91+ alternate_response_selection_parameters = {
92+ 'search_in_response_to' : self .chatbot .tagger .get_text_index_string (
93+ input_statement .text
94+ ),
95+ 'persona_not_startswith' : 'bot:' ,
96+ 'exclude_text' : recent_repeated_responses ,
97+ 'exclude_text_words' : self .excluded_words
98+ }
99+
100+ if additional_response_selection_parameters :
101+ response_selection_parameters .update (
102+ additional_response_selection_parameters
103+ )
104+ alternate_response_selection_parameters .update (
105+ additional_response_selection_parameters
106+ )
102107
103- alternate_response_list = list (self .chatbot .storage .filter (
104- ** alternate_response_selection_parameters
105- ))
108+ # Get all statements with text similar to the closest match
109+ response_list = list (self .chatbot .storage .filter (** response_selection_parameters ))
106110
107- if alternate_response_list :
111+ if response_list :
108112 response = self .select_response (
109113 input_statement ,
110- alternate_response_list ,
114+ response_list ,
111115 self .chatbot .storage
112116 )
113117
114118 response .confidence = closest_match .confidence
115- self .chatbot .logger .info ('Selected alternative response "{}" from {} options ' .format (
119+ self .chatbot .logger .info ('Selecting "{}" from {} optimal responses. ' .format (
116120 response .text ,
117- len (alternate_response_list )
121+ len (response_list )
118122 ))
119123 else :
120- response = self .get_default_response (input_statement )
121- self .chatbot .logger .info ('Using "%s" as a default response.' , response .text )
124+ '''
125+ The case where there was no responses returned for the selected match
126+ but a value exists for the statement the match is in response to.
127+ '''
128+ self .chatbot .logger .info ('No responses found. Generating alternate response list.' )
129+
130+ alternate_response_list = list (self .chatbot .storage .filter (
131+ ** alternate_response_selection_parameters
132+ ))
133+
134+ if alternate_response_list :
135+ response = self .select_response (
136+ input_statement ,
137+ alternate_response_list ,
138+ self .chatbot .storage
139+ )
140+
141+ response .confidence = closest_match .confidence
142+ self .chatbot .logger .info ('Selected alternative response "{}" from {} options' .format (
143+ response .text ,
144+ len (alternate_response_list )
145+ ))
146+ else :
147+ response = self .get_default_response (input_statement )
148+ self .chatbot .logger .info ('Using "%s" as a default response.' , response .text )
122149
123150 return response
0 commit comments