EddyGiusepe commited on
Commit
4be09ca
·
1 Parent(s): ac3a949

ChatBot com Panel e LangChain

Browse files
Building_a_Retrieval_Augmented_Generation_Chatbot.ipynb ADDED
@@ -0,0 +1,243 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ }