EddyGiusepe commited on
Commit
218d85c
·
1 Parent(s): 0b866d1

Trocou de nome

Browse files
Building_a_Retrieval_Augmented_Generation_Chatbot.ipynb DELETED
@@ -1,243 +0,0 @@
1
- {
2
- "cells": [
3
- {
4
- "cell_type": "markdown",
5
- "metadata": {},
6
- "source": [
7
- "<h1 align=\"center\"><font color=\"yellow\">Building a Retrieval Augmented Generation Chatbot</font></h1>"
8
- ]
9
- },
10
- {
11
- "cell_type": "markdown",
12
- "metadata": {},
13
- "source": [
14
- "<font color=\"yellow\">Data Scientist.: Dr. Eddy Giusepe Chirinos Isidro</font>"
15
- ]
16
- },
17
- {
18
- "cell_type": "markdown",
19
- "metadata": {},
20
- "source": [
21
- "Neste script vamos a estudar o Tutorial da [Sophia Yang, Ph.D](https://sophiamyang.medium.com/building-a-retrieval-augmented-generation-chatbot-d567a24fcd14). Basicamente aprenderemos a construir um ChatBot de Geração Aumentada de Recuperação (RAG), para isso ela usou LangChain e Panel."
22
- ]
23
- },
24
- {
25
- "cell_type": "markdown",
26
- "metadata": {},
27
- "source": [
28
- "# <font color=\"red\">O que é geração aumentada de recuperação (RAG)?</font>"
29
- ]
30
- },
31
- {
32
- "cell_type": "markdown",
33
- "metadata": {},
34
- "source": [
35
- "Você está interessado em fazer um `chatbot` que possa usar suas próprias coleções de dados para responder perguntas? A geração aumentada de recuperação (`RAG`) é uma estrutura de IA que combina os pontos fortes de modelos de linguagem pré-treinados e sistemas de recuperação de informações para gerar respostas em um sistema de IA conversacional ou para criar conteúdo aproveitando o conhecimento externo. Integra a recuperação de informações relevantes de uma fonte de conhecimento e a geração de respostas com base nas informações recuperadas.\n",
36
- "\n",
37
- "Em uma configuração `RAG` típica:\n",
38
- "\n",
39
- "\n",
40
- "* Recuperação (`Retrieval`): Dada uma `query` ou `prompt do usuário`, o sistema pesquisa em uma fonte de conhecimento (`um armazenamento de vetores com Embeddings de texto`) para encontrar documentos ou trechos de texto relevantes. O componente de recuperação normalmente emprega alguma forma de pontuação de `similaridade` ou `relevância` para determinar quais partes da fonte de conhecimento são mais pertinentes à query de entrada.\n",
41
- "\n",
42
- "\n",
43
- "* `Geração`: Os documentos ou fragmentos recuperados são então fornecidos a um grande modelo de linguagem (`LLM`), que os utiliza como contexto adicional para gerar uma resposta mais detalhada, factual e relevante.\n",
44
- "\n",
45
- "\n",
46
- "O `RAG` pode ser particularmente útil quando o modelo de linguagem pré-treinado por si só pode não ter as informações necessárias para gerar respostas precisas ou suficientemente detalhadas, uma vez que modelos de linguagem padrão como o `GPT-4` não são capazes de acessar diretamente informações externas em tempo real ou pós-treinamento.\n"
47
- ]
48
- },
49
- {
50
- "cell_type": "code",
51
- "execution_count": null,
52
- "metadata": {},
53
- "outputs": [],
54
- "source": [
55
- "# Setup:\n",
56
- "\n",
57
- "%pip install panel pypdf chromadb tiktoken langchain openai"
58
- ]
59
- },
60
- {
61
- "cell_type": "code",
62
- "execution_count": 2,
63
- "metadata": {},
64
- "outputs": [],
65
- "source": [
66
- "import os\n",
67
- "from langchain.chains import RetrievalQA\n",
68
- "from langchain.document_loaders import PyPDFLoader\n",
69
- "from langchain.embeddings import OpenAIEmbeddings\n",
70
- "from langchain.llms import OpenAI\n",
71
- "from langchain.text_splitter import CharacterTextSplitter\n",
72
- "from langchain.vectorstores import Chroma\n",
73
- "\n",
74
- "\n",
75
- "# Substitua sua chave de API OpenAI:\n",
76
- "import openai\n",
77
- "import os\n",
78
- "from dotenv import load_dotenv, find_dotenv\n",
79
- "_ = load_dotenv(find_dotenv()) # read local .env file\n",
80
- "openai.api_key = os.environ['OPENAI_API_KEY']\n",
81
- "\n",
82
- "\n",
83
- "# Carregar documentos:\n",
84
- "loader = PyPDFLoader(\"./docs/spacy_teste.pdf\")\n",
85
- "documents = loader.load()\n",
86
- "\n",
87
- "# Split dos documentos em chunks:\n",
88
- "text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)\n",
89
- "texts = text_splitter.split_documents(documents)\n",
90
- "\n",
91
- "# Selecionamos nossos embeddings (pode ser qualquer outro):\n",
92
- "embeddings = OpenAIEmbeddings()\n",
93
- "\n",
94
- "# Crie o vectorestore para usar como índice:\n",
95
- "db = Chroma.from_documents(texts, embeddings)\n",
96
- "\n",
97
- "# Expor este índice em uma interface de recuperação:\n",
98
- "retriever = db.as_retriever(search_type=\"similarity\",\n",
99
- " search_kwargs={\"k\": 2}\n",
100
- " )\n",
101
- "\n",
102
- "# Criamos uma chain para responder perguntas:\n",
103
- "qa = RetrievalQA.from_chain_type(llm=OpenAI(),\n",
104
- " chain_type=\"map_reduce\",\n",
105
- " retriever=retriever,\n",
106
- " return_source_documents=True,\n",
107
- " verbose=True,\n",
108
- " )\n"
109
- ]
110
- },
111
- {
112
- "cell_type": "code",
113
- "execution_count": 3,
114
- "metadata": {},
115
- "outputs": [
116
- {
117
- "name": "stdout",
118
- "output_type": "stream",
119
- "text": [
120
- "\n",
121
- "\n",
122
- "\u001b[1m> Entering new RetrievalQA chain...\u001b[0m\n",
123
- "\n",
124
- "\u001b[1m> Finished chain.\u001b[0m\n"
125
- ]
126
- },
127
- {
128
- "data": {
129
- "text/plain": [
130
- "{'query': 'O que é Entropia?',\n",
131
- " 'result': ' Entropia é uma medida de incerteza que pode ser usada para medir a granularidade do clustering. Quanto menor a entropia, mais granular será o clustering.',\n",
132
- " 'source_documents': [Document(page_content='Em geral, o objetivo do problema de classificação é encontrar a granularidade mais \\napropriada que permita uma separação eficiente dos dados de ambas as classes. \\nPara isso, é necessário utilizar técnicas de classificação, como a regressão logística, \\nárvores de decisão, SVM, redes neurais, entre outras, para encontrar a fronteira de \\ndecisão ótima entre as classes. A granularidade ideal dependerá da distribuição dos \\ndados em cada classe e da complexidade da fronteira de decisão.Granular idade b aixa: Nesta granularidade, os dados de amb as as classes \\nestão muit o próximos um do outr o, e há uma sobr eposição significativ a \\nentre os clust ers de amb as as classes. Isso significa que é difícil sep arar os \\ndados de amb as as classes com pr ecisão.1.\\nGranular idade média : Nesta granularidade, os clust ers de amb as as classes \\nsão clarament e distinguív eis, mas ainda pode hav er alguma sobr eposição \\nentre eles. Isso significa que é possív el sep arar os dados de amb as as \\nclasses com uma pr ecisão razo ável.2.\\nGranular idade alta : Nesta granularidade, os clust ers de amb as as classes são \\nmuit o distint os e não há sobr eposição entr e eles. Isso significa que é \\npossív el sep arar os dados de amb as as classes com alta pr ecisão.3.', metadata={'page': 4, 'source': './docs/spacy_teste.pdf'}),\n",
133
- " Document(page_content='É importante ressaltar que a escolha da métrica de granularidade depende do \\nobjetivo da análise e do tipo de dados que está sendo clusterizado. Além disso, é \\nrecomendável usar mais de uma métrica para avaliar a granularidade de um \\nclustering de forma mais abrangente e confiável.\\nConsiderando k -means, como posso p ara definir o niv el de granular idade que \\ndesejo\\nNo k-means, a granularidade pode ser controlada por meio da escolha do númer o \\nde clust ers desejado . Para definir o nível de granularidade desejado, você pode \\nseguir estes passos:\\nLembre-se de que o k-means é um algoritmo de clustering sensível à inicialização e \\npode produzir resultados diferentes com diferentes sementes aleatórias. P ortanto, é \\nrecomendável executar o algoritmo várias vezes com diferentes sementes aleatórias \\ne escolher o resultado com melhor qualidade de clustering.\\nPara o caso de fuzzy c-means como posso p ara definir o niv el de granular idade \\nque desejoEntropia: A entropia é uma medida de incerteza e pode ser usada para medir \\na granularidade do clustering. Quant o menor a entr opia, mais granular será \\no clust ering.5.\\nVisualize seus dados : Antes de aplicar o algoritmo k-means, é importante \\nvisualizar os dados para entender sua estrutura e distribuição. Isso ajudará a \\nter uma ideia aproximada do número de clusters necessários para representar \\nos dados de forma significativa.1.\\nExecute o algor itmo com difer entes valores de k : Execute o algoritmo k-\\nmeans com diferentes valores de k e compare os resultados. Se você estiver \\nbuscando uma granularidade mais fina, tente aumentar o número de clusters. \\nSe você quiser uma granularidade mais baixa, tente reduzir o número de \\nclusters.2.\\nAvalie a qualidade dos clust ers: Para avaliar a qualidade dos clusters, você \\npode usar métricas de validação de clustering, como o índice de silhueta ou o \\ncoeficiente de variação total. Essas métricas podem ajudá-lo a determinar se o \\nnúmero de clusters escolhido é apropriado para seus dados.3.\\nConsider e o cont exto: Finalmente, é importante considerar o contexto em \\nque os dados estão sendo analisados. Dependendo do objetivo da análise, a \\ngranularidade pode precisar ser ajustada para capturar informações relevantes \\ne significativas dos dados.4.', metadata={'page': 2, 'source': './docs/spacy_teste.pdf'})]}"
134
- ]
135
- },
136
- "execution_count": 3,
137
- "metadata": {},
138
- "output_type": "execute_result"
139
- }
140
- ],
141
- "source": [
142
- "qa(\"O que é Entropia?\")"
143
- ]
144
- },
145
- {
146
- "cell_type": "code",
147
- "execution_count": 4,
148
- "metadata": {},
149
- "outputs": [
150
- {
151
- "name": "stdout",
152
- "output_type": "stream",
153
- "text": [
154
- "\n",
155
- "\n",
156
- "\u001b[1m> Entering new RetrievalQA chain...\u001b[0m\n",
157
- "\n",
158
- "\u001b[1m> Finished chain.\u001b[0m\n"
159
- ]
160
- },
161
- {
162
- "data": {
163
- "text/plain": [
164
- "{'query': 'Como podemos avaliar a qualidade de clusters?',\n",
165
- " 'result': ' Para avaliar a qualidade dos clusters, você pode usar métricas de validação de clustering, como o índice de silhueta ou o coeficiente de variação total. Existem várias métricas que podem ser usadas para medir a granularidade de um clustering, dependendo do tipo de algoritmo de clustering e do objetivo da análise, como o número de clusters, o tamanho dos clusters e a densidade dos clusters.',\n",
166
- " 'source_documents': [Document(page_content='É importante ressaltar que a escolha da métrica de granularidade depende do \\nobjetivo da análise e do tipo de dados que está sendo clusterizado. Além disso, é \\nrecomendável usar mais de uma métrica para avaliar a granularidade de um \\nclustering de forma mais abrangente e confiável.\\nConsiderando k -means, como posso p ara definir o niv el de granular idade que \\ndesejo\\nNo k-means, a granularidade pode ser controlada por meio da escolha do númer o \\nde clust ers desejado . Para definir o nível de granularidade desejado, você pode \\nseguir estes passos:\\nLembre-se de que o k-means é um algoritmo de clustering sensível à inicialização e \\npode produzir resultados diferentes com diferentes sementes aleatórias. P ortanto, é \\nrecomendável executar o algoritmo várias vezes com diferentes sementes aleatórias \\ne escolher o resultado com melhor qualidade de clustering.\\nPara o caso de fuzzy c-means como posso p ara definir o niv el de granular idade \\nque desejoEntropia: A entropia é uma medida de incerteza e pode ser usada para medir \\na granularidade do clustering. Quant o menor a entr opia, mais granular será \\no clust ering.5.\\nVisualize seus dados : Antes de aplicar o algoritmo k-means, é importante \\nvisualizar os dados para entender sua estrutura e distribuição. Isso ajudará a \\nter uma ideia aproximada do número de clusters necessários para representar \\nos dados de forma significativa.1.\\nExecute o algor itmo com difer entes valores de k : Execute o algoritmo k-\\nmeans com diferentes valores de k e compare os resultados. Se você estiver \\nbuscando uma granularidade mais fina, tente aumentar o número de clusters. \\nSe você quiser uma granularidade mais baixa, tente reduzir o número de \\nclusters.2.\\nAvalie a qualidade dos clust ers: Para avaliar a qualidade dos clusters, você \\npode usar métricas de validação de clustering, como o índice de silhueta ou o \\ncoeficiente de variação total. Essas métricas podem ajudá-lo a determinar se o \\nnúmero de clusters escolhido é apropriado para seus dados.3.\\nConsider e o cont exto: Finalmente, é importante considerar o contexto em \\nque os dados estão sendo analisados. Dependendo do objetivo da análise, a \\ngranularidade pode precisar ser ajustada para capturar informações relevantes \\ne significativas dos dados.4.', metadata={'page': 2, 'source': './docs/spacy_teste.pdf'}),\n",
167
- " Document(page_content='Exemplo 3: Clust ering de dados de r edes sociais\\nImagine que você queira agrupar usuários de redes sociais com base em seus \\ninteresses e comportamentos. \\nQue métr icas posso usar p ara medir a granular idade de um clust ering\\nExistem várias métricas que podem ser usadas para medir a granularidade de um \\nclustering, dependendo do tipo de algoritmo de clustering e do objetivo da análise. \\nAlgumas das métricas mais comuns incluem:Se a granular idade do clust ering for b aixa, você pode agrupar os pacientes \\nem grandes grupos, como \"pacientes com doenças crônicas\" e \"pacientes \\nsaudáveis\". \\nSe a granular idade do clust ering for alta , você pode agrupar os pacientes \\nem clusters específicos, como \"pacientes com diabetes tipo 2\", \"pacientes com \\nhipertensão\" e \"pacientes com doenças cardíacas\".\\nSe a granular idade do clust ering for b aixa, você pode agrupar os usuários \\nem grandes categorias, como \"usuários que gostam de esportes\" e \"usuários \\nque gostam de música\". \\nSe a granular idade do clust ering for alta , você pode agrupar os usuários em \\nclusters específicos, como \"usuários que gostam de futebol\", \"usuários que \\ngostam de música clássica\" e \"usuários que gostam de rock alternativo\".\\nNúmer o de clust ers: Uma métrica simples e intuitiva é contar o número de \\nclusters gerados pelo algoritmo de clustering. Quant o mais clust ers \\nexistir em, mais granular será o clust ering.1.\\nTamanho dos clust ers: A granularidade também pode ser medida pelo \\ntamanho dos clusters. Se os clust ers for em pequenos e contiv erem apenas \\nalgumas instâncias, o clust ering será mais granular do que se os clust ers \\nforem grandes e contiv erem muitas instâncias.2.\\nDensidade dos clust ers: A densidade dos clusters também pode ser usada \\npara medir a granularidade. Se os clust ers for em densos e bem agr upados, \\no clust ering será menos granular do que se os clust ers for em menos \\ndensos e mais disper sos.3.\\nDistância entr e os clust ers: A distância m��dia entre os clusters também pode \\nser usada como uma métrica de granularidad e. Se a distância média entr e os \\nclust ers for grande, o clust ering será mais granular do que se a distância \\nmédia entr e os clust ers for pequena.4.', metadata={'page': 1, 'source': './docs/spacy_teste.pdf'})]}"
168
- ]
169
- },
170
- "execution_count": 4,
171
- "metadata": {},
172
- "output_type": "execute_result"
173
- }
174
- ],
175
- "source": [
176
- "qa(\"Como podemos avaliar a qualidade de clusters?\")"
177
- ]
178
- },
179
- {
180
- "cell_type": "code",
181
- "execution_count": null,
182
- "metadata": {},
183
- "outputs": [],
184
- "source": []
185
- },
186
- {
187
- "cell_type": "code",
188
- "execution_count": null,
189
- "metadata": {},
190
- "outputs": [],
191
- "source": []
192
- },
193
- {
194
- "cell_type": "code",
195
- "execution_count": null,
196
- "metadata": {},
197
- "outputs": [],
198
- "source": []
199
- },
200
- {
201
- "cell_type": "code",
202
- "execution_count": null,
203
- "metadata": {},
204
- "outputs": [],
205
- "source": []
206
- },
207
- {
208
- "cell_type": "code",
209
- "execution_count": null,
210
- "metadata": {},
211
- "outputs": [],
212
- "source": []
213
- },
214
- {
215
- "cell_type": "code",
216
- "execution_count": null,
217
- "metadata": {},
218
- "outputs": [],
219
- "source": []
220
- }
221
- ],
222
- "metadata": {
223
- "kernelspec": {
224
- "display_name": "venv_ChatBot",
225
- "language": "python",
226
- "name": "python3"
227
- },
228
- "language_info": {
229
- "codemirror_mode": {
230
- "name": "ipython",
231
- "version": 3
232
- },
233
- "file_extension": ".py",
234
- "mimetype": "text/x-python",
235
- "name": "python",
236
- "nbconvert_exporter": "python",
237
- "pygments_lexer": "ipython3",
238
- "version": "3.10.12"
239
- }
240
- },
241
- "nbformat": 4,
242
- "nbformat_minor": 2
243
- }