From 2a7d43551e4e2315931a37372245ea1ae74754e9 Mon Sep 17 00:00:00 2001 From: Taranjeet Singh Date: Fri, 7 Jul 2023 19:26:07 +0530 Subject: [PATCH] feat: Add person bot (#182) This commit introduces a new bot type called Person. It behaves and speaks like a particular Person. For this two app types: PersonApp and PersonOpenSourceApp --- embedchain/__init__.py | 2 +- embedchain/config/QueryConfig.py | 11 +++--- embedchain/embedchain.py | 58 +++++++++++++++++++++++++++++++- 3 files changed, 64 insertions(+), 7 deletions(-) diff --git a/embedchain/__init__.py b/embedchain/__init__.py index c023c80b..24e8f1c1 100644 --- a/embedchain/__init__.py +++ b/embedchain/__init__.py @@ -1 +1 @@ -from .embedchain import App, OpenSourceApp \ No newline at end of file +from .embedchain import App, OpenSourceApp, PersonApp, PersonOpenSourceApp \ No newline at end of file diff --git a/embedchain/config/QueryConfig.py b/embedchain/config/QueryConfig.py index f40c4a30..68e58efb 100644 --- a/embedchain/config/QueryConfig.py +++ b/embedchain/config/QueryConfig.py @@ -2,17 +2,18 @@ from embedchain.config.BaseConfig import BaseConfig from string import Template import re - -DEFAULT_PROMPT_TEMPLATE = Template(""" +DEFAULT_PROMPT = """ Use the following pieces of context to answer the query at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer. $context - + Query: $query - + Helpful Answer: -""") +""" + +DEFAULT_PROMPT_TEMPLATE = Template(DEFAULT_PROMPT) query_re = re.compile(r"\$\{*query\}*") context_re = re.compile(r"\$\{*context\}*") diff --git a/embedchain/embedchain.py b/embedchain/embedchain.py index ab70c62f..aa84f747 100644 --- a/embedchain/embedchain.py +++ b/embedchain/embedchain.py @@ -8,6 +8,7 @@ from langchain.docstore.document import Document from langchain.embeddings.openai import OpenAIEmbeddings from langchain.memory import ConversationBufferMemory from embedchain.config import InitConfig, AddConfig, QueryConfig, ChatConfig +from embedchain.config.QueryConfig import DEFAULT_PROMPT from embedchain.loaders.youtube_video import YoutubeVideoLoader from embedchain.loaders.pdf_file import PdfFileLoader @@ -42,7 +43,7 @@ class EmbedChain: :param config: InitConfig instance to load as configuration. """ - + self.config = config self.db_client = self.config.db.client self.collection = self.config.db.collection @@ -388,3 +389,58 @@ class OpenSourceApp(EmbedChain): prompt=prompt, ) return response + + +class EmbedChainPersonApp: + """ + Base class to create a person bot. + This bot behaves and speaks like a person. + + :param person: name of the person, better if its a well known person. + :param config: InitConfig instance to load as configuration. + """ + def __init__(self, person, config: InitConfig = None): + self.person = person + self.person_prompt = f"You are {person}. Whatever you say, you will always say in {person} style." + self.template = Template( + self.person_prompt + " " + DEFAULT_PROMPT + ) + if config is None: + config = InitConfig() + super().__init__(config) + + +class PersonApp(EmbedChainPersonApp, App): + """ + The Person app. + Extends functionality from EmbedChainPersonApp and App + """ + def query(self, input_query, config: QueryConfig = None): + query_config = QueryConfig( + template=self.template, + ) + return super().query(input_query, query_config) + + def chat(self, input_query, config: ChatConfig = None): + chat_config = ChatConfig( + template = self.template, + ) + return super().chat(input_query, chat_config) + + +class PersonOpenSourceApp(EmbedChainPersonApp, OpenSourceApp): + """ + The Person app. + Extends functionality from EmbedChainPersonApp and OpenSourceApp + """ + def query(self, input_query, config: QueryConfig = None): + query_config = QueryConfig( + template=self.template, + ) + return super().query(input_query, query_config) + + def chat(self, input_query, config: ChatConfig = None): + chat_config = ChatConfig( + template = self.template, + ) + return super().chat(input_query, chat_config) \ No newline at end of file