{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "85488dad-010f-4700-ab38-b1ec404c0beb", "metadata": {}, "outputs": [], "source": [ "import os\n", "from dotenv import load_dotenv" ] }, { "cell_type": "code", "execution_count": 2, "id": "c2cf39ce-0968-41d2-b7d6-b1748559dea8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'gcp-starter'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "load_dotenv('./.env')\n", "os.environ.get('PINECONE_ENV')" ] }, { "cell_type": "markdown", "id": "751cbd61-ffd6-4b55-aafb-391ad04f3445", "metadata": {}, "source": [ "## LangChain primeiros passos" ] }, { "cell_type": "code", "execution_count": 3, "id": "96ac731e-db16-41d5-ab31-ba3b06ea0a7f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1mOpenAI\u001b[0m\n", "Params: {'model_name': 'text-davinci-003', 'temperature': 0.7, 'max_tokens': 512, 'top_p': 1, 'frequency_penalty': 0, 'presence_penalty': 0, 'n': 1, 'request_timeout': None, 'logit_bias': {}}\n" ] } ], "source": [ "from langchain.llms import OpenAI\n", "llm = OpenAI(model_name='text-davinci-003', temperature=0.7, max_tokens=512)\n", "print(llm)" ] }, { "cell_type": "code", "execution_count": 4, "id": "328bf9d9-9622-4334-aa1f-a83fbce99fad", "metadata": {}, "outputs": [], "source": [ "output = llm('explique como funções python funcionam')" ] }, { "cell_type": "code", "execution_count": 5, "id": "c5f8d4f2-b06c-4364-880e-3be101ea95c6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "Em Python, uma função é um bloco de código que realiza uma tarefa específica. Uma função começa com a palavra-chave def, seguida pelo nome da função e parênteses. Os parâmetros (argumentos) são opcionais e são passados entre os parênteses. O corpo da função é identado e contém o código que é executado quando a função é chamada. O corpo da função pode conter declarações, instruções e outras funções. Quando a função é chamada, os argumentos fornecidos são passados para a função e ela executa o código no corpo da função. Uma função também pode retornar um valor ou um objeto usando a palavra-chave return. Se uma função não retornar nada, ela implícita retorna o valor None.\n" ] } ], "source": [ "print(output)" ] }, { "cell_type": "code", "execution_count": 6, "id": "4ec80f14-ea2c-442f-a175-1fd756d4e1de", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "13\n" ] } ], "source": [ "print(llm.get_num_tokens('explique como funções python funcionam'))" ] }, { "cell_type": "code", "execution_count": 7, "id": "4e896bf2-733c-4b2b-a169-aa5f84a7d06d", "metadata": {}, "outputs": [], "source": [ "output = llm.generate(['... é a capital da França',\n", " 'qual é a formula da área de um círculo?'])" ] }, { "cell_type": "code", "execution_count": 8, "id": "3ddeffc8-1958-4ed8-8b94-9f351afad7df", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[Generation(text='\\n\\nParis.', generation_info={'finish_reason': 'stop', 'logprobs': None})], [Generation(text='\\n\\nA área de um círculo é dada pela fórmula A = π * r², onde A representa a área e r é o raio do círculo.', generation_info={'finish_reason': 'stop', 'logprobs': None})]]\n" ] } ], "source": [ "print(output.generations)" ] }, { "cell_type": "code", "execution_count": 9, "id": "3530c0d4-b489-4ec2-8cd4-34ce73f8a9e2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'\\n\\nParis.'" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "output.generations[0][0].text" ] }, { "cell_type": "code", "execution_count": 10, "id": "f1430cb9-367c-4b6e-a9ca-4aff15d465ba", "metadata": {}, "outputs": [], "source": [ "output = llm.generate(['escreva um slogan original para um restaurante de sushi'] * 3)" ] }, { "cell_type": "code", "execution_count": 11, "id": "493450f7-1c88-4e88-9671-a4e232e670d7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "\"Sabor de Oriente: Sushi como nunca experimentou!\"\n", "\n", "\"Sushi com sabor de tradição - Delícia no seu prato!\"\n", "\n", "\"Uma experiência única de sabores: Sushi Time!\"" ] } ], "source": [ "for o in output.generations:\n", " print(o[0].text, end='')" ] }, { "cell_type": "markdown", "id": "f084ee4e-37a8-4eff-918b-e76fc287216c", "metadata": {}, "source": [ "## ChatModels: GPT-3.5-Turbo e GPT-4" ] }, { "cell_type": "code", "execution_count": 12, "id": "e419a09e-c68b-4199-a35c-6312bfac7701", "metadata": {}, "outputs": [], "source": [ "from langchain.schema import(\n", " AIMessage,\n", " HumanMessage,\n", " SystemMessage\n", ")\n", "\n", "from langchain.chat_models import ChatOpenAI" ] }, { "cell_type": "code", "execution_count": 13, "id": "a819d353-0736-4d73-9ae5-3ffa43f63b97", "metadata": {}, "outputs": [], "source": [ "chat = ChatOpenAI(model_name='gpt-3.5-turbo', temperature=0.5, max_tokens=1024)\n", "messages = [\n", " SystemMessage(content='Você é um especialista em machine learning que responde tudo em português.'),\n", " HumanMessage(content='explique em um parágrafo o que é machine learning.')\n", "]\n", "output = chat(messages)" ] }, { "cell_type": "code", "execution_count": 14, "id": "4997eb2c-0312-432b-b9ca-563b1f867ec3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Machine learning, ou aprendizado de máquina, é uma subárea da inteligência artificial que se concentra no desenvolvimento de algoritmos e modelos computacionais capazes de aprender e tomar decisões a partir de dados. Ao invés de serem explicitamente programados, esses algoritmos são treinados com exemplos e dados relevantes, permitindo que eles identifiquem padrões, façam previsões e tomem decisões autônomas. O objetivo do machine learning é capacitar as máquinas a aprenderem e melhorarem seu desempenho ao longo do tempo, sem a necessidade de intervenção humana constante.\n" ] } ], "source": [ "print(output.content)" ] }, { "cell_type": "markdown", "id": "7b053d3d-0f7a-47ff-ab69-dee325ad100f", "metadata": {}, "source": [ "## Prompt Templates" ] }, { "cell_type": "code", "execution_count": 15, "id": "c668f7d9-888e-4a68-8cfe-6cf1d420d285", "metadata": {}, "outputs": [], "source": [ "from langchain.prompts import PromptTemplate" ] }, { "cell_type": "code", "execution_count": 16, "id": "a9c59544-91e4-4471-a05b-a5043be6e1a3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "input_variables=['idioma', 'virus'] template='Você é um virologista experiente.\\nEscreva algumas frases sobre o sequinte {virus} em {idioma}.'\n" ] } ], "source": [ "template = \"\"\"Você é um virologista experiente.\n", "Escreva algumas frases sobre o sequinte {virus} em {idioma}.\"\"\"\n", "\n", "prompt = PromptTemplate(\n", " input_variables=['virus', 'idioma'],\n", " template=template\n", ")\n", "print(prompt)" ] }, { "cell_type": "code", "execution_count": 17, "id": "aac42a33-a6b3-4216-a8f9-daf3d2a0f86a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "1. HIV is a complex virus that continues to challenge the scientific community.\n", "2. HIV infection can be prevented through safe sexual practices and needle exchange programs.\n", "3. Antiretroviral therapy is the standard of care for HIV infection.\n", "4. Early detection of HIV is essential to successful treatment.\n", "5. HIV is a global health issue that requires collaborative efforts.\n" ] } ], "source": [ "from langchain.llms import OpenAI\n", "llm = OpenAI(model_name='text-davinci-003', temperature=0.7)\n", "output = llm(prompt.format(virus='HIV', idioma='Inglês'))\n", "print(output)" ] }, { "cell_type": "markdown", "id": "8bd30f0e-8d81-4e4b-a0ae-692a4d8fbdc7", "metadata": {}, "source": [ "## Simple Chains" ] }, { "cell_type": "code", "execution_count": 18, "id": "b4af114a-398b-4845-a1cb-0f4745d4e798", "metadata": {}, "outputs": [], "source": [ "from langchain.chat_models import ChatOpenAI\n", "from langchain.prompts import PromptTemplate\n", "from langchain.chains import LLMChain\n", "\n", "llm = ChatOpenAI(model_name='gpt-3.5-turbo', temperature=0.5)\n", "\n", "template = \"\"\"Você é um virologista experiente.\n", "Escreva um resumo sobre o sequinte {virus} em {idioma}.\"\"\"\n", "\n", "prompt = PromptTemplate(\n", " input_variables=['virus', 'idioma'],\n", " template=template\n", ")\n", "\n", "chain = LLMChain(llm=llm, prompt=prompt)\n", "output = chain.run({'virus': 'HIV', 'idioma': 'english'})" ] }, { "cell_type": "code", "execution_count": 19, "id": "005417b0-82ce-44d2-b1be-34338711e94c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'HIV, or Human Immunodeficiency Virus, is a retrovirus that attacks the immune system, specifically the CD4 cells (also known as T cells) which play a crucial role in fighting off infections. This virus is primarily transmitted through sexual contact, blood transfusion, sharing needles, or from an infected mother to her child during childbirth or breastfeeding.\\n\\nOnce HIV enters the body, it replicates rapidly and progressively weakens the immune system. As a result, individuals infected with HIV become more susceptible to opportunistic infections and certain types of cancers. Without treatment, HIV can progress to AIDS (Acquired Immunodeficiency Syndrome), the most advanced stage of the infection.\\n\\nThe symptoms of HIV can vary from person to person, and some individuals may experience flu-like symptoms shortly after infection. However, in many cases, individuals may not show any symptoms for several years. This is why it is crucial to get tested for HIV if there has been any potential exposure.\\n\\nWhile there is currently no cure for HIV, significant advancements have been made in antiretroviral therapy (ART). ART involves a combination of medications that can effectively suppress viral replication, allowing individuals with HIV to live long and healthy lives. Additionally, early diagnosis and treatment can significantly reduce the risk of transmitting the virus to others.\\n\\nPrevention plays a vital role in controlling the spread of HIV. This includes practicing safe sex by using condoms, getting tested regularly, and avoiding sharing needles or other drug paraphernalia. Education and awareness programs are also crucial in promoting HIV prevention and reducing stigma surrounding the virus.\\n\\nIn conclusion, HIV is a complex virus that affects the immune system and can lead to AIDS if left untreated. However, with advancements in treatment and prevention methods, individuals with HIV can lead fulfilling lives while managing their condition.'" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "output" ] }, { "cell_type": "markdown", "id": "7b8754c4-0f98-4bec-b746-0fe63ae01bba", "metadata": {}, "source": [ "## Sequential Chains" ] }, { "cell_type": "code", "execution_count": 20, "id": "8a208c4a-55dc-4c81-9e52-7e03b16225a2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "\u001b[1m> Entering new SimpleSequentialChain chain...\u001b[0m\n", "\u001b[36;1m\u001b[1;3m\n", "\n", "def softmax(x):\n", " \"\"\"Calcula a função softmax para uma lista de números x.\"\"\"\n", " # Use exp para obter os exponenciais de cada elemento da lista.\n", " exp_list = [np.exp(i) for i in x]\n", "\n", " # Calcule a soma dos exponenciais.\n", " sum_exp_list = sum(exp_list)\n", "\n", " # Calcule a probabilidade softmax.\n", " softmax_list = [j/sum_exp_list for j in exp_list]\n", "\n", " return softmax_list\u001b[0m\n", "\u001b[33;1m\u001b[1;3mA função softmax calcula a probabilidade de cada elemento em uma lista de números através da aplicação de uma função exponencial normalizada. \n", "\n", "Primeiro, a função utiliza a biblioteca numpy (importada como \"np\") para calcular o exponencial de cada elemento da lista de números \"x\" utilizando a função np.exp(). Esses exponenciais são armazenados em uma nova lista chamada \"exp_list\".\n", "\n", "Em seguida, a função realiza a soma de todos os elementos da lista \"exp_list\" utilizando a função sum(). Essa soma é armazenada em uma variável chamada \"sum_exp_list\". \n", "\n", "Por fim, a função calcula a probabilidade softmax de cada elemento da lista original \"x\" dividindo cada elemento pelo valor da soma dos exponenciais (\"sum_exp_list\"). Os resultados são armazenados em uma lista chamada \"softmax_list\".\n", "\n", "Essencialmente, a probabilidade softmax é calculada aplicando a função exponencial em cada elemento, normalizando os resultados pela soma dos exponenciais. O resultado final é uma lista de probabilidades, onde cada elemento representa a probabilidade do elemento correspondente na lista original \"x\".\u001b[0m\n", "\n", "\u001b[1m> Finished chain.\u001b[0m\n" ] } ], "source": [ "from langchain.chat_models import ChatOpenAI\n", "from langchain.prompts import PromptTemplate\n", "from langchain.llms import OpenAI\n", "from langchain.chains import LLMChain, SimpleSequentialChain\n", "\n", "llm1 = OpenAI(model_name='text-davinci-003', temperature=0.7, max_tokens=1024)\n", "prompt1 = PromptTemplate(\n", " input_variables=['conceito'],\n", " template=\"\"\"Você é um cientista experiente e programador Python.\n", " Escreva uma função que implementa o conceito de {conceito}.\"\"\"\n", ")\n", "\n", "chain1 = LLMChain(llm=llm1, prompt=prompt1)\n", "\n", "#--- segunda chain ----\n", "\n", "llm2 = ChatOpenAI(model_name='gpt-3.5-turbo', temperature=1.2)\n", "prompt2 = PromptTemplate(\n", " input_variables=['function'],\n", " template=\"\"\"Dada a função {function} Python, descreva como funciona da forma mais detalhada possível.\"\"\"\n", ")\n", "\n", "chain2 = LLMChain(llm=llm2, prompt=prompt2)\n", "\n", "overall_chain = SimpleSequentialChain(chains=[chain1, chain2], verbose=True)\n", "output = overall_chain.run(\"softmax\")" ] }, { "cell_type": "markdown", "id": "cf609a40-895b-4883-9e82-9e84b6890c59", "metadata": {}, "source": [ "## LangChain Agents" ] }, { "cell_type": "code", "execution_count": 21, "id": "feaecdf7-3567-491c-902d-057dfd941354", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "146306.05007233328" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# exemplo exponenciação\n", "\n", "5.1 ** 7.3" ] }, { "cell_type": "code", "execution_count": 22, "id": "87e7d9c9-ed99-4bc3-9153-16607dea7f62", "metadata": {}, "outputs": [], "source": [ "from langchain_experimental.agents.agent_toolkits import create_python_agent\n", "from langchain_experimental.tools.python.tool import PythonAstREPLTool\n", "from langchain.llms import OpenAI" ] }, { "cell_type": "code", "execution_count": 23, "id": "57b7a63c-7dea-42c3-af36-5359438d9853", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", "\u001b[32;1m\u001b[1;3m I need to calculate the power of 5.1 to 7.3\n", "Action: python_repl_ast\n", "Action Input: 5.1 ** 7.3\u001b[0m\n", "Observation: \u001b[36;1m\u001b[1;3m146306.05007233328\u001b[0m\n", "Thought:\u001b[32;1m\u001b[1;3m I now know the final answer\n", "Final Answer: 146306.05007233328\u001b[0m\n", "\n", "\u001b[1m> Finished chain.\u001b[0m\n" ] }, { "data": { "text/plain": [ "'146306.05007233328'" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "llm = OpenAI(temperature=0)\n", "agent_executor = create_python_agent(\n", " llm=llm,\n", " tool=PythonAstREPLTool(),\n", " verbose=True\n", ")\n", "agent_executor.run('qual a resposta para 5.1 elevado à potência de 7.3')" ] }, { "cell_type": "code", "execution_count": 24, "id": "f72f929d-202f-4506-8760-5bf1ed06f9f2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1559776268.6285\n" ] } ], "source": [ "from math import factorial; print(f\"{round(factorial(20)**0.5, 4)}\")" ] }, { "cell_type": "markdown", "id": "1b7c0c91-d5dc-4321-bede-997a5b0fe9ad", "metadata": {}, "source": [ "### Splitting e Embedding de texto" ] }, { "cell_type": "code", "execution_count": 56, "id": "6a40be96-10d1-41f8-8190-8b353ac25c71", "metadata": {}, "outputs": [], "source": [ "from langchain.text_splitter import RecursiveCharacterTextSplitter\n", "\n", "with open('docs/CLT.txt') as f:\n", " clt = f.read()\n", "\n", "text_splitter = RecursiveCharacterTextSplitter(\n", " chunk_size=1000,\n", " chunk_overlap=10,\n", " length_function=len\n", ")" ] }, { "cell_type": "code", "execution_count": 57, "id": "3c76b64d-d57f-498b-ac4a-9501f40252db", "metadata": {}, "outputs": [], "source": [ "chunks = text_splitter.create_documents([clt])" ] }, { "cell_type": "code", "execution_count": 58, "id": "7561894c-1f2f-40be-9a98-2506d24f0ce5", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Document(page_content='CLT E A REFORMA TRABALHISTA: EVOLUÇÃO\\n NAS RELAÇÕES DE TRABALHO\\n\\n Eliezer de Queiroz Noleto1')" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chunks[0]" ] }, { "cell_type": "code", "execution_count": 59, "id": "86e7511c-b978-4b3c-bc0d-0545b4498dcf", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Document(page_content='Ao falarmos sobre a Consolidação das Leis do Trabalho (CLT), somos reme-\\n tidos ao período conhecido como Era Vargas. Editada no ano de 1943, a CLT resultou\\n da coletânea de inúmeras leis esparsas então existentes que disciplinavam aspectos\\n sobre direito individual do trabalho, direito coletivo, fiscalização do trabalho, direito\\n processual do trabalho, além de legislações específicas de determinadas profissões.\\n Esse era o espírito do trabalho desenvolvido pela comissão constituída\\n para elaborar a CLT, evidenciado na exposição de motivos que acompanhou o\\n texto final do projeto. Segundo esse escrito, a consolidação nada mais é do que “a\\n fase própria da concatenação dos textos e da coordenação dos princípios, quando\\n já se denuncia primeiro o pensamento do sistema depois de haverem sido regu-')" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chunks[1]" ] }, { "cell_type": "code", "execution_count": 60, "id": "9bc2c799-e0d8-4c95-b026-11ed0fba1f59", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Document(page_content='majoritário dos legisladores, o Parlamento aprovou a chamada Reforma Tra-\\nbalhista (Lei nº 13.467/2017), a modificação mais profunda na legislação traba-\\nlhista desde a edição da própria CLT. Entendeu-se que a legislação não havia\\nacompanhado a evolução vivenciada nas relações de trabalho. Isso teria se\\ndado, por exemplo, em relação às novas formas de trabalho que surgiram com\\nas inovações tecnológicas ou em virtude da atuação mais presente das enti-\\ndades de classe, condições que teriam abrandado a hipossuficiência do traba-\\nlhador. Assim, a intenção manifesta do Poder Legislativo com a aprovação da\\nLei nº 13.467/2017 foi a de atualizar a CLT aos novos tempos, promovendo-se\\numa série de mudanças, algumas pontuais, outras de ordem mais geral. Cabe,\\nnesta oportunidade, destacar as principais modificações.\\n A nova lei incluiu um capítulo no Título II da CLT (Capítulo II-A) para dis-\\nciplinar o teletrabalho, conceituado como “a prestação de serviços preponde-')" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chunks[10]" ] }, { "cell_type": "code", "execution_count": 61, "id": "0a4e0c53-7255-4b98-9cc7-ae2efca2003b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'majoritário dos legisladores, o Parlamento aprovou a chamada Reforma Tra-\\nbalhista (Lei nº 13.467/2017), a modificação mais profunda na legislação traba-\\nlhista desde a edição da própria CLT. Entendeu-se que a legislação não havia\\nacompanhado a evolução vivenciada nas relações de trabalho. Isso teria se\\ndado, por exemplo, em relação às novas formas de trabalho que surgiram com\\nas inovações tecnológicas ou em virtude da atuação mais presente das enti-\\ndades de classe, condições que teriam abrandado a hipossuficiência do traba-\\nlhador. Assim, a intenção manifesta do Poder Legislativo com a aprovação da\\nLei nº 13.467/2017 foi a de atualizar a CLT aos novos tempos, promovendo-se\\numa série de mudanças, algumas pontuais, outras de ordem mais geral. Cabe,\\nnesta oportunidade, destacar as principais modificações.\\n A nova lei incluiu um capítulo no Título II da CLT (Capítulo II-A) para dis-\\nciplinar o teletrabalho, conceituado como “a prestação de serviços preponde-'" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chunks[10].page_content" ] }, { "cell_type": "code", "execution_count": 62, "id": "7ee73214-a94f-4ea7-9a20-738763dc396e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1167" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(chunks)" ] }, { "cell_type": "code", "execution_count": 63, "id": "689e072e-c429-45ea-9bc7-daaf9cdea44f", "metadata": {}, "outputs": [], "source": [ "def embedding_cost(texts):\n", " import tiktoken\n", " enc = tiktoken.encoding_for_model('text-embedding-ada-002')\n", " total_tokens = sum([len(enc.encode(page.page_content)) for page in texts])\n", " print(f'Total de tokens: {total_tokens}')\n", " print(f'Custo de Embedding em USD: {total_tokens / 1000 * 0.0001:.6f}')" ] }, { "cell_type": "code", "execution_count": 64, "id": "abb2a0e2-d2d7-4544-a3bd-45ce94891e02", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total de tokens: 257483\n", "Custo de Embedding em USD: 0.025748\n" ] } ], "source": [ "embedding_cost(chunks)" ] }, { "cell_type": "markdown", "id": "85b06ed0-2189-4a76-af82-c6db56e42df1", "metadata": {}, "source": [ "### Creating embeddings" ] }, { "cell_type": "code", "execution_count": 65, "id": "89fe2740-0544-48e5-996e-48927b41fda5", "metadata": {}, "outputs": [], "source": [ "from langchain.embeddings import OpenAIEmbeddings\n", "embeddings = OpenAIEmbeddings()" ] }, { "cell_type": "code", "execution_count": 66, "id": "c0e0f39b-6cdb-45ba-a739-22262fb7d4a5", "metadata": {}, "outputs": [], "source": [ "vector = embeddings.embed_query(chunks[0].page_content)" ] }, { "cell_type": "code", "execution_count": 45, "id": "a467ad2a-1e1f-43cb-98cc-9f17a56821b8", "metadata": {}, "outputs": [], "source": [ "#vector" ] }, { "cell_type": "code", "execution_count": 67, "id": "1b6983b7-5663-4f52-bd43-6ccb4148d8e2", "metadata": {}, "outputs": [], "source": [ "import os\n", "import pinecone\n", "from langchain.vectorstores import Pinecone\n", "\n", "pinecone.init(api_key=os.environ.get('PINECONE_API_KEY'), environment=os.environ.get('PINECONE_ENV'))" ] }, { "cell_type": "code", "execution_count": 68, "id": "7c5c9195-1b4c-46dd-a17b-1c50bc19ddb1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Feito!\n" ] } ], "source": [ "indexes = pinecone.list_indexes()\n", "for i in indexes:\n", " pinecone.delete_index(i)\n", " print('Feito!')" ] }, { "cell_type": "code", "execution_count": 69, "id": "2cef266d-912a-467d-bd6a-751c7f58132e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Feito!\n" ] } ], "source": [ "index_name = 'linuxtips'\n", "if index_name not in pinecone.list_indexes():\n", " pinecone.create_index(index_name, dimension=1536, metric='cosine')\n", " print('Feito!')" ] }, { "cell_type": "code", "execution_count": 70, "id": "b165319d-4e84-4f02-8684-ebcce0b914ef", "metadata": {}, "outputs": [], "source": [ "vector_store = Pinecone.from_documents(chunks, embeddings, index_name=index_name)" ] }, { "cell_type": "markdown", "id": "b9d00249-b72b-451c-970b-9bd6be2f944b", "metadata": {}, "source": [ "### Conversando com os dados (similarity search)" ] }, { "cell_type": "code", "execution_count": 71, "id": "b70b037f-9848-4bee-aefd-484ca6ec8ebe", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[Document(page_content='tativos da respectiva categoria profissional, e pro- da remuneração da tarefa na data da concessão\\nvidenciará a afixação de aviso nos locais de tra- das férias. (Parágrafo acrescido pelo Decreto-Lei nº 1.535,\\nbalho. (Parágrafo acrescido pelo Decreto-Lei nº 1.535, de de 13/4/1977)\\n13/4/1977) § 3º Quando o salário for pago por percenta-\\nArt. 140. Os empregados contratados há menos gem, comissão ou viagem, apurar-se-á a média\\nde 12 (doze) meses gozarão, na oportunidade, percebida pelo empregado nos 12 (doze) meses\\nférias proporcionais, iniciando-se, então, novo que precederem à concessão das férias. (Parágrafo\\nperíodo aquisitivo. (Artigo com redação dada pelo acrescido pelo Decreto-Lei nº 1.535, de 13/4/1977)\\nDecreto-Lei nº 1.535, de 13/4/1977) § 4º A parte do salário paga em utilidades será'), Document(page_content='com redação dada pelo Decreto-Lei nº 1.535, de 13/4/1977)\\n § 1º É vedado descontar, do período de férias, as\\n I – deixar o emprego e não for readmitido dentro\\nfaltas do empregado ao serviço. (Parágrafo acrescido\\n dos 60 (sessenta) dias subsequentes à sua saída;\\npelo Decreto-Lei nº 1.535, de 13/4/1977)\\n (Inciso acrescido pelo Decreto-Lei nº 1.535, de 13/4/1977)\\n § 2º O período das férias será computado, para\\n II – permanecer em gozo de licença, com per-\\ntodos os efeitos, como tempo de serviço. (Parágrafo\\n cepção de salários, por mais de 30 (trinta) dias;\\nacrescido pelo Decreto-Lei nº 1.535, de 13/4/1977)'), Document(page_content='Art. 129. Todo empregado terá direito anual- 5/11/1993)\\nmente ao gozo de um período de férias, sem pre- IV – justificada pela empresa, entendendo-se\\njuízo da remuneração. (Artigo com redação dada pelo como tal a que não tiver determinado o desconto\\nDecreto-Lei nº 1.535, de 13/4/1977) (Vide art. 7º, XVII, da do correspondente salário; (Inciso acrescido pelo\\nConstituição Federal de 1988) Decreto-Lei nº 1.535, de 13/4/1977)\\n V – durante a suspensão preventiva para respon-\\nArt. 130. Após cada período de 12 (doze) meses\\n der a inquérito administrativo ou de prisão preven-\\nde vigência do contrato de trabalho, o empregado\\n tiva, quando for impronunciado ou absolvido; e'), Document(page_content='empregador, em um só período, nos 12 (doze) pagará em dobro a respectiva remuneração. (Caput\\n meses subsequentes à data em que o empregado do artigo com redação dada pelo Decreto-Lei nº 1.535, de\\n tiver adquirido o direito. (Caput do artigo com redação 13/4/1977)\\n dada pelo Decreto-Lei nº 1.535, de 13/4/1977) § 1º Vencido o mencionado prazo sem que o\\n § 1º Desde que haja concordância do empre- empregador tenha concedido as férias, o empre-\\n gado, as férias poderão ser usufruídas em até gado poderá ajuizar reclamação pedindo a fixação,\\n três períodos, sendo que um deles não poderá por sentença, da época de gozo das mesmas. (Pa-\\n ser inferior a quatorze dias corridos e os demais rágrafo acrescido pelo Decreto-Lei nº 1.535, de 13/4/1977)\\n não poderão ser inferiores a cinco dias corridos, § 2º A sentença cominará pena diária de 5%')]\n" ] } ], "source": [ "query = 'explique a remuneração das férias'\n", "result = vector_store.similarity_search(query)\n", "print(result)" ] }, { "cell_type": "code", "execution_count": 72, "id": "bcc0bcad-d629-48bc-a8fc-89a6387bb7a7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tativos da respectiva categoria profissional, e pro- da remuneração da tarefa na data da concessão\n", "videnciará a afixação de aviso nos locais de tra- das férias. (Parágrafo acrescido pelo Decreto-Lei nº 1.535,\n", "balho. (Parágrafo acrescido pelo Decreto-Lei nº 1.535, de de 13/4/1977)\n", "13/4/1977) § 3º Quando o salário for pago por percenta-\n", "Art. 140. Os empregados contratados há menos gem, comissão ou viagem, apurar-se-á a média\n", "de 12 (doze) meses gozarão, na oportunidade, percebida pelo empregado nos 12 (doze) meses\n", "férias proporcionais, iniciando-se, então, novo que precederem à concessão das férias. (Parágrafo\n", "período aquisitivo. (Artigo com redação dada pelo acrescido pelo Decreto-Lei nº 1.535, de 13/4/1977)\n", "Decreto-Lei nº 1.535, de 13/4/1977) § 4º A parte do salário paga em utilidades será\n", "--------------------------------------------------\n", "com redação dada pelo Decreto-Lei nº 1.535, de 13/4/1977)\n", " § 1º É vedado descontar, do período de férias, as\n", " I – deixar o emprego e não for readmitido dentro\n", "faltas do empregado ao serviço. (Parágrafo acrescido\n", " dos 60 (sessenta) dias subsequentes à sua saída;\n", "pelo Decreto-Lei nº 1.535, de 13/4/1977)\n", " (Inciso acrescido pelo Decreto-Lei nº 1.535, de 13/4/1977)\n", " § 2º O período das férias será computado, para\n", " II – permanecer em gozo de licença, com per-\n", "todos os efeitos, como tempo de serviço. (Parágrafo\n", " cepção de salários, por mais de 30 (trinta) dias;\n", "acrescido pelo Decreto-Lei nº 1.535, de 13/4/1977)\n", "--------------------------------------------------\n", "Art. 129. Todo empregado terá direito anual- 5/11/1993)\n", "mente ao gozo de um período de férias, sem pre- IV – justificada pela empresa, entendendo-se\n", "juízo da remuneração. (Artigo com redação dada pelo como tal a que não tiver determinado o desconto\n", "Decreto-Lei nº 1.535, de 13/4/1977) (Vide art. 7º, XVII, da do correspondente salário; (Inciso acrescido pelo\n", "Constituição Federal de 1988) Decreto-Lei nº 1.535, de 13/4/1977)\n", " V – durante a suspensão preventiva para respon-\n", "Art. 130. Após cada período de 12 (doze) meses\n", " der a inquérito administrativo ou de prisão preven-\n", "de vigência do contrato de trabalho, o empregado\n", " tiva, quando for impronunciado ou absolvido; e\n", "--------------------------------------------------\n", "empregador, em um só período, nos 12 (doze) pagará em dobro a respectiva remuneração. (Caput\n", " meses subsequentes à data em que o empregado do artigo com redação dada pelo Decreto-Lei nº 1.535, de\n", " tiver adquirido o direito. (Caput do artigo com redação 13/4/1977)\n", " dada pelo Decreto-Lei nº 1.535, de 13/4/1977) § 1º Vencido o mencionado prazo sem que o\n", " § 1º Desde que haja concordância do empre- empregador tenha concedido as férias, o empre-\n", " gado, as férias poderão ser usufruídas em até gado poderá ajuizar reclamação pedindo a fixação,\n", " três períodos, sendo que um deles não poderá por sentença, da época de gozo das mesmas. (Pa-\n", " ser inferior a quatorze dias corridos e os demais rágrafo acrescido pelo Decreto-Lei nº 1.535, de 13/4/1977)\n", " não poderão ser inferiores a cinco dias corridos, § 2º A sentença cominará pena diária de 5%\n", "--------------------------------------------------\n" ] } ], "source": [ "for r in result:\n", " print(r.page_content)\n", " print('-' * 50)" ] }, { "cell_type": "markdown", "id": "91e5add4-94e1-4337-9690-5791958b0e93", "metadata": {}, "source": [ "### Gerando respostas com LLM" ] }, { "cell_type": "code", "execution_count": 74, "id": "9dd47d56-4f67-424f-8071-84ae370e37a3", "metadata": {}, "outputs": [], "source": [ "from langchain.chains import RetrievalQA\n", "from langchain.chat_models import ChatOpenAI\n", "\n", "llm = ChatOpenAI(model='gpt-3.5-turbo-16k', temperature=0.5)\n", "\n", "retriever = vector_store.as_retriever(search_type='similarity', search_kwargs={'k': 3})\n", "\n", "chain = RetrievalQA.from_chain_type(llm=llm, chain_type='stuff', retriever=retriever)" ] }, { "cell_type": "code", "execution_count": 76, "id": "75a5ed98-1a83-4fc4-b680-cf5a114a1a39", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "O décimo terceiro salário, também conhecido como gratificação de Natal, é um benefício garantido por lei aos trabalhadores brasileiros. Ele consiste no pagamento de uma parcela adicional do salário no final do ano, equivalente a 1/12 avos da remuneração devida ao empregado em cada mês trabalhado no ano.\n", "\n", "O décimo terceiro salário deve ser pago em duas parcelas: a primeira deve ser paga até o dia 30 de novembro e corresponde a metade do salário do empregado. Já a segunda parcela deve ser paga até o dia 20 de dezembro e corresponde à outra metade do salário, descontando-se o valor do Imposto de Renda, se houver.\n", "\n", "É importante ressaltar que o décimo terceiro salário é um direito de todos os trabalhadores com carteira assinada, inclusive os empregados domésticos. Além disso, o valor do décimo terceiro salário deve ser proporcional ao tempo de serviço prestado durante o ano, ou seja, se o empregado trabalhou apenas alguns meses no ano, ele receberá o décimo terceiro proporcional a esse período.\n" ] } ], "source": [ "query = 'como funciona o décimo terceiro salário?'\n", "resp = chain.run(query)\n", "print(resp)" ] }, { "cell_type": "code", "execution_count": null, "id": "de9f97cf-1757-41f6-8abd-1f3df433fab2", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.6" } }, "nbformat": 4, "nbformat_minor": 5 }