← Selectie van werk

Autonoom · 2022 · #installatie #hardware #taal

Conversations

Eén tekstkar (eerste frame van de animatie)
Eén tekstkar (eerste frame van de animatie)

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)