joaopaulopresa commited on
Commit
79ebcf2
1 Parent(s): 7105889

Upload 7 files

Browse files
chat_handler.py ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from pydantic import BaseModel
2
+ from langchain_community.vectorstores import FAISS
3
+ from langchain.chains import RetrievalQA
4
+ from langchain.agents import Tool, AgentExecutor, create_json_chat_agent, create_react_agent
5
+ from langchain_core.messages import AIMessage, HumanMessage
6
+ from personal_models import PersonalModels
7
+ from personal_templates import PersonalTemplate
8
+ import uuid
9
+
10
+ #------------------------------- Mixtral
11
+ def create_model_instances(model_name, embedding_model, embedding_dir, agent_type):
12
+ templates = PersonalTemplate()
13
+ models = PersonalModels()
14
+ chat_model = models.get_chat_model(
15
+ model=model_name,
16
+ temperature=0.1,
17
+ max_tokens=1000)
18
+
19
+ llm = models.get_rag_model(
20
+ model=model_name,
21
+ temperature=0.1,
22
+ max_tokens=500,
23
+ top_k=20)
24
+ embeddings = models.get_embedding_model(model=embedding_model)
25
+ vectorstore = FAISS.load_local(embedding_dir, embeddings)
26
+
27
+ qa_tool = RetrievalQA.from_chain_type(
28
+ llm=llm,
29
+ chain_type="stuff",
30
+ retriever=vectorstore.as_retriever(),
31
+ verbose=True,
32
+ chain_type_kwargs={'prompt': templates.retriever_prompt}
33
+ )
34
+
35
+ tools = [
36
+ Tool(
37
+ name='tax-law-search',
38
+ func=qa_tool.run,
39
+ description='useful when you want to answer questions about brazilian tax law and legal entities',
40
+ verbose=True
41
+ )
42
+ ]
43
+ print('Usando agente do tipo: ',agent_type)
44
+ if agent_type == 'JSON_CHAT_MODEL':
45
+ agent = create_json_chat_agent(chat_model, tools, templates.chatbot_tributario_prompt)
46
+ else:
47
+ agent = create_react_agent(llm, tools, templates.chatbot_tributario_prompt_react)
48
+ agent_executor = AgentExecutor(agent=agent, tools=tools, handle_parsing_errors="Check your output and make sure it conforms! Do not output an action and a final answer at the same time.", return_intermediate_steps=True, verbose=True)
49
+ return agent_executor
50
+
51
+ #-------------------------------- Classe Modificada
52
+ class Message(BaseModel):
53
+ user_id: str
54
+ text: str
55
+ model: str
56
+ embedding_model: str
57
+ embedding_dir: str
58
+ agent_type: str
59
+
60
+ class ChatHandler:
61
+ historico_por_usuario = {}
62
+
63
+ def __init__(self):
64
+ pass
65
+
66
+ def generate_id(self):
67
+ new_id = str(uuid.uuid4())
68
+ self.historico_por_usuario[new_id] = []
69
+ return new_id
70
+
71
+ def clear_history(self, user_id):
72
+ if user_id not in self.historico_por_usuario:
73
+ return "Usuário não encontrado"
74
+ self.historico_por_usuario[user_id].clear()
75
+ return "Histórico limpo com sucesso"
76
+
77
+ def post_message(self, message: dict):
78
+ user_id = message['user_id']
79
+ if user_id not in self.historico_por_usuario:
80
+ return "Usuário não encontrado"
81
+
82
+ model_name = message['model']
83
+ agent_executor = create_model_instances(model_name, message['embedding_model'], message['embedding_dir'], message['agent_type'])
84
+
85
+ try:
86
+ print('message: ', message['text'])
87
+ chat_history = self.historico_por_usuario[user_id][-10:]
88
+ response = agent_executor.invoke(
89
+ {
90
+ "input": message['text'],
91
+ "chat_history": chat_history
92
+ }
93
+ )
94
+ print(response['intermediate_steps'])
95
+ self.historico_por_usuario[user_id].append(HumanMessage(content=message['text']))
96
+ self.historico_por_usuario[user_id].append(AIMessage(content=response['output']))
97
+ except Exception as e:
98
+ response = {'output': 'Ocorreu um erro de execução do Agente. O erro não será salvo no histórico, tente novamente.',
99
+ 'intermediate_steps':[]}
100
+
101
+ return response['output'],response['intermediate_steps']
data_module.py ADDED
@@ -0,0 +1,186 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ model_options = ["mistralai/Mixtral-8x7B-Instruct-v0.1",
3
+ #'NousResearch/Nous-Hermes-2-Yi-34B',
4
+ 'mistralai/Mistral-7B-Instruct-v0.2',
5
+ 'openchat/openchat-3.5-1210',
6
+ #'Open-Orca/Mistral-7B-OpenOrca',
7
+ #'teknium/OpenHermes-2p5-Mistral-7B',
8
+ #'togethercomputer/Llama-2-7B-32K-Instruct',
9
+ #'togethercomputer/RedPajama-INCITE-Chat-3B-v1',
10
+ #'NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO',
11
+ #'NousResearch/Nous-Hermes-2-Mixtral-8x7B-SFT',
12
+ #'zero-one-ai/Yi-34B-Chat',
13
+ 'upstage/SOLAR-10.7B-Instruct-v1.0',
14
+ "upstage/SOLAR-0-70b-16bit",
15
+ 'garage-bAInd/Platypus2-70B-instruct',
16
+ # "lmsys/vicuna-13b-v1.5-16k",
17
+ "lmsys/vicuna-13b-v1.5",
18
+ #"lmsys/vicuna-7b-v1.5",
19
+ ]
20
+
21
+ faq_data = [
22
+ {
23
+ "question": "Olá, eu me chamo José!",
24
+ "answer": "Pergunta basica para ver se o agente consegue manter um dialogo."
25
+ },
26
+ {
27
+ "question": "O que se considera data do evento nas hipóteses de cisão, fusão, incorporação ou extinção da pessoa jurídica?",
28
+ "answer": "Considera-se data do evento aquela em que houve a deliberação que aprovou a cisão, incorporação ou fusão. No caso de extinção a data que ultimar a liquidação da pessoa jurídica."
29
+ },
30
+ {
31
+ "question": "Em que época deverão ser apurados os resultados da empresa individual relativos à pessoa física equiparada a pessoa jurídica por prática de operações imobiliárias?",
32
+ "answer": "O lucro da empresa individual deverá ser apurado ao término de cada período de apuração, trimestral ou anual, e compreenderá o resultado de todas as operações realizadas nesse período."
33
+ },
34
+ {
35
+ "question": "Como determinar o capital da empresa individual no caso de pessoa física equiparada por prática de operações imobiliárias?",
36
+ "answer": "O capital da empresa individual, no início de cada período de apuração (trimestral ou anual), será representado pela soma dos valores dos imóveis constantes do seu ativo com os valores a receber relativos ao custo dos imóveis já vendidos em períodos de apuração anteriores."
37
+ },
38
+ # Continuação das perguntas e respostas
39
+ {
40
+ "question": "Como se conhecerá, na prática, uma pessoa jurídica em processo de liquidação?",
41
+ "answer": "Em todos os atos ou operações necessárias à liquidação, o liquidante deverá usar a denominação social seguida das palavras “em liquidação”."
42
+ },
43
+ {
44
+ "question": "O que é incorporação da pessoa jurídica?",
45
+ "answer": "A incorporação é a operação pela qual uma ou mais sociedades são absorvidas por outra, que lhes sucede em todos os direitos e obrigações. Desaparecem as sociedades incorporadas, permanecendo, porém, com a sua natureza jurídica inalterada, a sociedade incorporadora."
46
+ },
47
+ {
48
+ "question": "Como deverão ser tratados os reajustes posteriores à época do recebimento do bem adquirido por meio de consórcio?",
49
+ "answer": "As variações do saldo devedor que ocorrerem no futuro, decorrentes da modificação no valor das prestações, serão refletidas nas contas que registram a obrigação, sendo sua contrapartida considerada como variação monetária passiva (ou ativa)."
50
+ },
51
+ {
52
+ "question": "Quando devem ser baixados os bens obsoletos, constantes do Ativo Imobilizado da pessoa jurídica?",
53
+ "answer": "Quaisquer bens constantes do ativo imobilizado da pessoa jurídica, quer estejam totalmente depreciados ou não, somente podem ser baixados da contabilidade e do controle patrimonial concomitantemente à efetiva baixa física do bem."
54
+ },{
55
+ "question": "Quais as alíquotas aplicáveis sobre o lucro, para determinar o imposto de renda devido pela pessoa jurídica em cada período de apuração?",
56
+ "answer": "A partir do ano-calendário de 1996, as pessoas jurídicas, independentemente da forma de constituição e da natureza da atividade exercida, passaram a pagar o imposto de renda à alíquota de quinze por cento, incidente sobre a base de cálculo apurada na forma do lucro real, presumido ou arbitrado."
57
+ },
58
+ {
59
+ "question": "O que se deve considerar como ajustes de exercícios (períodos) anteriores?",
60
+ "answer": "Como ajustes de exercícios (períodos) anteriores serão consideradas apenas as regularizações decorrentes de efeitos de mudança de critério contábil, ou de retificação de erro imputável a determinado período anterior, e que não possam ser atribuídas a fatos subsequentes."
61
+ },
62
+ {
63
+ "question": "O que são descontos incondicionais?",
64
+ "answer": "Somente são consideradas, como descontos incondicionais, as parcelas redutoras do preço de vendas, quando constarem da nota fiscal de venda dos bens ou da fatura de serviços e não dependerem, para sua concessão, de evento posterior à emissão desses documentos."
65
+ },
66
+ {
67
+ "question": "Em que consiste a exaustão, em termos contábeis?",
68
+ "answer": "Exaurir significa esgotar completamente. Em termos contábeis, a exaustão se relaciona com a perda de valor dos bens ou direitos do ativo, ao longo do tempo, decorrentes de sua exploração (extração ou aproveitamento)."
69
+ },
70
+ {
71
+ "question": "Como os direitos sujeitos à exaustão serão apresentados no balanço?",
72
+ "answer": "No balanço, os direitos serão classificados no ativo imobilizado e deverão ser avaliados pelo custo de aquisição, deduzido do saldo da respectiva conta de exaustão acumulada."
73
+ },
74
+ {
75
+ "question": "Como proceder no período de apuração seguinte ao do provisionamento de férias dos empregados?",
76
+ "answer": "As importâncias pagas serão debitadas à provisão até o limite do valor provisionado. O saldo porventura remanescente, na data da apuração do resultado ou balanço seguinte, será revertido e, se for o caso, poderá ser constituída nova provisão."
77
+ },
78
+ {
79
+ "question": "Como deve proceder o contribuinte que deixou de contabilizar ou contabilizou a menor o valor da provisão para o imposto sobre a renda?",
80
+ "answer": "Deve, no curso do período de apuração seguinte, mediante lançamento de ajuste em contas próprias, com efeitos retroativos ao início do período de apuração, regularizar sua situação contábil pelo registro do valor da provisão (ou da diferença a menor apurada), a débito de conta do patrimônio líquido (prejuízos acumulados)."
81
+ },
82
+ {
83
+ "question": "O que se entende por créditos com garantia, para efeito da legislação fiscal?",
84
+ "answer": "Consideram-se créditos com garantia ou créditos garantidos, para efeito da legislação fiscal, aqueles provenientes de vendas com reserva de domínio, alienação fiduciária em garantia ou operações com outras garantias reais."
85
+ },
86
+ {
87
+ "question": "Quais os pagamentos que, embora efetuados no período de apuração, não serão considerados dedutíveis a título de retiradas pro labore?",
88
+ "answer": "Não serão consideradas como dedutíveis, na determinação do lucro real, as retiradas não debitadas em custos ou despesas operacionais, ou contas subsidiárias, e aquelas que, mesmo escrituradas nessas contas, não correspondam a remuneração mensal fixa por prestação de serviços."
89
+ },
90
+ {
91
+ "question": "As sociedades por ações poderão ter quantos conselheiros fiscais?",
92
+ "answer": "O conselho fiscal será composto de, no mínimo, 3 (três), e no máximo, 5 (cinco) membros, e suplentes em igual número, acionistas ou não, eleitos pela assembleia- geral."
93
+ },
94
+ {
95
+ "question": "Qual o tratamento tributário aplicável ao prejuízo fiscal apurado por Sociedade em Conta de Participação (SCP)?",
96
+ "answer": "O prejuízo fiscal apurado por Sociedade em Conta de Participação (SCP), somente poderá ser compensado com o lucro real decorrente da mesma SCP. É vedada a compensação de prejuízos fiscais e lucros entre duas ou mais SCP, ou entre estas e o sócio ostensivo."
97
+ },
98
+ {
99
+ "question": "Como será controlado, no Livro de Apuração do Lucro Real (Lalur), o prejuízo a compensar?",
100
+ "answer": "O controle do valor dos prejuízos compensáveis, na forma da legislação vigente, deve ser feito de forma individualizada por espécie, na Parte B do Lalur, por período de apuração (anual ou trimestral)."
101
+ },
102
+ {
103
+ "question": "Existe prazo para a compensação de prejuízos fiscais da atividade rural?",
104
+ "answer": "Não existe qualquer prazo para compensação de prejuízos fiscais da atividade rural."
105
+ },
106
+ {
107
+ "question": "O que poderá acontecer à pessoa jurídica que optar indevidamente ou deixar de cumprir alguma das condições estabelecidas para opção pelo lucro presumido?",
108
+ "answer": "Inicialmente será verificada a possibilidade de apuração da base de cálculo do imposto de renda pelo lucro real, caso a empresa mantenha escrituração regular com base nas leis comerciais e fiscais. Na impossibilidade de adoção de tal procedimento, deverá ser arbitrado o lucro da pessoa jurídica no respectivo período de apuração."
109
+ },
110
+ {
111
+ "question": "Qual o tratamento tributário aplicável aos lucros, rendimentos e ganhos de capital oriundos do exterior, no caso de pessoa jurídica submetida ao regime de tributação com base no lucro arbitrado?",
112
+ "answer": "Os lucros, rendimentos e ganhos de capital oriundos do exterior serão adicionados ao lucro arbitrado para determinação da base de cálculo do imposto."
113
+ },
114
+ {
115
+ "question": "Quando deve ser pago o imposto apurado nos casos de incorporação, fusão, cisão, encerramento de atividade ou de extinção da pessoa jurídica pelo encerramento da liquidação?",
116
+ "answer": "O imposto devido deve ser pago em quota única até o último dia útil do mês subsequente ao do evento."
117
+ },
118
+ {
119
+ "question": "O registro da CSLL como despesa afetará o cálculo do lucro da exploração?",
120
+ "answer": "A CSLL será adicionada ao lucro líquido do período de apuração, antes da provisão para o imposto de renda, para efeito de determinação do lucro da exploração, que servirá de base de cálculo de incentivos fiscais."
121
+ },
122
+ {
123
+ "question": "A que tributos ou contribuições se aplica a legislação de preços de transferência?",
124
+ "answer": "Ao imposto sobre a renda e à contribuição social sobre o lucro líquido."
125
+ },
126
+ {
127
+ "question": "No caso de utilização do método PRL, a data a ser considerada do preço de venda do preço parâmetro será a data de importação do bem importado ou do período em que o bem for baixado do estoque?",
128
+ "answer": "No caso de ser utilizado o método PRL, o preço parâmetro deve ser apurado considerando-se os preços de venda no período em que os produtos forem baixados dos estoques para resultado."
129
+ },
130
+ {
131
+ "question": "Qual o regime de tributação da pessoa jurídica que auferir lucros, rendimentos e ganhos de capital do exterior?",
132
+ "answer": "A pessoa jurídica que auferir lucros, rendimentos ou ganhos de capital do exterior fica obrigada à tributação com base no lucro real, a partir, inclusive, do trimestre de sua ocorrência."
133
+ },
134
+ {
135
+ "question": "Como serão tributados no Brasil os lucros auferidos no exterior por intermédio de filiais e sucursais da pessoa jurídica no Brasil?",
136
+ "answer": "Para fins de apuração do lucro real e da base de cálculo da CSLL, os lucros auferidos por filiais e sucursais no exterior serão adicionados integralmente ao lucro líquido da pessoa jurídica no Brasil em 31 de dezembro do ano-calendário em que tiverem sido disponibilizados."
137
+ },
138
+ {
139
+ "question": "Quando se consideram disponibilizados os lucros auferidos no exterior por intermédio filiais e sucursais da pessoa jurídica?",
140
+ "answer": "Consideram-se disponibilizados na data do balanço no qual tiverem sido apurados."
141
+ },
142
+ {
143
+ "question": "Como deverão ser convertidos os lucros auferidos no exterior por intermédio de filiais, sucursais, controladas ou coligadas?",
144
+ "answer": "Os lucros auferidos no exterior por intermédio de filiais, sucursais, controladas ou coligadas serão convertidos em Reais pela taxa de câmbio, para venda, do dia das demonstrações financeiras em que tenham sido apurados os correspondentes lucros."
145
+ },
146
+ {
147
+ "question": "Qual é o valor da parcela do investimento referente ao lucro ou prejuízo de investimento no exterior que deve ser registrada na subconta de investimento?",
148
+ "answer": "O valor a ser registrado na subconta de investimento é o equivalente aos lucros ou prejuízos antes da tributação no exterior sobre tais lucros ou prejuízos, assim entendido como o lucro ou prejuízo antes dos tributos sobre a renda, sejam correntes e/ou diferidos."
149
+ },
150
+ {
151
+ "question": "No caso de ajuste de preço de transferência a maior feito pelo Fisco, a diferença entre o valor adicionado espontaneamente pelo contribuinte e o valor do ajuste determinado pelo fisco poderá ser deduzido do lucro real e da base de cálculo da CSLL?",
152
+ "answer": "Apenas o valor do ajuste de preço de transferência espontaneamente feito pelo contribuinte, realizado anteriormente a qualquer procedimento de fiscalização, é considerado dedutível. Assim, qualquer ajuste exigido por iniciativa do Fisco não será considerado espontâneo e, portanto, não será passível de dedução."
153
+ },
154
+ {
155
+ "question": "Como deve proceder a pessoa jurídica vendedora na apuração não cumulativa da Contribuição para o PIS/Pasep e da Cofins no caso de devolução de venda de unidade imobiliária?",
156
+ "answer": "A pessoa jurídica vendedora deve estornar, na data do desfazimento do negócio, os créditos referentes a unidades imobiliárias recebidas em devolução."
157
+ },
158
+ {
159
+ "question": "Em relação às operações de arrendamento mercantil, é necessária evidenciação em subconta?",
160
+ "answer": "No caso de bem objeto de arrendamento mercantil financeiro não é necessário que a arrendatária evidencie em subconta vinculada ao bem arrendado os juros decorrentes do ajuste a valor presente relativo ao contrato de arrendamento mercantil."
161
+ },
162
+ {
163
+ "question": "Descaracterizada a operação de arrendamento mercantil financeiro, como será determinado o preço de compra e venda?",
164
+ "answer": "O preço de compra e venda será o total das contraprestações pagas durante a vigência do arrendamento, acrescido da parcela paga a título de preço de aquisição."
165
+ },
166
+ {
167
+ "question": "Como deverão ser tratados os custos ou despesas operacionais pela adquirente, na hipótese de descaracterização da operação de arrendamento mercantil? Adicionalmente, como deverão ser tratados os eventuais tributos não recolhidos?",
168
+ "answer": "As importâncias já deduzidas, como custo ou despesa operacional pela adquirente, acrescerão ao lucro tributável, no período de apuração correspondente à respectiva dedução. Adicionalmente, os tributos não recolhidos serão devidos com acréscimos previstos na legislação vigente."
169
+ },
170
+ {
171
+ "question": "Em que prazo poderá ser excluído o saldo existente na contabilidade na data da aquisição do investimento, nos casos de bens 100% depreciados/amortizados/exauridos à data da incorporação?",
172
+ "answer": "O valor da mais valia poderá ser excluído do lucro líquido para apuração do lucro real e do resultado ajustado quando o bem for baixado ou alienado."
173
+ },
174
+ {
175
+ "question": "Em que momento o contribuinte poderá reconhecer na apuração do lucro real e do resultado ajustado os valores contabilizados como redução ao valor recuperável de ativos que não tenham sido objeto de reversão?",
176
+ "answer": "Quando ocorrer a alienação ou baixa do bem correspondente."
177
+ },
178
+ {
179
+ "question": "Como devem ser reconhecidos na apuração do lucro real e do resultado ajustado os valores contabilizados como redução ao valor recuperável de ativos na hipótese de alienação ou baixa de um ativo que compõe uma unidade geradora de caixa?",
180
+ "answer": "O valor a ser reconhecido na apuração do lucro real e do resultado ajustado deve ser proporcional à relação entre o valor contábil desse ativo e o total da unidade geradora de caixa à data em que foi realizado o teste de recuperabilidade."
181
+ },
182
+ {
183
+ "question": "Qual o tratamento tributário da reversão contábil da perda estimada no valor do ativo?",
184
+ "answer": "As reversões das perdas por desvalorização de bens que foram objeto de redução ao valor recuperável de ativos não são computadas na apuração do lucro real e do resultado ajustado. Normativo: Art. 130 da Instrução Normativa RFB nº 1.700, de 2017."
185
+ }
186
+ ]
personal_models.py ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from langchain_openai import ChatOpenAI
3
+ from langchain_community.embeddings import HuggingFaceEmbeddings
4
+ from langchain_together import Together
5
+ from langchain_community.embeddings import HuggingFaceInferenceAPIEmbeddings
6
+
7
+ from dotenv import load_dotenv
8
+
9
+ load_dotenv()
10
+
11
+ class PersonalModels:
12
+ def get_chat_model(self,
13
+ model: str = 'mistralai/Mistral-7B-Instruct-v0.2',
14
+ api_key: str = os.environ.get('TOGETHER_API_KEY', ''),
15
+ max_tokens: int = 1000,
16
+ temperature: float = 0.0,
17
+ verbose: bool = True) -> ChatOpenAI:
18
+ llm = ChatOpenAI(
19
+ api_key=api_key,
20
+ base_url="https://api.together.xyz/v1",
21
+ model=model,
22
+ max_tokens=max_tokens,
23
+ temperature=temperature,
24
+ verbose=verbose
25
+ )
26
+ return llm
27
+
28
+ def get_embedding_model(self,
29
+ model: str = 'intfloat/multilingual-e5-large') -> HuggingFaceInferenceAPIEmbeddings:
30
+ embeddings = HuggingFaceInferenceAPIEmbeddings(api_key=os.environ.get('HUGGINGFACEHUB_API_TOKEN', ''), model_name=model)
31
+ # embeddings = HuggingFaceEmbeddings(model_name=model,model_kwargs = {'device': 'cuda'})
32
+ # print('modelo está na gpu?',next(embeddings.model.parameters()).is_cuda)
33
+ return embeddings
34
+
35
+ def get_rag_model(self,
36
+ model: str = 'mistralai/Mistral-7B-Instruct-v0.2',
37
+ api_key: str = os.environ.get('TOGETHER_API_KEY', ''),
38
+ max_tokens: int = 1000,
39
+ temperature: float = 0.0,
40
+ top_k: int = 20,
41
+ verbose: bool = True) -> Together:
42
+ llm = Together(
43
+ model=model,
44
+ temperature=temperature,
45
+ max_tokens=max_tokens,
46
+ top_k=top_k,
47
+ together_api_key=api_key,
48
+ verbose=verbose
49
+ )
50
+ return llm
personal_templates.py ADDED
@@ -0,0 +1,284 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import List, Union
2
+ from langchain_core.messages.ai import AIMessage
3
+ from langchain_core.messages.human import HumanMessage
4
+ from langchain_core.messages.chat import ChatMessage
5
+ from langchain_core.messages.system import SystemMessage
6
+ from langchain_core.messages.function import FunctionMessage
7
+ from langchain_core.messages.tool import ToolMessage
8
+ from langchain_core.prompts.chat import (
9
+ ChatPromptTemplate,
10
+ SystemMessagePromptTemplate,
11
+ MessagesPlaceholder
12
+ )
13
+ from langchain_core.prompts.prompt import PromptTemplate
14
+ from langchain.prompts import HumanMessagePromptTemplate
15
+
16
+ class PersonalTemplate:
17
+ def __init__(self):
18
+ MessageTypes = Union[
19
+ AIMessage,
20
+ HumanMessage,
21
+ ChatMessage,
22
+ SystemMessage,
23
+ FunctionMessage,
24
+ ToolMessage
25
+ ]
26
+
27
+ assistant_description = (
28
+ 'Assistant is a friendly conversational model.\n'
29
+ '\n'
30
+ 'Assistant is designed to be able to assist with a wide range of tasks, from '
31
+ 'answering simple questions to providing in-depth explanations and '
32
+ 'discussions on a wide range of topics. As a language model, Assistant is '
33
+ 'able to generate human-like text based on the input it receives, allowing it '
34
+ 'to engage in natural-sounding conversations and provide responses that are '
35
+ 'coherent and relevant to the topic at hand.\n'
36
+ '\n'
37
+ 'Assistant is constantly learning and improving, and its capabilities are '
38
+ 'constantly evolving. It is able to process and understand large amounts of '
39
+ 'text, and can use this knowledge to provide accurate and informative '
40
+ 'responses to a wide range of questions. Additionally, Assistant is able to '
41
+ 'generate its own text based on the input it receives, allowing it to engage '
42
+ 'in discussions and provide explanations and descriptions on a wide range of '
43
+ 'topics.\n'
44
+ '\n'
45
+ 'Overall, Assistant is a powerful system that can help with a wide range of '
46
+ 'tasks and provide valuable insights and information on a wide range of '
47
+ 'topics. Whether you need help with a specific question or just want to have '
48
+ 'a conversation about a particular topic, Assistant is here to assist.'
49
+ 'Assistant always uses a tool when the question involves tax knowledge, legal entities, taxes, and related subjects.'
50
+ )
51
+
52
+ tool_instructions = (
53
+ 'TOOLS\n'
54
+ '------\n'
55
+ 'Assistant can ask the user to use tools to look up information that may be '
56
+ 'helpful in answering the users original question. '
57
+ 'For common inquiries such as greetings, small talk, and simple, familiar questions, there\'s no need to use a tool.'
58
+ 'The tools the human can '
59
+ 'use are:\n'
60
+ '\n'
61
+ '{tools}\n'
62
+ '\n'
63
+ 'RESPONSE FORMAT INSTRUCTIONS\n'
64
+ '----------------------------\n'
65
+ '\n'
66
+ 'When responding to me, please output a response in one of two formats:\n'
67
+ '\n'
68
+ '**Option 1:**\n'
69
+ 'Use this if you want the human to use a tool.\n'
70
+ 'A response must be selected from the {tool_names} options; do not choose this response format if the tool is not listed among them.'
71
+ 'Markdown code snippet formatted in the following schema:\n'
72
+ '\n'
73
+ '```json\n'
74
+ '{{\n'
75
+ ' "action": string, \\ The action to take. Must be one of {tool_names}\n'
76
+ ' "action_input": string \\ The input to the action\n'
77
+ '}}\n'
78
+ '```\n'
79
+ '\n'
80
+ '**Option #2:**\n'
81
+ 'Use this if you want to respond directly to the human. Markdown code snippet '
82
+ 'formatted in the following schema:\n'
83
+ '\n'
84
+ '```json\n'
85
+ '{{\n'
86
+ ' "action": "Final Answer",\n'
87
+ ' "action_input": string \\ You should put what you want to return to use '
88
+ 'here\n'
89
+ '}}\n'
90
+ '```\n'
91
+ '\n'
92
+ 'Keep the final answer concise and to the point.'
93
+ 'The Final Answer always must be in portuguese'
94
+ '\n'
95
+ '\n'
96
+ "USER'S INPUT\n"
97
+ '--------------------\n'
98
+ "Here is the user's input (remember to respond with a markdown code snippet "
99
+ 'of a json blob with a single action, and NOTHING else):\n'
100
+ '\n'
101
+ '{input}'
102
+ )
103
+
104
+ prompt_messages = [
105
+ SystemMessagePromptTemplate(prompt=PromptTemplate(input_variables=[], template=assistant_description)),
106
+ MessagesPlaceholder(variable_name='chat_history', optional=True),
107
+ HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['input', 'tool_names', 'tools'],
108
+ template=tool_instructions)),
109
+ MessagesPlaceholder(variable_name='agent_scratchpad')
110
+ ]
111
+
112
+ self.chatbot_tributario_prompt = ChatPromptTemplate(
113
+ input_variables=['agent_scratchpad', 'input', 'tool_names', 'tools'],
114
+ input_types={
115
+ 'chat_history': List[MessageTypes],
116
+ 'agent_scratchpad': List[MessageTypes]
117
+ },
118
+ messages=prompt_messages
119
+ )
120
+
121
+ self.description_direito_tributario_tool = """
122
+ Esta ferramenta é um sistema avançado de assistência e consulta para questões relacionadas ao direito tributário de pessoas jurídicas. Desenvolvida para advogados, contadores, gestores financeiros e empresários, ela oferece informações detalhadas e análises específicas sobre legislação tributária, jurisprudência relevante, e orientações práticas para a gestão fiscal de empresas.
123
+
124
+ Os usuários podem utilizar esta ferramenta em uma variedade de contextos, como:
125
+
126
+ 1. **Planejamento Tributário**: Auxilia na identificação de estratégias legais para a redução da carga tributária, considerando a legislação atual e as particularidades do negócio.
127
+ 2. **Resolução de Disputas Fiscais**: Fornece orientações sobre procedimentos e defesas em casos de litígios tributários, incluindo análises de casos semelhantes e interpretações de leis.
128
+ 3. **Compliance Fiscal**: Ajuda na compreensão e cumprimento das obrigações tributárias, evitando penalidades e multas por descumprimento de normas fiscais.
129
+ 4. **Atualizações Legislativas**: Mantém os usuários atualizados sobre as mais recentes alterações na legislação tributária, impactando diretamente a gestão fiscal das empresas.
130
+
131
+ A ferramenta é intuitiva e adaptada para atender às necessidades específicas de cada usuário, com uma interface amigável e recursos de busca avançada. Também oferece a possibilidade de consultas personalizadas com especialistas na área.
132
+
133
+ Para utilizar esta ferramenta, o input deve ser uma consulta de busca, formulada de maneira clara e específica, relacionada a questões tributárias de pessoas jurídicas.
134
+ """
135
+
136
+ self.description_direito_tributario_tool2 = """This tool is an advanced assistance system for corporate tax law brazilian queries. Designed for lawyers, accountants, financial managers, and business owners, it provides detailed information and specific analyses on tax legislation, relevant case law, and practical guidance for corporate tax management.
137
+
138
+ The tool can be used in various contexts, specifically related to corporate tax law, including:
139
+
140
+ 1. **Tax Planning**: Assists in identifying legal strategies to minimize tax liabilities, tailored to current laws and business specifics.
141
+ 2. **Tax Dispute Resolution**: Offers guidance on procedures and defenses in tax litigation, with case analyses and law interpretations.
142
+ 3. **Tax Compliance**: Aids in understanding and fulfilling tax obligations to avoid penalties for non-compliance.
143
+ 4. **Legislative Information**: Provides comprehensive insights into tax laws, covering a range of topics from the intricacies of various taxes, legal scenarios requiring tax law knowledge, and essential information about different types of taxes and their implications.
144
+
145
+ The tool is user-friendly with an intuitive interface and advanced search capabilities. Use this tool by submitting clear, specific search queries related to corporate tax law issues.
146
+ """
147
+ self.chatbot_tributario_prompt_react = PromptTemplate.from_template(template='''Assistant is an AI.
148
+
149
+ Assistant is designed to assist with a wide range of tasks, from answering simple questions to providing in-depth explanations and discussions on a wide range of topics. As a language model, Assistant generates human-like text based on the input it receives, allowing it to engage in conversations and provide coherent and relevant responses.
150
+
151
+ Assistant is constantly learning and improving. It processes and understands large amounts of text and can use this knowledge to provide accurate and informative responses. Additionally, Assistant generates its own text based on the input it receives, engaging in discussions and providing explanations on various topics.
152
+
153
+ Overall, Assistant is a powerful tool for a wide range of tasks, offering valuable insights and information.
154
+
155
+ TOOLS:
156
+ ------
157
+
158
+ Assistant has access to the following tools:
159
+
160
+ {tools}
161
+
162
+ Do not use a tool if Action Input is not related to the tool.
163
+ Use a tool when the question involves tax knowledge, legal entities, taxes, and related subjects
164
+ Use the tool only use this if you want the human to use a tool to answer questions about brazilian tax law and legal entities.
165
+ For common inquiries such as greetings, small talk, and simple, familiar questions, there\'s no need to use a tool.
166
+
167
+ To use a tool, please use the following format:
168
+
169
+ ```
170
+ Thought: Do I need to use a tool? Yes
171
+ Action: the action to take, should be one of [{tool_names}]
172
+ Action Input: the input to the action
173
+ Observation: the result of the action
174
+ ```
175
+
176
+ When you have a response to say to the Human, or if you do not need to use a tool, you MUST use the format:
177
+
178
+ ```
179
+ Thought: Do I need to use a tool? No
180
+ Final Answer: [your response here]
181
+ ```
182
+
183
+ Keep the Final Answer concise and to the point.
184
+ The Final Answer always must be in portuguese
185
+
186
+ Begin!
187
+
188
+ Previous conversation history:
189
+ {chat_history}
190
+
191
+ Input: {input}
192
+ Thought:{agent_scratchpad}''')
193
+
194
+ self.retriever_prompt = PromptTemplate.from_template("""Use the following pieces of information to answer the user's question.
195
+ If you don't know the answer, just say that you don't know, don't try to make up an answer.
196
+ Context: {context}
197
+ Question: {question}
198
+ Answer the question in portuguese.
199
+ Only return the helpful answer below and nothing else.
200
+ Helpful answer:
201
+ """)
202
+ self.chatbot_tributario_prompt_react2 = PromptTemplate.from_template(template="""**Assistant is an AI.**
203
+
204
+ Assistant is designed to assist with a wide range of tasks, from answering simple questions to providing in-depth explanations and discussions on a wide range of topics. As a language model, Assistant generates human-like text based on the input it receives, allowing it to engage in conversations and provide coherent and relevant responses.
205
+
206
+ Assistant is constantly learning and improving. It processes and understands large amounts of text and can use this knowledge to provide accurate and informative responses. Additionally, Assistant generates its own text based on the input it receives, engaging in discussions and providing explanations on various topics.
207
+
208
+ Overall, Assistant is a powerful tool for a wide range of tasks, offering valuable insights and information.
209
+
210
+ **Previous Conversation History:**
211
+ This section includes a record of the user's and Assistant's past interactions. It provides context and continuity, helping the Assistant understand the background and flow of the conversation, ensuring more relevant and informed responses.
212
+
213
+ {chat_history}
214
+
215
+ Answer the following questions as best you can. You have access to the following tools:
216
+
217
+ {tools}
218
+
219
+ Use the following format:
220
+
221
+ Question: the input question you must answer
222
+ Thought: you should always think about what to do and if you need to use a tool or no
223
+ Action: the action to take, should be one of [{tool_names}]
224
+ Action Input: the input to the action
225
+ Observation: the result of the action
226
+ ... (this Thought/Action/Action Input/Observation can repeat 5 times)
227
+ Thought: I now know the final answer
228
+ Final Answer: the final answer to the original input question
229
+
230
+ Begin!
231
+
232
+ Question: {input}
233
+ Thought:{agent_scratchpad}
234
+ """ )
235
+
236
+ self.chatbot_tributario_prompt_react2 = PromptTemplate.from_template(template='''You are a Assistant.
237
+
238
+ Assistant is designed as a versatile and knowledgeable companion, adept at engaging in conversations across a broad range of topics. It is capable of processing and comprehending vast amounts of text, which it uses to provide accurate and informative responses to a wide spectrum of inquiries.
239
+
240
+ Assistant is well-equipped for both specific queries and general discussions, making it a reliable source of assistance for any user. Its conversational ability is extensive, enabling it to adapt its tone and style to fit the context of the discussion, ensuring that interactions are both natural and engaging.
241
+
242
+ In addition to its conversational skills, the Assistant is also equipped with a variety of tools that enhance its ability to respond effectively and accurately. These tools augment the Assistant capabilities, making it more efficient in providing relevant and context-aware responses.
243
+
244
+ Users can interact with the Assistant by posing questions or initiating conversations on topics of interest. The Assistant utilizes its array of skills and tools to provide the best possible assistance, focusing on delivering coherent, relevant, and engaging responses to enhance the user experience.
245
+
246
+ TOOLS:
247
+ ------
248
+
249
+ The Assistant has access to the following tools:
250
+
251
+ {tools}
252
+
253
+ Use a tool only if the Action Input is directly related to the tool. There are two distinct formats to follow based on the Input:
254
+
255
+ 1. **Using a Tool**: When a tool is necessary, utilize this format:
256
+ Use this if you want the human to use a tool.
257
+
258
+ ```
259
+ Thought: Do I need to use a tool? Yes
260
+ Action: [Select an appropriate action from {tool_names}]
261
+ Action Input: [Provide the necessary input for the action]
262
+ Observation: [Note the result or outcome of the action]
263
+ ```
264
+ A response must be selected from the {tool_names} options; do not choose this response format if the tool is not listed among them.
265
+ After making an observation or if an action was taken, consider whether a direct response to the user is now appropriate.
266
+
267
+ 2. **Direct Response**: When you are ready to provide a response, or if a tool is not required, switch to this format:
268
+ Use this if you want to respond directly to the human
269
+
270
+ ```
271
+ Thought: Do I need to use a tool? No
272
+ Final Answer: [Provide your direct response to the user here]
273
+ ```
274
+
275
+ Keep the Final Answer concise and to the point.
276
+ The Final Answer always must be in portuguese
277
+
278
+ Begin!
279
+
280
+ Previous conversation history:
281
+ {chat_history}
282
+
283
+ Input: {input}
284
+ Thought:{agent_scratchpad}''')
requirements.txt ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ langchain
2
+ unstructured
3
+ faiss-cpu
4
+ tiktoken
5
+ langchain-community
6
+ langchainhub
7
+ langchain_openai
8
+ langchain_together
9
+ python-dotenv
server_icon.png ADDED
user_icon.png ADDED