Spaces:
Runtime error
Runtime error
| from groq import Groq | |
| from langchain_groq import ChatGroq | |
| from langchain_core.prompts import ( | |
| ChatPromptTemplate, | |
| HumanMessagePromptTemplate, | |
| MessagesPlaceholder, | |
| ) | |
| from langchain.chains import LLMChain, SequentialChain | |
| from langchain_core.messages import SystemMessage | |
| from langchain.chains.conversation.memory import ConversationBufferWindowMemory | |
| from typing import Dict, Optional | |
| from langchain.chains.router import MultiPromptChain | |
| from langchain.chains.router.llm_router import LLMRouterChain,RouterOutputParser | |
| from langchain.prompts import PromptTemplate | |
| import pandas as pd | |
| import os | |
| import json | |
| class GROQ: | |
| def __init__(self, api_key: str = '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'): | |
| self.client: Groq = Groq( | |
| api_key=api_key | |
| ) | |
| def chat(self, prompt: str, model: str, response_format: Optional[Dict]) -> str: | |
| completion = self.client.chat.completions.create( | |
| model=model, messages=[{"role": "user", "content": prompt}], response_format=response_format) | |
| return completion.choices[0].message.content | |
| def get_summarization(self, user_question: str, df: pd.DataFrame, model: str) -> str: | |
| """ | |
| This function generates a summarization prompt based on the user's question and the resulting data. | |
| It then sends this summarization prompt to the Groq API and retrieves the AI's response. | |
| Parameters: | |
| client (Groqcloud): The Groq API client. | |
| user_question (str): The user's question. | |
| model (str): The AI model to use for the response. | |
| Returns: | |
| str: The content of the AI's response to the summarization prompt. | |
| """ | |
| prompt = ''' | |
| {user_question} | |
| '''.format(user_question = user_question) | |
| # Response format is set to 'None' | |
| return self.chat(prompt,model,None) | |
| class ConversationGROQ: | |
| def __init__(self, conversational_memory_length: int = 10, api_key: str = os.getenv('GROQ_API_KEY'), model: str = os.getenv('GROQ_MODEL')): | |
| self.client: ChatGroq = ChatGroq( | |
| groq_api_key=api_key, | |
| model=model | |
| ) | |
| self.memory: ConversationBufferWindowMemory = ConversationBufferWindowMemory(k=conversational_memory_length, memory_key="chat_history", return_messages=True) | |
| self.conversation: Optional[LLMChain] = None | |
| def sequential_chain(self, llm: ChatGroq, prompt_sequences: list[Dict[str, str]], input_variable: list[str], output_variable: list[str]): | |
| """ | |
| This function creates a sequential chain of LLM chains based on the provided prompt sequences, input variables, and output variables. | |
| Parameters: | |
| llm (ChatGroq): The Groq API client. | |
| prompt_sequences (list[Dict[str, str]]): A list of dictionaries containing the prompt and output key for each sequence. | |
| input_variable (list[str]): A list of input variables for the overall chain. | |
| output_variable (list[str]): A list of output variables for the overall chain. | |
| Example: | |
| prompt_sequences = [ | |
| {'prompt': 'You are a helpful assistant.{input} Answer the user\'s question. {user_input}', 'output_key': 'prompt1'}, | |
| {'prompt': 'You are a helpful assistant. Answer the user\'s question. {user_input}', 'output_key': 'prompt2'}, | |
| {'prompt': 'You are a helpful assistant. Answer the user\'s question. {user_input}', 'output_key': 'final'} | |
| ] | |
| input_variable = ['input'] | |
| output_variable = ['prompt1', 'prompt2', 'final'] | |
| Returns: | |
| SequentialChain: An overall chain that combines all the individual chains. | |
| """ | |
| chains = [] | |
| for sequence in prompt_sequences: | |
| prompt = sequence['prompt'] | |
| output_key = sequence['output_key'] | |
| template = ChatPromptTemplate.from_template(prompt) | |
| chain = LLMChain(llm=llm or self.client, prompt=template, output_key=output_key) | |
| chains.append(chain) | |
| overall_chain = SequentialChain( | |
| chains=chains, | |
| input_variables=input_variable, | |
| output_variables=output_variable, | |
| verbose=True | |
| ) | |
| return overall_chain | |
| def create_router_chain(self, templates_prompts: list[Dict[str, str]], llm: Optional[ChatGroq] = None): | |
| MULTI_PROMPT_ROUTER_TEMPLATE = """Given a raw text input to a \ | |
| language model select the model prompt best suited for the input. \ | |
| You will be given the names of the available prompts and a \ | |
| description of what the prompt is best suited for. \ | |
| You may also revise the original input if you think that revising\ | |
| it will ultimately lead to a better response from the language model. | |
| << FORMATTING >> | |
| Return a markdown code snippet with a JSON object formatted to look like: | |
| ```json | |
| {{{{ | |
| "destination": string \ name of the prompt to use or "DEFAULT" | |
| "next_inputs": string \ a potentially modified version of the original input | |
| }}}} | |
| ``` | |
| REMEMBER: "destination" MUST be one of the candidate prompt \ | |
| names specified below OR it can be "DEFAULT" if the input is not\ | |
| well suited for any of the candidate prompts. | |
| REMEMBER: "next_inputs" can just be the original input \ | |
| if you don't think any modifications are needed. | |
| << CANDIDATE PROMPTS >> | |
| {destinations} | |
| << INPUT >> | |
| {{input}} | |
| << OUTPUT (remember to include the ```json)>>""" | |
| destination_chains = {} | |
| for template in templates_prompts: | |
| destination_chains[template['name']] = LLMChain(llm=llm or self.client, memory=self.memory, prompt=ChatPromptTemplate.from_template(template= template['prompt_template'])) | |
| destinations = [f"{template['name']}: {template['description']}" for template in templates_prompts] | |
| destinations_str = "\n".join(destinations) | |
| router_template = MULTI_PROMPT_ROUTER_TEMPLATE.format(destinations=destinations_str) | |
| router_prompt = PromptTemplate( | |
| template=router_template, | |
| input_variables=["input"], | |
| output_parser=RouterOutputParser(), | |
| ) | |
| default_prompt = ChatPromptTemplate.from_template("{input}") | |
| default_chain = LLMChain(llm=llm or self.client, memory=self.memory, prompt=default_prompt) | |
| router_chain = LLMRouterChain.from_llm(llm or self.client, router_prompt) | |
| chain = MultiPromptChain(router_chain=router_chain, | |
| destination_chains=destination_chains, | |
| default_chain=default_chain, verbose=True | |
| ) | |
| return chain | |
| def get_conditional_template(self, input: str, categories: list[Dict[str, str]]) -> ChatPromptTemplate: | |
| MULTI_PROMPT_ROUTER_TEMPLATE = """Given a raw text input to a \ | |
| language model select the model prompt best suited for the input. \ | |
| You will be given the names of the available prompts and a \ | |
| description of what the prompt is best suited for. \ | |
| You may also revise the original input if you think that revising\ | |
| it will ultimately lead to a better response from the language model. | |
| << FORMATTING >> | |
| Return a markdown code snippet with a JSON object formatted to look like: | |
| ```json | |
| {{{{ | |
| "destination": string \ name of the prompt to use or "DEFAULT" | |
| "next_inputs": string \ a potentially modified version of the original input | |
| }}}} | |
| ``` | |
| REMEMBER: "destination" MUST be one of the candidate prompt \ | |
| names specified below OR it can be "DEFAULT" if the input is not\ | |
| well suited for any of the candidate prompts. | |
| REMEMBER: "next_inputs" can just be the original input \ | |
| if you don't think any modifications are needed. | |
| << CANDIDATE PROMPTS >> | |
| {destinations} | |
| << INPUT >> | |
| {input} | |
| << OUTPUT (remember to include the ```json)>>""".format(destinations = "\n".join([f"{template['name']}: {template['description']}" for template in categories]), input = input) | |
| router_prompt = PromptTemplate( | |
| template=MULTI_PROMPT_ROUTER_TEMPLATE, | |
| input_variables=["input"], | |
| ) | |
| response = LLMChain(llm=self.client, prompt=router_prompt).predict(input = input) | |
| json_str = response.split('```json')[1].split('```')[0].strip() | |
| return json.loads(json_str) | |
| def create_template(self, base_prompt: str) -> ChatPromptTemplate: | |
| return ChatPromptTemplate.from_messages([ | |
| SystemMessage( | |
| content=base_prompt | |
| ), # This is the persistent system prompt that is always included at the start of the chat. | |
| MessagesPlaceholder( | |
| variable_name="chat_history" | |
| ), # This placeholder will be replaced by the actual chat history during the conversation. It helps in maintaining context. | |
| HumanMessagePromptTemplate.from_template( | |
| "{human_input}" | |
| ), # This template is where the user's current input will be injected into the prompt. | |
| ]) | |
| def create_conversation(self, prompt: str = None, llm = None, memory = None, verbose: bool = True): | |
| self.conversation = LLMChain( | |
| llm=llm or self.client, | |
| memory=memory or self.memory, | |
| prompt=self.create_template(prompt) if prompt else None, | |
| verbose=verbose | |
| ) | |
| return self.conversation | |
| def chat(self, user_input: str) -> str: | |
| if self.conversation is None: | |
| raise ValueError("Conversation not initialized. Call create_conversation() first.") | |
| return self.conversation.predict(human_input =user_input) | |