Self-Ask Prompting
Self-Ask Prompting is a progression from Chain Of Thought Prompting. Below are a few practical examples and an implementation of Self-Ask using both manual prompting and the LangChain framework.
I’m currently the Chief Evangelist @ HumanFirst. I explore & write about all things at the intersection of AI & language; ranging from LLMs, Chatbots, Voicebots, Development Frameworks, Data-Centric latent spaces & more.
Considering the image below, it is evident that Self-Ask Prompting is a progression from Direct and Chain-Of-Thought prompting.
The interesting thing about self-ask prompting is that the LLM reasoning is shown explicitly and the LLM also decomposes the question into smaller follow-up questions.
The LLM knows when the final answer is reached and can move from follow up intermediate answers to a final answer.
Below is a practical example from the OpenAI playground, making use of the completion mode and the text-davinci-003 model.
To some extent self-ask makes the output of the LLM more conversational while surfacing decomposed, explicit reasoning is also more informative.
The Self-Ask approach allows for an LLM to give answers to a question it was not explicitly trained on. The model might not have the direct answer to a question, but answers to sub-questions will exist in the LLM dataset.
Hence the model have individual, yet disparate, facts needed to answer the question, but lacks the ability to compose these into a final answer. Self-Ask Prompting guides the LLM in this direction.
Compositional reasoning lets models go beyond memorisation of directly observed facts to deduce previously unseen knowledge. ~ Source.
The search engine results which form part of the LangChain Agent below, act as a contextual reference for the LLM to extract and compose a response from.
Below is the complete Python code to run a self-ask agent within the LangChain framework. The agent makes use of OpenAI a SerpAPI for web search.
pip install langchain
pip install openai
pip install google-search-results
import os
os.environ['OPENAI_API_KEY'] = str("xxxxxxxxxxxxxxxxxxxx")
os.environ["SERPAPI_API_KEY"] = str("xxxxxxxxxxxxxxxxxxxx")
from langchain import OpenAI, SerpAPIWrapper
from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType
llm = OpenAI(temperature=0)
search = SerpAPIWrapper()
tools = [
Tool(
name="Intermediate Answer",
func=search.run,
description="useful for when you need to ask with search",
)
]
self_ask_with_search = initialize_agent(
tools, llm, agent=AgentType.SELF_ASK_WITH_SEARCH, verbose=True
)
self_ask_with_search.run(
"What is the hometown of the reigning men's U.S. Open champion?"
)Below the output from the agent, showing the follow up questions, intermediate answers and then the final answer once the chain is completed.
> Entering new AgentExecutor chain...
Yes.
Follow up: Who is the reigning men's U.S. Open champion?
Intermediate answer: Carlos Alcaraz
Follow up: Where is Carlos Alcaraz from?
Intermediate answer: El Palmar, Spain
So the final answer is: El Palmar, Spain
> Finished chain.
El Palmar, SpainThis is how the output from the Colab notebook looks.
⭐️ Follow me on LinkedIn for updates on Conversational AI ⭐️
I’m currently the Chief Evangelist @ HumanFirst. I explore & write about all things at the intersection of AI & language; ranging from LLMs, Chatbots, Voicebots, Development Frameworks, Data-Centric latent spaces & more.
MEASURING AND NARROWING
THE COMPOSITIONALITY GAP IN LANGUAGE MODELS
