EddyGiusepe commited on
Commit
e7fbeab
·
1 Parent(s): 90a9c4a

Explanação da RAG

Browse files
4_Building_a_Retrieval_Augmented_Generation_Chatbot.ipynb ADDED
@@ -0,0 +1,249 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ "Links de estudo:\n",
29
+ "\n",
30
+ "\n",
31
+ "* [ANACONDA: How to Build Your Own Panel AI Chatbots](https://www.anaconda.com/blog/how-to-build-your-own-panel-ai-chatbots)\n",
32
+ "\n",
33
+ "* [Medium: Holoviz Panel 1.30 NEW Chat Interface widget](https://medium.com/@andy456333/holoviz-panel-1-30-new-chat-interface-widget-d78c18f6e244)\n",
34
+ "\n",
35
+ "* [Medium: How to Build Your Own Panel AI Chatbots](https://sophiamyang.medium.com/how-to-build-your-own-panel-ai-chatbots-ef764f7f114e)"
36
+ ]
37
+ },
38
+ {
39
+ "cell_type": "markdown",
40
+ "metadata": {},
41
+ "source": [
42
+ "# <font color=\"red\">O que é geração aumentada de recuperação (RAG)?</font>"
43
+ ]
44
+ },
45
+ {
46
+ "cell_type": "markdown",
47
+ "metadata": {},
48
+ "source": [
49
+ "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",
50
+ "\n",
51
+ "Em uma configuração `RAG` típica:\n",
52
+ "\n",
53
+ "\n",
54
+ "* 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",
55
+ "\n",
56
+ "\n",
57
+ "* `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",
58
+ "\n",
59
+ "\n",
60
+ "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"
61
+ ]
62
+ },
63
+ {
64
+ "cell_type": "code",
65
+ "execution_count": null,
66
+ "metadata": {},
67
+ "outputs": [],
68
+ "source": [
69
+ "# Setup:\n",
70
+ "\n",
71
+ "%pip install panel pypdf chromadb tiktoken langchain openai"
72
+ ]
73
+ },
74
+ {
75
+ "cell_type": "code",
76
+ "execution_count": 1,
77
+ "metadata": {},
78
+ "outputs": [],
79
+ "source": [
80
+ "import os\n",
81
+ "from langchain.chains import RetrievalQA\n",
82
+ "from langchain.document_loaders import PyPDFLoader\n",
83
+ "from langchain.embeddings import OpenAIEmbeddings\n",
84
+ "from langchain.llms import OpenAI\n",
85
+ "from langchain.text_splitter import CharacterTextSplitter\n",
86
+ "from langchain.vectorstores import Chroma\n",
87
+ "\n",
88
+ "\n",
89
+ "# Substitua sua chave de API OpenAI:\n",
90
+ "import openai\n",
91
+ "import os\n",
92
+ "from dotenv import load_dotenv, find_dotenv\n",
93
+ "_ = load_dotenv(find_dotenv()) # read local .env file\n",
94
+ "openai.api_key = os.environ['OPENAI_API_KEY']\n",
95
+ "\n",
96
+ "\n",
97
+ "# Carregar documentos:\n",
98
+ "loader = PyPDFLoader(\"./docs/spacy_teste.pdf\")\n",
99
+ "documents = loader.load()\n",
100
+ "\n",
101
+ "# Split dos documentos em chunks:\n",
102
+ "text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)\n",
103
+ "texts = text_splitter.split_documents(documents)\n",
104
+ "\n",
105
+ "# Selecionamos nossos embeddings (pode ser qualquer outro):\n",
106
+ "embeddings = OpenAIEmbeddings()\n",
107
+ "\n",
108
+ "# Crie o vectorestore para usar como índice:\n",
109
+ "db = Chroma.from_documents(texts, embeddings)\n",
110
+ "\n",
111
+ "# Expor este índice em uma interface de recuperação:\n",
112
+ "retriever = db.as_retriever(search_type=\"similarity\",\n",
113
+ " search_kwargs={\"k\": 2}\n",
114
+ " )\n",
115
+ "\n",
116
+ "# Criamos uma chain para responder perguntas:\n",
117
+ "qa = RetrievalQA.from_chain_type(llm=OpenAI(),\n",
118
+ " chain_type=\"map_reduce\",\n",
119
+ " retriever=retriever,\n",
120
+ " return_source_documents=True,\n",
121
+ " verbose=True,\n",
122
+ " )\n"
123
+ ]
124
+ },
125
+ {
126
+ "cell_type": "code",
127
+ "execution_count": 2,
128
+ "metadata": {},
129
+ "outputs": [
130
+ {
131
+ "name": "stdout",
132
+ "output_type": "stream",
133
+ "text": [
134
+ "\n",
135
+ "\n",
136
+ "\u001b[1m> Entering new RetrievalQA chain...\u001b[0m\n",
137
+ "\n",
138
+ "\u001b[1m> Finished chain.\u001b[0m\n"
139
+ ]
140
+ },
141
+ {
142
+ "data": {
143
+ "text/plain": [
144
+ "{'query': 'O que é Entropia?',\n",
145
+ " '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",
146
+ " '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",
147
+ " 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'})]}"
148
+ ]
149
+ },
150
+ "execution_count": 2,
151
+ "metadata": {},
152
+ "output_type": "execute_result"
153
+ }
154
+ ],
155
+ "source": [
156
+ "qa(\"O que é Entropia?\")"
157
+ ]
158
+ },
159
+ {
160
+ "cell_type": "code",
161
+ "execution_count": 3,
162
+ "metadata": {},
163
+ "outputs": [
164
+ {
165
+ "name": "stdout",
166
+ "output_type": "stream",
167
+ "text": [
168
+ "\n",
169
+ "\n",
170
+ "\u001b[1m> Entering new RetrievalQA chain...\u001b[0m\n",
171
+ "\n",
172
+ "\u001b[1m> Finished chain.\u001b[0m\n"
173
+ ]
174
+ },
175
+ {
176
+ "data": {
177
+ "text/plain": [
178
+ "{'query': 'Como podemos avaliar a qualidade de clusters?',\n",
179
+ " '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. Algumas das métricas mais comuns incluem: número de clusters, tamanho dos clusters, densidade dos clusters e distância entre os clusters.',\n",
180
+ " '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",
181
+ " 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'})]}"
182
+ ]
183
+ },
184
+ "execution_count": 3,
185
+ "metadata": {},
186
+ "output_type": "execute_result"
187
+ }
188
+ ],
189
+ "source": [
190
+ "qa(\"Como podemos avaliar a qualidade de clusters?\")"
191
+ ]
192
+ },
193
+ {
194
+ "cell_type": "code",
195
+ "execution_count": 4,
196
+ "metadata": {},
197
+ "outputs": [
198
+ {
199
+ "name": "stdout",
200
+ "output_type": "stream",
201
+ "text": [
202
+ "\n",
203
+ "\n",
204
+ "\u001b[1m> Entering new RetrievalQA chain...\u001b[0m\n",
205
+ "\n",
206
+ "\u001b[1m> Finished chain.\u001b[0m\n"
207
+ ]
208
+ },
209
+ {
210
+ "data": {
211
+ "text/plain": [
212
+ "{'query': 'Quem foi Albert Einstein?',\n",
213
+ " 'result': \" I don't know.\",\n",
214
+ " 'source_documents': [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'}),\n",
215
+ " 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'})]}"
216
+ ]
217
+ },
218
+ "execution_count": 4,
219
+ "metadata": {},
220
+ "output_type": "execute_result"
221
+ }
222
+ ],
223
+ "source": [
224
+ "qa(\"Quem foi Albert Einstein?\")"
225
+ ]
226
+ }
227
+ ],
228
+ "metadata": {
229
+ "kernelspec": {
230
+ "display_name": "venv_ChatBot",
231
+ "language": "python",
232
+ "name": "python3"
233
+ },
234
+ "language_info": {
235
+ "codemirror_mode": {
236
+ "name": "ipython",
237
+ "version": 3
238
+ },
239
+ "file_extension": ".py",
240
+ "mimetype": "text/x-python",
241
+ "name": "python",
242
+ "nbconvert_exporter": "python",
243
+ "pygments_lexer": "ipython3",
244
+ "version": "3.10.12"
245
+ }
246
+ },
247
+ "nbformat": 4,
248
+ "nbformat_minor": 2
249
+ }