Skip to content

Conversation

@danielsparing
Copy link

@danielsparing danielsparing commented Feb 4, 2025

Er is handmatig voor twee antwoorden gevraagd.

Binnen de SYSTEM_PROMPT is bepaald dat een daarvan een trein en de tweede een fietsadvies moet zijn.

Dit is geen elegante / flexibele oplossing en daarom adviseer ik het niet te laten mergen (ook daarom het vlaggetje 'draft`) maar het staat hier als een voorbeeldje.

voorbeeld antwoord:

Vraag: delft-denhaag

Antwoord: Je kunt de trein nemen van Delft naar Den Haag. De vertrektijden zijn om 10:00, 10:30 en 11:00. Goede reis!

Antwoord: Als je met de fiets gaat, volg dan de route via de Parallelweg en de Afsluitdijk naar Den Haag. Fijne rit!

@danielsparing danielsparing marked this pull request as draft February 4, 2025 15:39
@skinkie skinkie requested a review from eelkevdbos February 4, 2025 15:43
@eelkevdbos
Copy link
Contributor

Leuke suggestie! Het opsplitsen van een antwoord in meerdere chat berichten zou je kunnen doen met het detecteren van een specifieke token sequentie, bijvoorbeeld ||| en die sequentie noemen in het SYSTEM_PROMPT.

# agent.py
SYSTEM_PROMPT = SystemMessage(
    """
    Je bent een behulpzame assistent die helpt navigeren in het openbaar vervoer. 
    Je geeft beknopt maar vriendelijk antwoord.
    Beëindig het gesprek niet vroegtijdig.
    Bepaal voor ieder route vraagstuk zowel de fiets als de openbaar vervoer route.
    Scheid de verschillende routes door middel van de volgende teken sequentie: '|||'.
    """
)

Vervolgens detecteer je de sequentie in het app-gedeelte en splits je daar het antwoord.

# app.py
@cl.on_message
async def on_message(msg: cl.Message):
    config = {"configurable": {"thread_id": cl.context.session.id}}
    cb = cl.LangchainCallbackHandler()
    reply = cl.Message(content="")
    executor = Executor(config=config)
    async with executor.agent_context() as graph:
        message_stream = graph.astream(
            {"messages": [HumanMessage(content=msg.content)]},
            stream_mode="messages",
            config=RunnableConfig(callbacks=[cb], **config)
        )
        async for msg, metadata in message_stream:
            if msg.content and isinstance(msg, AIMessage):
                before, sep, after = msg.content.partition("|||")
                if sep:
                    await reply.stream_token(before)
                    await reply.send()
                    reply = cl.Message(content="")
                    await reply.stream_token(after)
                else:
                    await reply.stream_token(msg.content)

    await reply.send()

Dit is een hacky maar eenvoudige aanpak.

@eelkevdbos
Copy link
Contributor

Ik hoor dat @skinkie het ook had over een feature om sneller te reageren wanneer een fiets route beschikbaar zou zijn. Hier kun je eventueel op inspelen door niet te wachten op het eindresultaat van de agent, maar de individuele tool calls af te tappen:

# app.py
@cl.on_message
async def on_message(msg: cl.Message):
    config = {"configurable": {"thread_id": cl.context.session.id}}
    cb = cl.LangchainCallbackHandler()
    reply = cl.Message(content="")
    executor = Executor(config=config)
    async with executor.agent_context() as graph:
        message_stream = graph.astream(
            {"messages": [HumanMessage(content=msg.content)]},
            stream_mode="messages",
            config=RunnableConfig(callbacks=[cb], **config)
        )
        async for msg, metadata in message_stream:
            if msg.content and isinstance(msg, ToolMessage) and msg.name == "get_bike_route":
                # return get_bike_route response directly to the end-user
                reply.stream_token(msg.content)
    await reply.send()

Dit zorgt er voor dat je bijvoorbeeld al kunt inspelen op de beschikbaarheid van een bepaalde route nog voordat het eind-oordeel van de agent is gedaan. Dit scheelt je een stukje latency (omdat je een LLM call minder doet), maar het zorgt er wel voor dat de tool al reeds een "formatted" response terug moet geven.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants