Hola Nechu, de antemano muchas gracias por sus aportes. Una inquietud: En la linea 51 docs = vstore.similarity_search(user_question,3) Hay alguna manera de traer no solo los textos resultantes de la busqueda, sino tambien los Metadatos o los campos en donde se almacena la fuente? Si se han subido varios pdf sería apropiado saber de cual de todos se están extrayendo los chunks. Revisando la documentación de Langchain veo que es posible crear filtros para limitar las búsquedas pero no veo aquí cómo se podría aplicar. Gracias por la respuesta.
Te presento varias opciones según las necesidades de tu caso de uso con referencias: 1. En la sección 1C del notebook titulada ´buscar vectores´, si quieres filtrar en base a los metadatos solo tienes que modificar la query de la siguiente forma: index.query( vector=[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1], filter={ "genre": {"$eq": "documentary"}, "year": 2019 }, top_k=1, include_metadata=True ) docs.pinecone.io/guides/data/filtering-with-metadata 2. Si quieres realizar preguntas y que la búsqueda de documentos esté acotada a un conjunto específico utiliza el siguiente filtro: docs = vstore.similarity_search(query, {"key":"value"}) github.com/langchain-ai/langchain/issues/1838 3. Si lo que buscas es que la respuesta de la búsqueda en Pinecone te devuelva los metadatos, comprueba la variable 'docs' (el resultado de la búsqueda) donde podrás encontrarlos, si no es así asegúrate de añadirlos al cargar los vectores: metadatas = [{"page": i} for i in range(len(texts))] docsearch = Pinecone.from_texts( texts, embedding_openai, index_name=index_name, metadatas=metadatas, namespace=namespace_name, ) github.com/langchain-ai/langchain/discussions/10063 ¡Gracias por el apoyo y el mensaje!
Una duda. Cómo haces la equivalencia entre embeddings-dimensiones para que cuadren los embeddings generados con las dimensiones que acepta pinecone. Desde la consola si agrego 300 y acepta 400 me lanza error
He utilizado Pinecone y ChromaDB ruclips.net/video/udexkMXDX2U/видео.html Otro base de datos vectorial que quiero probar es Weaviate pero pgvector aún no lo he trabajado ¿la recomiendas? ¡Gracias por el apoyo!
nechu, me salio un error en el notebook que aun no entiendo como resolver, tu me puede ayudar? por favor AttributeError: type object 'Pinecone' has no attribute 'from_documents'
La librería Pinecone ha realizado unas actualizaciones del código. Para que todo siga funcionando como en el vídeo, a la hora de instalar especifica la versión de Pinecone que quieres. En este caso escribimos lo siguiente: pinecone-client==2.2.4 He lanzado el notebook entero y ha funcionado sin problema.
@@NechuBM Un par de detalles pues en la ultima version de pinecone dashboard al crear la api_key no muestra el enviroment y al ejecutar la lsita pinecone.list_indexes() se muestra en vacio.
@@ErickAguilar-ow7qp Para encontrar el environment solo tienes que ir a la pestaña indices en el portal web. Una vez ahí bajo el nombre del índice te indica la región. Si te devuelve una lista vacía al ejecutar pinecone.list_indexes() significa que el código ha funcionado pero no tienes ningún índice creado, comprueba esto último y vuelve a ejecutar el código.
@@NechuBM Estaba haciendo las pruebas actualizando la región de aws(que por lo visto coincide con el env9iroment) y lo supera sin problemas , se verifico el index "taller" previamente creado en el dashboard pero al correr el codigo pinecone.list_indexes() muestra el siguiene error, a que crees que se deba ? WARNING:urllib3.connectionpool:Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NameResolutionError(": Failed to resolve 'controller.us-east-1.pinecone.io' ([Errno -2] Name or service not known)")': /databases WARNING:urllib3.connectionpool:Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NameResolutionError(": Failed to resolve 'controller.us-east-1.pinecone.io' ([Errno -2] Name or service not known)")': /databases WARNING:urllib3.connectionpool:Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NameResolutionError(": Failed to resolve 'controller.us-east-1.pinecone.io' ([Errno -2] Name or service not known)")': /databases --------------------------------------------------------------------------- gaierror Traceback (most recent call last) /usr/local/lib/python3.10/dist-packages/urllib3/connection.py in _new_conn(self) 202 try: --> 203 sock = connection.create_connection( 204 (self._dns_host, self.port), 25 frames gaierror: [Errno -2] Name or service not known The above exception was the direct cause of the following exception: NameResolutionError Traceback (most recent call last) NameResolutionError: : Failed to resolve 'controller.us-east-1.pinecone.io' ([Errno -2] Name or service not known) The above exception was the direct cause of the following exception: MaxRetryError Traceback (most recent call last) /usr/local/lib/python3.10/dist-packages/urllib3/util/retry.py in increment(self, method, url, response, error, _pool, _stacktrace) 513 if new_retry.is_exhausted(): 514 reason = error or ResponseError(cause) --> 515 raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type] 516 517 log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) MaxRetryError: HTTPSConnectionPool(host='controller.us-east-1.pinecone.io', port=443): Max retries exceeded with url: /databases (Caused by NameResolutionError(": Failed to resolve 'controller.us-east-1.pinecone.io' ([Errno -2] Name or service not known)"))
Hola, muchas gracias por la explicación y el conocimiento impartido es de gran ayuda, quería saber si es posible guardar el contexto o historial de la conversación, con el fin de realizar preguntas y tener una mejor interacción y no volver a escribir las preguntas completas.
¡Gracias por tu comentario! ¿Te refieres a guardar un historial de preguntas y respuestas para poder revisarlas más tarde, o te gustaría tener la capacidad de continuar una conversación de manera dinámica, construyendo a partir de respuestas anteriores sin tener que repetir el contexto cada vez? Ambas opciones son posibles, pero funcionan de maneras diferentes.
Hola Nechu, Una consulta esta linea de codigo al ejecutarla me deberia regresar un resultado vstore.similarity_search(pregunta, 3) en caso de estar en el documento caso contrario enviaria [ ]. Observo que aunque tenga la base de datos de Pinecone vacia siempre responde las preguntas que haga. Aunque tenga datos en la Pinecone siempre vstore.similarity_search(pregunta, 3) devuelve vacio [ ]
Para entender mejor por qué responde a la pregunta sin pasar contexto adicional es bueno analizar el prompt que le enviamos al modelo cuando utilizamos LangChain. Lo puedes encontrar en este enlace: github.com/langchain-ai/langchain/blob/master/libs/langchain/langchain/chains/retrieval_qa/prompt.py Ocurre que, aunque no le pasemos contexto, el modelo intenta responder con el conocimiento que tiene. Si para tu caso de uso realmente quieres que esto no ocurra lo mejor es cambiar el prompt base que utiliza LangChain. Para hacer esto aquí tienes un ejemplo con código: github.com/langchain-ai/langchain/discussions/9818 Por otro lado el funcionamiento actual de vstore.similarity_search(pregunta, 3) es el de devolver los N vectores más similares. Para Pinecone o Chroma no existe un límite de similitud a partir de cual deje de devolver resultados. Aunque la puntuación de similitud sea muy baja seguirá devolviendo los N más similares. Por lo tanto, si no te devuelve ningún resultado, comprueba que tienes todo bien configurado. Con la librería FAISS si puedes utilizar el parámetro score_threshold para limitar los resultados a partir de cierto valor de similitud.
@@donaldmontoya1491 Pues entonces el enlace que compartí anteriormente es donde encontraras la solución: github.com/langchain-ai/langchain/discussions/9818 Modifica el prompt base para que solo responda en caso de que la información esté en el contexto que le compartes con la pregunta.
Hola, excelente enseñanza, en el video anterior: preguntaPDF | Pregunta a tu PDF con ChatGPT y Langchain - Tutorial, no empleas pinecone y funciona para pdf largos, cuentame el valor agragado de pinecone(es pago). Saludos
La diferencia no tiene que ver con el tamaño de los documentos, ambos trabajan con documentos grandes. La diferencia es que en el primer vídeo cada vez que accedas a la plataforma tienes que subir el documento (incluso cuando refrescas la página). Gracias a Pinecone almacenas los vectores independientemente de la aplicación y por lo tanto podrás acceder de nuevo al documento sin tener que volver a procesarlo y desde cualquier lugar. Imagínate que estás haciendo un trabajo para la universidad, ¿te pones a escribir en Word y cuando termines que haces? ¿Lo guardas para poder acceder más tarde o sales sin guardar y lo vuelves a escribir después? En el taller no tenemos que pagar por utilizar Pinecone ya que con la capa gratuita es suficiente. De todos modos, en los próximos días veremos una alternativa open-source y gratuita que se llama ChromaDB, stay tunned.
Nechu, porque razon será que no puedo ver el contenido de los vectores dentro de la consola de Pinecone. En Vector Count tengo 7 pero no puedo visualizar su contenido como tu los muestras en el video. Será que tengo que actualizarme a pago? He realizado el ejercicio varias veces borrando el contenido del index (taller) y vuelto a cargar pero sigo sin poder visualizarlos (en VECTOR COUNT tengo 7) en la consola de Pinecone, será por esa misma razon que no obtengo datos con vstore.similarity_search(pregunta, 3). Gracias de antemano por tu amabilidad de responder
si, algunas de las funciones ya no están disponibles para la versión gratis de pinecone, eso aparece en los mensajes de error, pero parece que no afecta en el proceso completo
Acabo de ejecutar el código tal cual está en el notebook y no me da ninguno de los problemas que explicas. Al acceder al portal de Pinecone se muestran los vectores que añadí y tengo la versión gratuita. Por lo tanto, parece que la causa del problema es otra. Comprueba las siguientes opciones: • Que has pinchado en la pestaña de Indexes y no de Collections en el portal de Pinecone. • No estas utilizando ningún ‘Namespaces’. En el portal selecciona el índice y comprueba el número de namespaces (normalmente solo 1, el Default) • Es el índice y la cuenta correctos, cuando probamos con varias cuentas podemos acabar liándonos. ¡Feliz año nuevo @donaldmontoya1491 @rubenev!
Gracias @@NechuBM No se que habra sucedido pero hoy entre a Pinecone y puedo visualizar los vectores sin haber realizado nada. Igualmente para ti @NechuBM que tengas un año lleno de salud y exitos en todo lo que hagas. Feliz y Prospero año 2024, Dios este contigo😇
Hola Nechu, muchas gracias por tu video. Te quiero pedir un favor, no me queda claro cómo calcular el tamaño de los chunks y overlaps. Tú lo tieness en 800 y 100 caracteres. Pero estos valores tienen alguna explicación o forma de calcular? Mi índice de Pinecone tiene dimesiones de 1536 y el tuyo es de 384. Significa que mis chunks pueden ser de 3200 con 400 de overlap?
La dimensión de los vectores de embedding y el tamaño del chunk no están directamente relacionados. El tamaño de los vectores de embedding determina el número de dimensiones que tendrá el vector. Cuanto mayor sea el número de dimensiónes, en general, mayor será la calidad del embedding, ya que el vector contendrá más información. Sin embargo, los modelos que generan vectores más grandes requieren más procesamiento y potencia de cómputo, lo que los hace más costosos. Por lo tanto, debes evaluar si el costo de generar vectores de mayores dimensiones está justificado por el beneficio que aportan. Por otro lado, están los chunks, que representan la forma en que dividimos el texto. Esto variará según el tipo de documentos con los que estemos trabajando, pueden ser documentos legales, recetas, facturas, etc. Cada tipo de documento tendrá una estructura diferente y, por lo tanto, un tamaño de chunk diferente. El objetivo del chunk es dividir el documento en partes coherentes, por ejemplo, si estás trabajando con recetas de cocina, querrás que los ingredientes y las instrucciones de preparación estén en el mismo chunk para evitar mezclarlos con otros ingredientes de diferentes recetas. Aquí tienes un artículo donde explican en detalle cómo definir el tamaño de los chunks: www.pinecone.io/learn/chunking-strategies/
Queria enviar las repuesta a washap, existe alguna alternativa libre para python, distinto a meta, twilio, como baileys que usan en java?...o se podria implementar baileys con python?
Puedes probar la librería pywhatkit para enviar mensajes a What’s App con Python. Si quieres crear un bot automatizado con notificación te recomiendo explorar Telegram o Discord, permiten una integración más sencilla para este tipo de desarrollos.
5 месяцев назад
En pinecone no dan ya la variable environment desde API Keys, agradezco ayuda
5 месяцев назад
En el minuto 8:56 la interface de api Key no es igual, por tanto la función de conexión tampoco, me encanta el vídeo pero estoy atrancado ahí. Muchas gracias
En la nueva versión de Pinecone ya no hace falta la variable environment. Puedes utilizar el siguiente código para conectarte: from pinecone.grpc import PineconeGRPC as Pinecone from pinecone import ServerlessSpec pc = Pinecone(api_key='YOUR_API_KEY') Y luego al crear el índice indicas la región y la nube que quieres utilizar: pc.create_index( name=index_name, dimension=2, metric="cosine", spec=ServerlessSpec( cloud='aws', region='us-east-1' ) ) Estoy preparando un notebook actualizado para la nueva versión de Pinecone, lo compartiré próximamente.
Funciona de manera similar a como lo harías con texto. En lugar de utilizar un modelo que convierte texto a vectores/embeddings, necesitas uno que procese audio y lo transforme en vectores/embeddings. Un buen ejemplo es el modelo facebook/wav2vec2-base, que puedes encontrar en Hugging Face. Este modelo convierte grabaciones de voz en vectores/embeddings, lo que permite trabajar con el audio de la misma manera que vemos en el vídeo.
Hola, me parece muy interesante tu video y entiendo la lógica de lo que haces. Pero la verdad no se por donde empezar y es la primera vez que veo esto de los notebooks, tienes algún video tutorial de cómo usar los notebooks que compartes? He visto tus videos y no encuentro nada. Disculpa si es algo muy básico pero me gustaría aprender y entender . gracias
Claro, aquí te dejo algunos enlaces para que entiendas cómo funcionan los notebooks, una herramienta muy útil en programación. Si tienes alguna pregunta, no dudes en dejarla en los comentarios: ruclips.net/video/uiF8mzvzi74/видео.html ruclips.net/video/UeQdaqqdogE/видео.html
Geniallll!!!!! Podria hacer lo mismo pero con otra IA por ejemplo de Hughing Face?? Necesito hacer eso mismo con algo open source o que sea mas económico
¡¡Gracias!! Claro, puedes reemplazar ChatGPT con modelos Open-Source, te comparto varias alternativas que te pueden interesar: Despliegue local: ruclips.net/video/tCFDPW2ctgI/видео.html Despliegue en HuggingFace: ruclips.net/video/kp-UCfxTEoY/видео.html Despliegue en AWS Sagemaker: ruclips.net/video/hnm4UhieqcU/видео.html
¿Esto tambien limita a contestar solo con los PDFs? , es decir , si le pregunto que es SQL contestará la pregunta o me dira que no tiene informacion , Buen video.
He probado con preguntas genéricas y si son muy genéricas si responde. Cuando preguntas detalles más precisos o información más concreta es cuando responde que no tiene información suficiente en el contexto. Lo mejor es probar según tu caso de uso y analizar los resultados. Tras este análisis si no estás del todo contento con los resultados de ChatGPT y realmente quieres que no te responda si no tiene información tienes dos opciones. Primero es cambiar el prompt para insistir a ChatGPT que si no aparece información en el contexto no responda. La otra opción es analizar los resultados que devuelve la búsqueda de vectores similares y si los 3 vectores que devuelve no se parecen en nada a la pregunta devuelves una respuesta del estilo ‘no tengo información suficiente’ sin ni siquiera pasárselo a ChatGPT.
¡Muchas gracias! ¿A qué te refieres con memoria? Pinecone es una base de datos vectorial y funciona como componente externo al modelo. Podemos utilizarlo, como hemos visto en el vídeo, para crear una ‘memoria’ de documentos a los que acceder cuando realizamos una pregunta.
Siii, los tienes en la descripción del vídeo. Adicionalmente los añado aquí: Málaga CF: preguntapdf.s3.eu-south-2.amazonaws.com/la-rosaleda_v3.pdf Guía México: preguntapdf.s3.eu-south-2.amazonaws.com/GuiaViajeMexicoDF.pdf
Si quieres utilizar otro LLM en local o la nube te recomiendo este vídeo donde explico como hacerlo: ruclips.net/video/tCFDPW2ctgI/видео.html Solo quedaría cambiar la petición a ChatGPT por la llamada a tu LLM en local o la nube como veras en el enlace.
El código queda así (utilizando el modelo flan-t5-large de google): from langchain.llms import HuggingFaceHub llm=HuggingFaceHub(repo_id="google/flan-t5-large", model_kwargs={"temperature":0.7, "max_length":512}) chain = load_qa_chain(llm, chain_type="stuff")
Sí, solo necesitas cambiar las líneas de código donde llamamos a ChatGPT por el modelo que te interese. Si quieres probar la librería Transformers de HugginFace con Llama2 quedaría algo así: from transformers import pipeline pipe = pipeline("text-generation", model="meta-llama/Llama-2-7b-chat-hf")
@@NechuBM Gracias pero ahora me sale este error: RateLimitError Traceback (most recent call last) in () 2 docs = vstore.similarity_search(pregunta, 3) 3 # Utilizar los parrafos similares para darle contexto a ChatGPT ----> 4 respuesta = chain.run(input_documents=docs, question=pregunta) 5 print(f"Respuesta ChatGPT: {respuesta}") 28 frames /usr/local/lib/python3.10/dist-packages/openai/_base_client.py in _request(self, cast_to, options, remaining_retries, stream, stream_cls) 1039 1040 log.debug("Re-raising status error") -> 1041 raise self._make_status_error_from_response(err.response) from None 1042 1043 return self._process_response( RateLimitError: Error code: 429 - {'error': {'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: platform.openai.com/docs/guides/error-codes/api-errors.', 'type': 'insufficient_quota', 'param': None, 'code': 'insufficient_quota'}} Tengo la versión gratuita de chatGPT
Si, Pinecone ha estado realizando unos cambios en su API y cómo conectarnos a sus servicios. Estoy preparando un notebook actualizado que funcione para la nueva versión.
EDIT 02/01/2024: Revisando mejor el código he cambiado unas líneas del notebook. Lo importante es hacer un describe del Index y no de collection. Una collection es una copia de seguridad del Index. Como no hemos creado ninguna nos da un 404 NotFound, a mi si me funciona porque la tenía creada de antes. Comentario Anterior: Sin replicar el error en mi ordenador es difícil dar con la solución, pero diría que puede ocurrir por dos motivos: • No has creado el índice en la plataforma de Pinecone con el nombre ‘taller’ y por eso no lo encuentra cuando intenta describirlo. Recuerda que INDEX_NAME=’taller’. Comprueba que has cambiado los valores de PINECONE_API_KEY y PINECONE_ENV por los tuyos • Simplemente hubo un error puntual de conexión al realizar la petición y si vuelves a probar te funcionará.
@@NechuBM el texto dice: The requested feature 'Collections' is not supported by the current index type 'Starter'. esto es porque la cuenta es gratis? o como poner un type diferente al 'starter'?
@@rubenev Acabo de ejecutar el código y no me devuelve ese error. La versión de la librería de Pinecone en Python que estoy utilizando es la 2.2.4 En cualquier caso, lo importante no es un describe de la collection si no del índice. He cambiado el código en el notebook.
Revisando mejor el código he cambiado unas líneas del notebook. Lo importante es hacer un describe del Index y no de collection. Una collection es una copia de seguridad del Index. Como no hemos creado ninguna nos da un 404 NotFound, a mi si me funciona porque la tenía creada de antes.
@@NechuBM Hola!, de hecho lo estoy tratando de ejecutar desde una pc, y me aparece el error de : pip install sentence-transformers porque esta librería tiene conflictos, pero no me dice donde, entonces la instalación recorre las versiones, pero no encuentra ninguna compatible "INFO: pip is looking at multiple versions of sentence-transformers to determine which version is compatible with other requirements."
Gracias Nechu, te cuento que no logro resolver el siguiente error cuando ejecuto la linea pinecone.list_indexes(), WARNING:urllib3.connectionpool:Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NameResolutionError(": Failed to resolve 'controller.svc.aped-4627-b74a.pinecone.io.pinecone.io' ([Errno -2] Name or service not known)")': /databases WARNING:urllib3.connectionpool:Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NameResolutionError(": Failed to resolve 'controller.svc.aped-4627-b74a.pinecone.io.pinecone.io' ([Errno -2] Name or service not known)")': /databases WARNING:urllib3.connectionpool:Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NameResolutionError(": Failed to resolve 'controller.svc.aped-4627-b74a.pinecone.io.pinecone.io' ([Errno -2] Name or service not known)")': /databases --------------------------------------------------------------------------- gaierror Traceback (most recent call last) /usr/local/lib/python3.10/dist-packages/urllib3/connection.py in _new_conn(self) 202 try: --> 203 sock = connection.create_connection( 204 (self._dns_host, self.port), 25 frames gaierror: [Errno -2] Name or service not known The above exception was the direct cause of the following exception: NameResolutionError Traceback (most recent call last) NameResolutionError: : Failed to resolve 'controller.svc.aped-4627-b74a.pinecone.io.pinecone.io' ([Errno -2] Name or service not known) The above exception was the direct cause of the following exception: MaxRetryError Traceback (most recent call last) /usr/local/lib/python3.10/dist-packages/urllib3/util/retry.py in increment(self, method, url, response, error, _pool, _stacktrace) 513 if new_retry.is_exhausted(): 514 reason = error or ResponseError(cause) --> 515 raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type] 516 517 log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) MaxRetryError: HTTPSConnectionPool(host='controller.svc.aped-4627-b74a.pinecone.io.pinecone.io', port=443): Max retries exceeded with url: /databases (Caused by NameResolutionError(": Failed to resolve 'controller.svc.aped-4627-b74a.pinecone.io.pinecone.io' ([Errno -2] Name or service not known)"))
No parece ser un error relacionado con las variables de entorno. Te recomendaría revisar si tienes instaladas las mismas versiones de las bibliotecas que las que utilizamos en el tutorial. Si el error persiste y has realizado algún cambio, comparte el código para ver qué podría estar causando el problema.
Mil gracias por tu aporte
¡Un placer!
Gracias Nechu por compartir tus conocimientos, este video esta genial y bien explicado, se comprende facilmente
¡Muchas gracias por el comentario! Me encanta saber que encontraste las explicaciones claras y fáciles de comprender. Nos vemos en los próximos vídeos
Gracias, me ha ayudado bastante
¡Qué bueno! Nos vemos en los próximos vídeos.
Hola Nechu, de antemano muchas gracias por sus aportes.
Una inquietud:
En la linea 51
docs = vstore.similarity_search(user_question,3)
Hay alguna manera de traer no solo los textos resultantes de la busqueda, sino tambien los Metadatos o los campos en donde se almacena la fuente?
Si se han subido varios pdf sería apropiado saber de cual de todos se están extrayendo los chunks.
Revisando la documentación de Langchain veo que es posible crear filtros para limitar las búsquedas pero no veo aquí cómo se podría aplicar.
Gracias por la respuesta.
Te presento varias opciones según las necesidades de tu caso de uso con referencias:
1. En la sección 1C del notebook titulada ´buscar vectores´, si quieres filtrar en base a los metadatos solo tienes que modificar la query de la siguiente forma:
index.query(
vector=[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1],
filter={
"genre": {"$eq": "documentary"},
"year": 2019
},
top_k=1,
include_metadata=True
)
docs.pinecone.io/guides/data/filtering-with-metadata
2. Si quieres realizar preguntas y que la búsqueda de documentos esté acotada a un conjunto específico utiliza el siguiente filtro:
docs = vstore.similarity_search(query, {"key":"value"})
github.com/langchain-ai/langchain/issues/1838
3. Si lo que buscas es que la respuesta de la búsqueda en Pinecone te devuelva los metadatos, comprueba la variable 'docs' (el resultado de la búsqueda) donde podrás encontrarlos, si no es así asegúrate de añadirlos al cargar los vectores:
metadatas = [{"page": i} for i in range(len(texts))]
docsearch = Pinecone.from_texts(
texts,
embedding_openai,
index_name=index_name,
metadatas=metadatas,
namespace=namespace_name,
)
github.com/langchain-ai/langchain/discussions/10063
¡Gracias por el apoyo y el mensaje!
Una duda. Cómo haces la equivalencia entre embeddings-dimensiones para que cuadren los embeddings generados con las dimensiones que acepta pinecone. Desde la consola si agrego 300 y acepta 400 me lanza error
Vi que le comenteaste a otra persona, leí enlace y me quedó claro
¡Espectacular! Es bueno saber que los comentarios tambien sirven como una valiosa fuente de ayuda y conocimiento.
Gracias @nechu excelente conocimiento, enseñanza y contenido. 100% recomendado
¡Muchas gracias! Espero que disfrutes y aprendas mucho con el resto de vídeos
Que genial. .! Espero el video de Chroma en. Buen contenido.
Aquí tienes el nuevo vídeo con ChromaDB: ruclips.net/video/udexkMXDX2U/видео.html
¡Gracias por el apoyo!
Gracias por tus vídeos!
Has probado a usar pgvector de postgres para guardar los datos?
He utilizado Pinecone y ChromaDB ruclips.net/video/udexkMXDX2U/видео.html Otro base de datos vectorial que quiero probar es Weaviate pero pgvector aún no lo he trabajado ¿la recomiendas?
¡Gracias por el apoyo!
nechu, me salio un error en el notebook que aun no entiendo como resolver, tu me puede ayudar? por favor
AttributeError: type object 'Pinecone' has no attribute 'from_documents'
Yo tengo el mismo problema y tampoco encuentro la solución. Ayuda!!!!
La librería Pinecone ha realizado unas actualizaciones del código. Para que todo siga funcionando como en el vídeo, a la hora de instalar especifica la versión de Pinecone que quieres. En este caso escribimos lo siguiente: pinecone-client==2.2.4
He lanzado el notebook entero y ha funcionado sin problema.
@@NechuBM Un par de detalles pues en la ultima version de pinecone dashboard al crear la api_key no muestra el enviroment y al ejecutar la lsita pinecone.list_indexes() se muestra en vacio.
@@ErickAguilar-ow7qp Para encontrar el environment solo tienes que ir a la pestaña indices en el portal web. Una vez ahí bajo el nombre del índice te indica la región.
Si te devuelve una lista vacía al ejecutar pinecone.list_indexes() significa que el código ha funcionado pero no tienes ningún índice creado, comprueba esto último y vuelve a ejecutar el código.
@@NechuBM Estaba haciendo las pruebas actualizando la región de aws(que por lo visto coincide con el env9iroment) y lo supera sin problemas , se verifico el index "taller" previamente creado en el dashboard pero al correr el codigo pinecone.list_indexes() muestra el siguiene error, a que crees que se deba ?
WARNING:urllib3.connectionpool:Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NameResolutionError(": Failed to resolve 'controller.us-east-1.pinecone.io' ([Errno -2] Name or service not known)")': /databases
WARNING:urllib3.connectionpool:Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NameResolutionError(": Failed to resolve 'controller.us-east-1.pinecone.io' ([Errno -2] Name or service not known)")': /databases
WARNING:urllib3.connectionpool:Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NameResolutionError(": Failed to resolve 'controller.us-east-1.pinecone.io' ([Errno -2] Name or service not known)")': /databases
---------------------------------------------------------------------------
gaierror Traceback (most recent call last)
/usr/local/lib/python3.10/dist-packages/urllib3/connection.py in _new_conn(self)
202 try:
--> 203 sock = connection.create_connection(
204 (self._dns_host, self.port),
25 frames
gaierror: [Errno -2] Name or service not known
The above exception was the direct cause of the following exception:
NameResolutionError Traceback (most recent call last)
NameResolutionError: : Failed to resolve 'controller.us-east-1.pinecone.io' ([Errno -2] Name or service not known)
The above exception was the direct cause of the following exception:
MaxRetryError Traceback (most recent call last)
/usr/local/lib/python3.10/dist-packages/urllib3/util/retry.py in increment(self, method, url, response, error, _pool, _stacktrace)
513 if new_retry.is_exhausted():
514 reason = error or ResponseError(cause)
--> 515 raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type]
516
517 log.debug("Incremented Retry for (url='%s'): %r", url, new_retry)
MaxRetryError: HTTPSConnectionPool(host='controller.us-east-1.pinecone.io', port=443): Max retries exceeded with url: /databases (Caused by NameResolutionError(": Failed to resolve 'controller.us-east-1.pinecone.io' ([Errno -2] Name or service not known)"))
Hola, muchas gracias por la explicación y el conocimiento impartido es de gran ayuda, quería saber si es posible guardar el contexto o historial de la conversación, con el fin de realizar preguntas y tener una mejor interacción y no volver a escribir las preguntas completas.
¡Gracias por tu comentario! ¿Te refieres a guardar un historial de preguntas y respuestas para poder revisarlas más tarde, o te gustaría tener la capacidad de continuar una conversación de manera dinámica, construyendo a partir de respuestas anteriores sin tener que repetir el contexto cada vez? Ambas opciones son posibles, pero funcionan de maneras diferentes.
Hola Nechu,
Una consulta esta linea de codigo al ejecutarla me deberia regresar un resultado vstore.similarity_search(pregunta, 3) en caso de estar en el documento caso contrario enviaria [ ]. Observo que aunque tenga la base de datos de Pinecone vacia siempre responde las preguntas que haga.
Aunque tenga datos en la Pinecone siempre vstore.similarity_search(pregunta, 3) devuelve vacio [ ]
Para entender mejor por qué responde a la pregunta sin pasar contexto adicional es bueno analizar el prompt que le enviamos al modelo cuando utilizamos LangChain. Lo puedes encontrar en este enlace: github.com/langchain-ai/langchain/blob/master/libs/langchain/langchain/chains/retrieval_qa/prompt.py
Ocurre que, aunque no le pasemos contexto, el modelo intenta responder con el conocimiento que tiene.
Si para tu caso de uso realmente quieres que esto no ocurra lo mejor es cambiar el prompt base que utiliza LangChain. Para hacer esto aquí tienes un ejemplo con código: github.com/langchain-ai/langchain/discussions/9818
Por otro lado el funcionamiento actual de vstore.similarity_search(pregunta, 3) es el de devolver los N vectores más similares. Para Pinecone o Chroma no existe un límite de similitud a partir de cual deje de devolver resultados. Aunque la puntuación de similitud sea muy baja seguirá devolviendo los N más similares.
Por lo tanto, si no te devuelve ningún resultado, comprueba que tienes todo bien configurado.
Con la librería FAISS si puedes utilizar el parámetro score_threshold para limitar los resultados a partir de cierto valor de similitud.
Gracias@@NechuBM
Lo que en realidad quiero es que las respuestas sean concretamente del archivo u archivos pdf que se suban a la base de datos.
@@donaldmontoya1491 Pues entonces el enlace que compartí anteriormente es donde encontraras la solución: github.com/langchain-ai/langchain/discussions/9818
Modifica el prompt base para que solo responda en caso de que la información esté en el contexto que le compartes con la pregunta.
Gracias@@NechuBM
Hola, excelente enseñanza, en el video anterior: preguntaPDF | Pregunta a tu PDF con ChatGPT y Langchain - Tutorial, no empleas pinecone y funciona para pdf largos, cuentame el valor agragado de pinecone(es pago). Saludos
La diferencia no tiene que ver con el tamaño de los documentos, ambos trabajan con documentos grandes. La diferencia es que en el primer vídeo cada vez que accedas a la plataforma tienes que subir el documento (incluso cuando refrescas la página).
Gracias a Pinecone almacenas los vectores independientemente de la aplicación y por lo tanto podrás acceder de nuevo al documento sin tener que volver a procesarlo y desde cualquier lugar.
Imagínate que estás haciendo un trabajo para la universidad, ¿te pones a escribir en Word y cuando termines que haces? ¿Lo guardas para poder acceder más tarde o sales sin guardar y lo vuelves a escribir después?
En el taller no tenemos que pagar por utilizar Pinecone ya que con la capa gratuita es suficiente. De todos modos, en los próximos días veremos una alternativa open-source y gratuita que se llama ChromaDB, stay tunned.
@@NechuBM gracias!
@@adalbot Para eso estamos
Aquí tienes una alternativa a Pinecone, una base de datos de código abierto y 'gratuita', ChromaDB: ruclips.net/video/udexkMXDX2U/видео.html
Nechu, porque razon será que no puedo ver el contenido de los vectores dentro de la consola de Pinecone.
En Vector Count tengo 7 pero no puedo visualizar su contenido como tu los muestras en el video. Será que tengo que actualizarme a pago?
He realizado el ejercicio varias veces borrando el contenido del index (taller) y vuelto a cargar pero sigo sin poder visualizarlos (en VECTOR COUNT tengo 7) en la consola de Pinecone, será por esa misma razon que no obtengo datos con vstore.similarity_search(pregunta, 3).
Gracias de antemano por tu amabilidad de responder
si, algunas de las funciones ya no están disponibles para la versión gratis de pinecone, eso aparece en los mensajes de error, pero parece que no afecta en el proceso completo
Gracias @@rubenev
Acabo de ejecutar el código tal cual está en el notebook y no me da ninguno de los problemas que explicas. Al acceder al portal de Pinecone se muestran los vectores que añadí y tengo la versión gratuita. Por lo tanto, parece que la causa del problema es otra.
Comprueba las siguientes opciones:
• Que has pinchado en la pestaña de Indexes y no de Collections en el portal de Pinecone.
• No estas utilizando ningún ‘Namespaces’. En el portal selecciona el índice y comprueba el número de namespaces (normalmente solo 1, el Default)
• Es el índice y la cuenta correctos, cuando probamos con varias cuentas podemos acabar liándonos.
¡Feliz año nuevo @donaldmontoya1491 @rubenev!
Gracias @@NechuBM
No se que habra sucedido pero hoy entre a Pinecone y puedo visualizar los vectores sin haber realizado nada.
Igualmente para ti @NechuBM que tengas un año lleno de salud y exitos en todo lo que hagas. Feliz y Prospero año 2024, Dios este contigo😇
¡Muchas gracias@@donaldmontoya1491! A disfrutar de la programación
Hola Nechu, muchas gracias por tu video. Te quiero pedir un favor, no me queda claro cómo calcular el tamaño de los chunks y overlaps. Tú lo tieness en 800 y 100 caracteres. Pero estos valores tienen alguna explicación o forma de calcular? Mi índice de Pinecone tiene dimesiones de 1536 y el tuyo es de 384. Significa que mis chunks pueden ser de 3200 con 400 de overlap?
La dimensión de los vectores de embedding y el tamaño del chunk no están directamente relacionados.
El tamaño de los vectores de embedding determina el número de dimensiones que tendrá el vector. Cuanto mayor sea el número de dimensiónes, en general, mayor será la calidad del embedding, ya que el vector contendrá más información. Sin embargo, los modelos que generan vectores más grandes requieren más procesamiento y potencia de cómputo, lo que los hace más costosos. Por lo tanto, debes evaluar si el costo de generar vectores de mayores dimensiones está justificado por el beneficio que aportan.
Por otro lado, están los chunks, que representan la forma en que dividimos el texto. Esto variará según el tipo de documentos con los que estemos trabajando, pueden ser documentos legales, recetas, facturas, etc. Cada tipo de documento tendrá una estructura diferente y, por lo tanto, un tamaño de chunk diferente. El objetivo del chunk es dividir el documento en partes coherentes, por ejemplo, si estás trabajando con recetas de cocina, querrás que los ingredientes y las instrucciones de preparación estén en el mismo chunk para evitar mezclarlos con otros ingredientes de diferentes recetas.
Aquí tienes un artículo donde explican en detalle cómo definir el tamaño de los chunks: www.pinecone.io/learn/chunking-strategies/
Queria enviar las repuesta a washap, existe alguna alternativa libre para python, distinto a meta, twilio, como baileys que usan en java?...o se podria implementar baileys con python?
Puedes probar la librería pywhatkit para enviar mensajes a What’s App con Python. Si quieres crear un bot automatizado con notificación te recomiendo explorar Telegram o Discord, permiten una integración más sencilla para este tipo de desarrollos.
En pinecone no dan ya la variable environment desde API Keys, agradezco ayuda
En el minuto 8:56 la interface de api Key no es igual, por tanto la función de conexión tampoco, me encanta el vídeo pero estoy atrancado ahí. Muchas gracias
En la nueva versión de Pinecone ya no hace falta la variable environment. Puedes utilizar el siguiente código para conectarte:
from pinecone.grpc import PineconeGRPC as Pinecone
from pinecone import ServerlessSpec
pc = Pinecone(api_key='YOUR_API_KEY')
Y luego al crear el índice indicas la región y la nube que quieres utilizar:
pc.create_index(
name=index_name,
dimension=2,
metric="cosine",
spec=ServerlessSpec(
cloud='aws',
region='us-east-1'
)
)
Estoy preparando un notebook actualizado para la nueva versión de Pinecone, lo compartiré próximamente.
Aquí tienes un notebook con la nueva versión de Pinecone: colab.research.google.com/drive/18TA2N2_85RDlK9sSJNBVwElm8duPHg0M
Y como se haria n lugar de texto con audio?
Funciona de manera similar a como lo harías con texto. En lugar de utilizar un modelo que convierte texto a vectores/embeddings, necesitas uno que procese audio y lo transforme en vectores/embeddings. Un buen ejemplo es el modelo facebook/wav2vec2-base, que puedes encontrar en Hugging Face. Este modelo convierte grabaciones de voz en vectores/embeddings, lo que permite trabajar con el audio de la misma manera que vemos en el vídeo.
Hola, me parece muy interesante tu video y entiendo la lógica de lo que haces. Pero la verdad no se por donde empezar y es la primera vez que veo esto de los notebooks, tienes algún video tutorial de cómo usar los notebooks que compartes? He visto tus videos y no encuentro nada. Disculpa si es algo muy básico pero me gustaría aprender y entender . gracias
Claro, aquí te dejo algunos enlaces para que entiendas cómo funcionan los notebooks, una herramienta muy útil en programación. Si tienes alguna pregunta, no dudes en dejarla en los comentarios:
ruclips.net/video/uiF8mzvzi74/видео.html
ruclips.net/video/UeQdaqqdogE/видео.html
Geniallll!!!!! Podria hacer lo mismo pero con otra IA por ejemplo de Hughing Face?? Necesito hacer eso mismo con algo open source o que sea mas económico
¡¡Gracias!! Claro, puedes reemplazar ChatGPT con modelos Open-Source, te comparto varias alternativas que te pueden interesar:
Despliegue local: ruclips.net/video/tCFDPW2ctgI/видео.html
Despliegue en HuggingFace: ruclips.net/video/kp-UCfxTEoY/видео.html
Despliegue en AWS Sagemaker: ruclips.net/video/hnm4UhieqcU/видео.html
¿Esto tambien limita a contestar solo con los PDFs? , es decir , si le pregunto que es SQL contestará la pregunta o me dira que no tiene informacion , Buen video.
He probado con preguntas genéricas y si son muy genéricas si responde. Cuando preguntas detalles más precisos o información más concreta es cuando responde que no tiene información suficiente en el contexto. Lo mejor es probar según tu caso de uso y analizar los resultados.
Tras este análisis si no estás del todo contento con los resultados de ChatGPT y realmente quieres que no te responda si no tiene información tienes dos opciones. Primero es cambiar el prompt para insistir a ChatGPT que si no aparece información en el contexto no responda.
La otra opción es analizar los resultados que devuelve la búsqueda de vectores similares y si los 3 vectores que devuelve no se parecen en nada a la pregunta devuelves una respuesta del estilo ‘no tengo información suficiente’ sin ni siquiera pasárselo a ChatGPT.
Excelente video. Pregunta se puede usar pinecone como memoria ?
¡Muchas gracias! ¿A qué te refieres con memoria?
Pinecone es una base de datos vectorial y funciona como componente externo al modelo. Podemos utilizarlo, como hemos visto en el vídeo, para crear una ‘memoria’ de documentos a los que acceder cuando realizamos una pregunta.
Excelente!!! Pienso que seria útil saber que de documento pdf extrae la respuesta.
Siii, los tienes en la descripción del vídeo. Adicionalmente los añado aquí:
Málaga CF: preguntapdf.s3.eu-south-2.amazonaws.com/la-rosaleda_v3.pdf
Guía México: preguntapdf.s3.eu-south-2.amazonaws.com/GuiaViajeMexicoDF.pdf
Hola, muy buen tutorial. Gracias!
¡Muchas gracias!
Muy bueno, podrías explicar el mismo código pero utilizando otro LLM ? (no chatGPT)
Si quieres utilizar otro LLM en local o la nube te recomiendo este vídeo donde explico como hacerlo: ruclips.net/video/tCFDPW2ctgI/видео.html
Solo quedaría cambiar la petición a ChatGPT por la llamada a tu LLM en local o la nube como veras en el enlace.
El código queda así (utilizando el modelo flan-t5-large de google):
from langchain.llms import HuggingFaceHub
llm=HuggingFaceHub(repo_id="google/flan-t5-large", model_kwargs={"temperature":0.7, "max_length":512})
chain = load_qa_chain(llm, chain_type="stuff")
Podrías hacer algo similar con open source, por ejemplo usando llama 2? Desde ya gracias.
Sí, solo necesitas cambiar las líneas de código donde llamamos a ChatGPT por el modelo que te interese. Si quieres probar la librería Transformers de HugginFace con Llama2 quedaría algo así:
from transformers import pipeline
pipe = pipeline("text-generation", model="meta-llama/Llama-2-7b-chat-hf")
1:38 xd dislexia jajaja
Excelente video pero necesito ayuda con la ultima versión de Pinecone, al dia de hoy ha cambiado mucho
Aquí tienes un enlace al notebook con la versión actualizada: colab.research.google.com/drive/18TA2N2_85RDlK9sSJNBVwElm8duPHg0M
@@NechuBM Gracias pero ahora me sale este error: RateLimitError Traceback (most recent call last)
in ()
2 docs = vstore.similarity_search(pregunta, 3)
3 # Utilizar los parrafos similares para darle contexto a ChatGPT
----> 4 respuesta = chain.run(input_documents=docs, question=pregunta)
5 print(f"Respuesta ChatGPT: {respuesta}")
28 frames
/usr/local/lib/python3.10/dist-packages/openai/_base_client.py in _request(self, cast_to, options, remaining_retries, stream, stream_cls)
1039
1040 log.debug("Re-raising status error")
-> 1041 raise self._make_status_error_from_response(err.response) from None
1042
1043 return self._process_response(
RateLimitError: Error code: 429 - {'error': {'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: platform.openai.com/docs/guides/error-codes/api-errors.', 'type': 'insufficient_quota', 'param': None, 'code': 'insufficient_quota'}}
Tengo la versión gratuita de chatGPT
Muy buen vídeo, pero Pinecone parece que cambio mucho y ya no funciona igual. :(
Igual me sirvió mucho!
Si, Pinecone ha estado realizando unos cambios en su API y cómo conectarnos a sus servicios. Estoy preparando un notebook actualizado que funcione para la nueva versión.
Aquí tienes un notebook con la nueva versión de Pinecone: colab.research.google.com/drive/18TA2N2_85RDlK9sSJNBVwElm8duPHg0M
Podrias compartirnos el código actualizado pero con streamlot, sería genial, ya que no he podido implementarlo@@NechuBM
Cuando ejecuto la siguiente parte: collection_description = pinecone.describe_collection(INDEX_NAME)
Me sale el siguiente error:
---------------------------------------------------------------------------
NotFoundException Traceback (most recent call last)
in ()
----> 1 collection_description = pinecone.describe_collection(INDEX_NAME)
9 frames
/usr/local/lib/python3.10/dist-packages/pinecone/core/client/rest.py in request(self, method, url, query_params, headers, body, post_params, _preload_content, _request_timeout)
223
224 if r.status == 404:
--> 225 raise NotFoundException(http_resp=r)
226
227 if 500
EDIT 02/01/2024: Revisando mejor el código he cambiado unas líneas del notebook. Lo importante es hacer un describe del Index y no de collection.
Una collection es una copia de seguridad del Index. Como no hemos creado ninguna nos da un 404 NotFound, a mi si me funciona porque la tenía creada de antes.
Comentario Anterior:
Sin replicar el error en mi ordenador es difícil dar con la solución, pero diría que puede ocurrir por dos motivos:
• No has creado el índice en la plataforma de Pinecone con el nombre ‘taller’ y por eso no lo encuentra cuando intenta describirlo. Recuerda que INDEX_NAME=’taller’. Comprueba que has cambiado los valores de PINECONE_API_KEY y PINECONE_ENV por los tuyos
• Simplemente hubo un error puntual de conexión al realizar la petición y si vuelves a probar te funcionará.
@@NechuBM el texto dice: The requested feature 'Collections' is not supported by the current index type 'Starter'. esto es porque la cuenta es gratis? o como poner un type diferente al 'starter'?
@@rubenev Acabo de ejecutar el código y no me devuelve ese error. La versión de la librería de Pinecone en Python que estoy utilizando es la 2.2.4
En cualquier caso, lo importante no es un describe de la collection si no del índice. He cambiado el código en el notebook.
Revisando mejor el código he cambiado unas líneas del notebook. Lo importante es hacer un describe del Index y no de collection.
Una collection es una copia de seguridad del Index. Como no hemos creado ninguna nos da un 404 NotFound, a mi si me funciona porque la tenía creada de antes.
@@NechuBM Hola!, de hecho lo estoy tratando de ejecutar desde una pc, y me aparece el error de : pip install sentence-transformers porque esta librería tiene conflictos, pero no me dice donde, entonces la instalación recorre las versiones, pero no encuentra ninguna compatible "INFO: pip is looking at multiple versions of sentence-transformers to determine which version is compatible with other requirements."
Gracias Nechu, te cuento que no logro resolver el siguiente error cuando ejecuto la linea pinecone.list_indexes(), WARNING:urllib3.connectionpool:Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NameResolutionError(": Failed to resolve 'controller.svc.aped-4627-b74a.pinecone.io.pinecone.io' ([Errno -2] Name or service not known)")': /databases
WARNING:urllib3.connectionpool:Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NameResolutionError(": Failed to resolve 'controller.svc.aped-4627-b74a.pinecone.io.pinecone.io' ([Errno -2] Name or service not known)")': /databases
WARNING:urllib3.connectionpool:Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NameResolutionError(": Failed to resolve 'controller.svc.aped-4627-b74a.pinecone.io.pinecone.io' ([Errno -2] Name or service not known)")': /databases
---------------------------------------------------------------------------
gaierror Traceback (most recent call last)
/usr/local/lib/python3.10/dist-packages/urllib3/connection.py in _new_conn(self)
202 try:
--> 203 sock = connection.create_connection(
204 (self._dns_host, self.port),
25 frames
gaierror: [Errno -2] Name or service not known
The above exception was the direct cause of the following exception:
NameResolutionError Traceback (most recent call last)
NameResolutionError: : Failed to resolve 'controller.svc.aped-4627-b74a.pinecone.io.pinecone.io' ([Errno -2] Name or service not known)
The above exception was the direct cause of the following exception:
MaxRetryError Traceback (most recent call last)
/usr/local/lib/python3.10/dist-packages/urllib3/util/retry.py in increment(self, method, url, response, error, _pool, _stacktrace)
513 if new_retry.is_exhausted():
514 reason = error or ResponseError(cause)
--> 515 raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type]
516
517 log.debug("Incremented Retry for (url='%s'): %r", url, new_retry)
MaxRetryError: HTTPSConnectionPool(host='controller.svc.aped-4627-b74a.pinecone.io.pinecone.io', port=443): Max retries exceeded with url: /databases (Caused by NameResolutionError(": Failed to resolve 'controller.svc.aped-4627-b74a.pinecone.io.pinecone.io' ([Errno -2] Name or service not known)"))
Pd: el valor de PINECONE_ENV lo saque de REGION us-east-1
No parece ser un error relacionado con las variables de entorno. Te recomendaría revisar si tienes instaladas las mismas versiones de las bibliotecas que las que utilizamos en el tutorial. Si el error persiste y has realizado algún cambio, comparte el código para ver qué podría estar causando el problema.