From 98f8d1d535c30d8c1ca6c7b52e634a99b88acf10 Mon Sep 17 00:00:00 2001 From: Gustaf Rydholm Date: Thu, 11 Apr 2024 00:28:29 +0200 Subject: Add some prompt engineering --- rag/generator/ollama.py | 44 +++++++++----------------------------------- 1 file changed, 9 insertions(+), 35 deletions(-) (limited to 'rag/generator/ollama.py') diff --git a/rag/generator/ollama.py b/rag/generator/ollama.py index 87f9672..abd5599 100644 --- a/rag/generator/ollama.py +++ b/rag/generator/ollama.py @@ -9,16 +9,6 @@ from rag.retriever.vector import Document from .abstract import AbstractGenerator from .prompt import Prompt -SYSTEM_PROMPT = ( - "# System Preamble" - "## Basic Rules" - "When you answer the user's requests, you cite your sources in your answers, according to those instructions." - "Answer the following question using the provided context.\n" - "## Style Guide" - "Unless the user asks for a different style of answer, you should answer " - "in full sentences, using proper grammar and spelling." -) - class Ollama(metaclass=AbstractGenerator): def __init__(self) -> None: @@ -32,37 +22,21 @@ class Ollama(metaclass=AbstractGenerator): return "\n".join(results) def __metaprompt(self, prompt: Prompt) -> str: - # Include sources metaprompt = ( - f'Question: "{prompt.query.strip()}"\n\n' - "Context:\n" - "\n" + "Answer the question based only on the following context:" + "\n" f"{self.__context(prompt.documents)}\n\n" - "\n" - "Carefully perform the following instructions, in order, starting each " - "with a new line.\n" - "Firstly, Decide which of the retrieved documents are relevant to the " - "user's last input by writing 'Relevant Documents:' followed by " - "comma-separated list of document numbers.\n If none are relevant, you " - "should instead write 'None'.\n" - "Secondly, Decide which of the retrieved documents contain facts that " - "should be cited in a good answer to the user's last input by writing " - "'Cited Documents:' followed a comma-separated list of document numbers. " - "If you dont want to cite any of them, you should instead write 'None'.\n" - "Thirdly, Write 'Answer:' followed by a response to the user's last input " - "in high quality natural english. Use the retrieved documents to help you. " - "Do not insert any citations or grounding markup.\n" - "Finally, Write 'Grounded answer:' followed by a response to the user's " - "last input in high quality natural english. Use the symbols and " - " to indicate when a fact comes from a document in the search " - "result, e.g my fact for a fact from document 0." + "\n" + "Given the context information and not prior knowledge, answer the question." + "If the context is irrelevant to the question, answer that you do not know " + "the answer to the question given the context.\n" + f"Question: {prompt.query.strip()}\n\n" + "Answer:" ) return metaprompt def generate(self, prompt: Prompt) -> Generator[Any, Any, Any]: log.debug("Generating answer with ollama...") metaprompt = self.__metaprompt(prompt) - for chunk in ollama.generate( - model=self.model, prompt=metaprompt, system=SYSTEM_PROMPT, stream=True - ): + for chunk in ollama.generate(model=self.model, prompt=metaprompt, stream=True): yield chunk["response"] -- cgit v1.2.3-70-g09d2