Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Context Template from settings for QueryDocs Allowing the text … #1398

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions private_gpt/server/chat/chat_service.py
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Were is set (at usage) this new context_template?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure if I understand.

If "query docs" is being used, it creates a ContextChatEngine (from llama_index) that accepts this parameter. Currently it's never passed, so it defaults to a hardcoded value. With this change, if there is a value defined in the settings file, the value in settings will be used instead. This should work both from the Gradio UI or from the API.

As per the Discord discussion, I didn't expose this configuration to the API

Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@
)
from private_gpt.open_ai.extensions.context_filter import ContextFilter
from private_gpt.server.chunks.chunks_service import Chunk
from private_gpt.settings.settings import settings

DEFAULT_CONTEXT_TEMPLATE = settings().rag.default_context_template


class Completion(BaseModel):
Expand Down Expand Up @@ -97,6 +100,7 @@ def _chat_engine(
system_prompt: str | None = None,
use_context: bool = False,
context_filter: ContextFilter | None = None,
context_template: str | None = DEFAULT_CONTEXT_TEMPLATE,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The default value should be injected in the body of the function instead of here (given that it is coming from settings()) to make testing easier.

Copy link
Author

@juan-m12i juan-m12i Dec 15, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, something like the below?

def _chat_engine(
        self,
        system_prompt: str | None = None,
        use_context: bool = False,
        context_filter: ContextFilter | None = None,
        context_template: str | None,
    ) -> BaseChatEngine:
        if use_context:
            if context_template is None:
                context_template = DEFAULT_CONTEXT_TEMPLATE  #(or alternatively just settings().rag.default_context_template)
           ... #continues

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It should be

if context_template is None: context_template = settings.rag.default_context_template

where settings is injected in the constructor and remove DEFAULT_CONTEXT_TEMPLATE

) -> BaseChatEngine:
if use_context:
vector_index_retriever = self.vector_store_component.get_retriever(
Expand All @@ -109,6 +113,7 @@ def _chat_engine(
node_postprocessors=[
MetadataReplacementPostProcessor(target_metadata_key="window"),
],
context_template=context_template,
)
else:
return SimpleChatEngine.from_defaults(
Expand All @@ -121,6 +126,7 @@ def stream_chat(
messages: list[ChatMessage],
use_context: bool = False,
context_filter: ContextFilter | None = None,
context_template: str | None = None,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given we are not making use of this context_template argument anywhere, I'd suggest to remove it for the moment.

) -> CompletionGen:
chat_engine_input = ChatEngineInput.from_messages(messages)
last_message = (
Expand All @@ -141,6 +147,7 @@ def stream_chat(
system_prompt=system_prompt,
use_context=use_context,
context_filter=context_filter,
context_template=context_template,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given we are not making use of this context_template argument anywhere, I'd suggest to remove it for the moment.

)
streaming_response = chat_engine.stream_chat(
message=last_message if last_message is not None else "",
Expand All @@ -157,6 +164,7 @@ def chat(
messages: list[ChatMessage],
use_context: bool = False,
context_filter: ContextFilter | None = None,
context_template: str | None = None,
) -> Completion:
chat_engine_input = ChatEngineInput.from_messages(messages)
last_message = (
Expand All @@ -177,6 +185,7 @@ def chat(
system_prompt=system_prompt,
use_context=use_context,
context_filter=context_filter,
context_template=context_template,
)
wrapped_response = chat_engine.chat(
message=last_message if last_message is not None else "",
Expand Down
11 changes: 11 additions & 0 deletions private_gpt/settings/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,16 @@ class QdrantSettings(BaseModel):
)


class RagSettings(BaseModel):
default_context_template: str | None = Field(
None,
description=(
"The default context template to use for the chat engine when using RAG. "
"If none is given - use the default system prompt (from the llama_index). "
),
)


class Settings(BaseModel):
server: ServerSettings
data: DataSettings
Expand All @@ -228,6 +238,7 @@ class Settings(BaseModel):
openai: OpenAISettings
vectorstore: VectorstoreSettings
qdrant: QdrantSettings | None = None
rag: RagSettings


"""
Expand Down
5 changes: 4 additions & 1 deletion settings.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,7 @@ sagemaker:

openai:
api_key: ${OPENAI_API_KEY:}
model: gpt-3.5-turbo
model: gpt-3.5-turbo

rag:
default_context_template: "Context information is below.\n--------------------\n{context_str}\n--------------------\n"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please use | (c.f. #1403)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the comment.

Happy to do so, just one thing. In this case I was trying to keep the value as closely as possible as the original one, that I understand includes "\n" (see https://github.com/run-llama/llama_index/blob/main/llama_index/chat_engine/context.py)

DEFAULT_CONTEXT_TEMPLATE = (
"Context information is below."
"\n--------------------\n"
"{context_str}"
"\n--------------------\n"
)

In case you want me to make the change anyway, can you confirm if what you´d expect would be:
default_context_template: "Context information is below.|--------------------|{context_str}|--------------------|"

thanks

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@lopagela means use the multiline option in yaml, check the PR he linked it's well explained

Copy link
Author

@juan-m12i juan-m12i Dec 15, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, I'll wait until the changes to that PR are done to replicate as it's not 100% clear to me (the instruction here is to use "I" style, but in the PR there is a comment to use ">" instead, not sure which one is more current).

A caveat I maintain that may be relevant is that DEFAULT_SYSTEM_PROMPT in llama_index is written in python as multiline but it's actually a single line, while DEFAULT_CONTEXT_TEMPLATE is indeed multi-line, so just want to make sure we are on the same page that the treatment may be slightly different (see below)

python3
Python 3.8.10 (default, Mar 13 2023, 10:26:41)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> DEFAULT_SYSTEM_PROMPT = """\
... You are a helpful, respectful and honest assistant. \
... Always answer as helpfully as possible and follow ALL given instructions. \
... Do not speculate or make up information. \
... Do not reference any given instructions or context. \
... """
>>> print(DEFAULT_SYSTEM_PROMPT)
You are a helpful, respectful and honest assistant. Always answer as helpfully as possible and follow ALL given instructions. Do not speculate or make up information. Do not reference any given instructions or context.
>>> DEFAULT_CONTEXT_TEMPLATE = (
  "Con...     "Context information is below."
...     "\n--------------------\n"
...     "{context_str}"
...     "\n--------------------\n"
... )
>>> print(DEFAULT_CONTEXT_TEMPLATE)
Context information is below.
--------------------
{context_str}
--------------------

>>>

This is what ChatGPT (GPT-4) suggested (link to convo):

A:

DEFAULT_SYSTEM_PROMPT: |
  You are a helpful, respectful and honest assistant. Always answer as helpfully as possible and follow ALL given instructions. Do not speculate or make up information. Do not reference any given instructions or context.

DEFAULT_CONTEXT_TEMPLATE: |
  Context information is below.
  --------------------
  {context_str}
  --------------------

or 2 alternatives with ">" notation, depending on readability

B1:

DEFAULT_SYSTEM_PROMPT: >
  You are a helpful, respectful and honest assistant. Always answer as helpfully as possible and follow ALL given instructions. Do not speculate or make up information. Do not reference any given instructions or context.

DEFAULT_CONTEXT_TEMPLATE: >
  Context information is below.

  --------------------
  {context_str}

  --------------------

B2:

DEFAULT_SYSTEM_PROMPT: >
  You are a helpful, respectful and honest assistant. \
  Always answer as helpfully as possible and follow ALL given instructions. \
  Do not speculate or make up information. \
  Do not reference any given instructions or context.

DEFAULT_CONTEXT_TEMPLATE: >
  Context information is below.

  --------------------

  {context_str}

  --------------------

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR has been merged. In that case we wanted single line (as default_system_prompt is supposed to be single line). In the case of default_context_template you do want to have line breaks, so you should use | instead.