Recursive amplification
Subquestions can have subquestions
from fvalues import F
from ice.recipe import recipe
from ice.recipes.primer.subquestions import ask_subquestions
from ice.utils import map_async
Question = str
Answer = str
Subs = list[tuple[Question, Answer]]
def render_background(subs: Subs) -> str:
if not subs:
return ""
subs_text = F("\n\n").join(F(f"Q: {q}\nA: {a}") for (q, a) in subs)
return F(f"Here is relevant background information:\n\n{subs_text}\n\n")
def make_qa_prompt(question: str, subs: Subs) -> str:
background_text = render_background(subs)
return F(
f"""{background_text}Answer the following question, using the background information above where helpful:
Question: "{question}"
Answer: "
"""
).strip()
async def get_subs(question: str, depth: int) -> Subs:
subquestions = await ask_subquestions(question=question)
subanswers = await map_async(
subquestions, lambda q: answer_by_amplification(question=q, depth=depth)
)
return list(zip(subquestions, subanswers))
async def answer_by_amplification(
question: str = "What is the effect of creatine on cognition?", depth: int = 1
):
subs = await get_subs(question, depth - 1) if depth > 0 else []
prompt = make_qa_prompt(question, subs=subs)
answer = await recipe.agent().complete(prompt=prompt, stop='"')
return answer
recipe.main(answer_by_amplification)Depth 0
Depth 1
Depth 2

Exercises
References
Last updated