Conversations
Drie tekstkarren, de matrixborden langs de weg, die buiten met elkaar in gesprek lijken.
Elke kar heeft een eigen karakter. Samen wisselen ze poëtische regels uit, zodat een voorbijganger stuit op iets dat lijkt op een groepje vrienden dat zit te praten, behalve dat het tekstkarren zijn. De eerste versie was een prototype uit mijn tijd op de kunstacademie: drie kleine karren met displays en losse bedrading, die een vast script afspeelden.
In de tweede versie is het script vervangen door een kennisgraaf. Gedichten van drie dichters, Ovidius, Shakespeare en Rilke, zijn per strofe geïndexeerd en per dichter geclusterd, en elke dichter krijgt een eigen matrixbord. Het antwoorden gaat vanzelf: na elke strofe zoekt het systeem op vector similarity de strofe die er het dichtst bij ligt, en de dichter van wie die is, spreekt als volgende. Er wordt niets gegenereerd. De dichters spreken alleen in hun eigen woorden.
Colofon
- Mijn aandeel: concept, elektronica, software
Code
De beurtwisseling, ingekort: de laatste strofe is de zoekvraag, de dichtstbijzijnde strofe die nog niet gebruikt is wint, en de dichter van wie die is, spreekt als volgende. Er wordt niets gegenereerd.
def next_turn(self, conversation_id: int) -> ConversationState:
conversation = Conversation.objects.get(pk=conversation_id)
state = ConversationState.from_conversation(conversation)
# De laatste strofe is de zoekvraag
query_text = conversation.last_message.strophe.text
# Dichtstbijzijnde strofe over alle dichters, zonder al gebruikte strofen
best_result = self.rag_service.get_best_response(
query=query_text,
exclude_strophe_ids=state.used_strophe_ids,
)
if not best_result:
# Geen strofen meer: het gesprek is afgelopen
return self.end_conversation(conversation_id)
# De eigenaar van die strofe spreekt als volgende
strophe = Strophe.objects.get(pk=best_result.strophe_id)
poet = Poet.objects.get(pk=best_result.poet_id)
ConversationMessage.objects.create(
conversation=conversation,
poet=poet,
strophe=strophe,
turn_number=state.turn_count + 1,
similarity_score=best_result.similarity_score,
)
return ConversationState.from_conversation(conversation)