mirror of
https://github.com/hwchase17/langchain.git
synced 2025-08-31 18:38:48 +00:00
Templates (#12294)
Co-authored-by: Harrison Chase <hw.chase.17@gmail.com> Co-authored-by: Lance Martin <lance@langchain.dev> Co-authored-by: Jacob Lee <jacoblee93@gmail.com>
This commit is contained in:
9
templates/stepback-qa-prompting/README.md
Normal file
9
templates/stepback-qa-prompting/README.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# Step-Back Prompting (Question-Answering)
|
||||
|
||||
One prompting technique called "Step-Back" prompting can improve performance on complex questions by first asking a "step back" question. This can be combined with regular question-answering applications by then doing retrieval on both the original and step-back question.
|
||||
|
||||
Read the paper [here](https://arxiv.org/abs/2310.06117)
|
||||
|
||||
See an excelent blog post on this by Cobus Greyling [here](https://cobusgreyling.medium.com/a-new-prompt-engineering-technique-has-been-introduced-called-step-back-prompting-b00e8954cacb)
|
||||
|
||||
In this template we will replicate this technique. We modify the prompts used slightly to work better with chat models.
|
5
templates/stepback-qa-prompting/main.py
Normal file
5
templates/stepback-qa-prompting/main.py
Normal file
@@ -0,0 +1,5 @@
|
||||
from stepback_qa_prompting.chain import chain
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
chain.invoke({"question": "was chatgpt around while trump was president?"})
|
1701
templates/stepback-qa-prompting/poetry.lock
generated
Normal file
1701
templates/stepback-qa-prompting/poetry.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
20
templates/stepback-qa-prompting/pyproject.toml
Normal file
20
templates/stepback-qa-prompting/pyproject.toml
Normal file
@@ -0,0 +1,20 @@
|
||||
[tool.poetry]
|
||||
name = "stepback_qa_prompting"
|
||||
version = "0.0.1"
|
||||
description = ""
|
||||
authors = []
|
||||
readme = "README.md"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = ">=3.8.1,<4.0"
|
||||
langchain = ">=0.0.313"
|
||||
duckduckgo-search = "^3.9.3"
|
||||
|
||||
[tool.langserve]
|
||||
export_module = "stepback_qa_prompting.chain"
|
||||
export_attr = "chain"
|
||||
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
build-backend = "poetry.core.masonry.api"
|
@@ -0,0 +1,65 @@
|
||||
from langchain.chat_models import ChatOpenAI
|
||||
from langchain.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate
|
||||
from langchain.schema.output_parser import StrOutputParser
|
||||
from langchain.schema.runnable import RunnableLambda
|
||||
from langchain.utilities import DuckDuckGoSearchAPIWrapper
|
||||
|
||||
|
||||
search = DuckDuckGoSearchAPIWrapper(max_results=4)
|
||||
|
||||
def retriever(query):
|
||||
return search.run(query)
|
||||
|
||||
|
||||
# Few Shot Examples
|
||||
examples = [
|
||||
{
|
||||
"input": "Could the members of The Police perform lawful arrests?",
|
||||
"output": "what can the members of The Police do?"
|
||||
},
|
||||
{
|
||||
"input": "Jan Sindel’s was born in what country?",
|
||||
"output": "what is Jan Sindel’s personal history?"
|
||||
},
|
||||
]
|
||||
# We now transform these to example messages
|
||||
example_prompt = ChatPromptTemplate.from_messages(
|
||||
[
|
||||
("human", "{input}"),
|
||||
("ai", "{output}"),
|
||||
]
|
||||
)
|
||||
few_shot_prompt = FewShotChatMessagePromptTemplate(
|
||||
example_prompt=example_prompt,
|
||||
examples=examples,
|
||||
)
|
||||
|
||||
prompt = ChatPromptTemplate.from_messages([
|
||||
("system", """You are an expert at world knowledge. Your task is to step back and paraphrase a question to a more generic step-back question, which is easier to answer. Here are a few examples:"""),
|
||||
# Few shot examples
|
||||
few_shot_prompt,
|
||||
# New question
|
||||
("user", "{question}"),
|
||||
])
|
||||
|
||||
question_gen = prompt | ChatOpenAI(temperature=0) | StrOutputParser()
|
||||
|
||||
response_prompt_template = """You are an expert of world knowledge. I am going to ask you a question. Your response should be comprehensive and not contradicted with the following context if they are relevant. Otherwise, ignore them if they are not relevant.
|
||||
|
||||
{normal_context}
|
||||
{step_back_context}
|
||||
|
||||
Original Question: {question}
|
||||
Answer:"""
|
||||
response_prompt = ChatPromptTemplate.from_template(response_prompt_template)
|
||||
|
||||
chain = {
|
||||
# Retrieve context using the normal question
|
||||
"normal_context": RunnableLambda(lambda x: x['question']) | retriever,
|
||||
# Retrieve context using the step-back question
|
||||
"step_back_context": question_gen | retriever,
|
||||
# Pass on the question
|
||||
"question": lambda x: x["question"]
|
||||
} | response_prompt | ChatOpenAI(temperature=0) | StrOutputParser()
|
||||
|
||||
|
0
templates/stepback-qa-prompting/tests/__init__.py
Normal file
0
templates/stepback-qa-prompting/tests/__init__.py
Normal file
Reference in New Issue
Block a user