Una mejora para mi chatbot actual
Actualicé mi chatbot Sydney para probar la búsqueda híbrida de Weaviate y la estructuración de consultas — funciones que necesito para escalar mi chatbot financiero a más de 500 empresas.
Actualización (2026): Sydney ha recorrido un largo camino desde este experimento con Weaviate. Después de probar FAISS, Weaviate y otros, me decidí por Supabase pgvector para la versión de producción. Sydney ahora funciona con Claude con respuestas en streaming y uso de herramientas. Las ideas de búsqueda híbrida y estructuración de consultas que se describen a continuación influyeron directamente en cómo funciona Sydney hoy.
La publicación original de mayo de 2024 se conserva a continuación para contexto.
Como mencioné en mi última publicación, estoy trabajando en un Chatbot Financiero Auto-evaluable. Entonces, ¿por qué el desvío para actualizar el chatbot actual Sydney? Bueno, algunas razones:
- Probar el vector store de Weaviate de principio a fin:
- Estoy intentando usar Weaviate como el vector store principal para el chatbot financiero pero me estoy encontrando con el problema de escala/tamaño de memoria. Específicamente, con solo los últimos 10 años de archivos 10K y 10Q para unas 20 empresas, el tamaño de la colección de Weaviate ya es de 2 GB. Así que con el enfoque actual, las empresas del S&P 500 completo significarían una colección de unos 50+ GB. Es demasiado grande y costará mucho dinero ejecutarlo/mantenerlo. Así que estoy intentando probar diferentes parámetros de Product Quantization (PQ).
- Después de probar muchos otros vector stores, me estoy inclinando hacia Weaviate por su capacidad de realizar búsqueda híbrida con filtros de metadatos a velocidades rápidas.
- Mientras trabajaba en PQ para Weaviate, una pregunta que tenía era cómo desplegar Weaviate en un entorno de producción, es decir, ¿Weaviate Cloud o usando AWS/Google Cloud? ¿Será difícil de desplegar? ¿Cuánto costará?
- Debido a estas preguntas, decidí desplegar Weaviate para el chatbot actual Sydney. Básicamente reemplazaré FAISS con Weaviate.
- Para la versión actual, estoy usando Weaviate Cloud
- Implementar la traducción de consultas y la estructuración de consultas, asegurando que la salida esté en Json para que puedan usarse.
- Con la traducción de consultas, el objetivo es descomponer la entrada en un conjunto de sub-problemas o sub-preguntas específicas que se puedan responder de forma aislada.
- Con la estructuración de consultas: me importa mucho generar no solo un término/frases de búsqueda adecuados para la búsqueda híbrida sino también metadatos adecuados para el filtrado.
- Esto es súper importante porque quiero que el chatbot financiero filtre correctamente por año, industria, etc., cuando sea necesario.
- Cómo realizar búsqueda híbrida con múltiples filtros y devolver no solo el contenido sino también los metadatos.
Como puedes ver, necesito que todo lo anterior funcione para crear el chatbot financiero, así que ¿por qué no intentar aplicarlo a una escala mucho más pequeña en el chatbot Sydney primero? :)
Me alegra decir que ya puedes probar Sydney. Tiene todas las funcionalidades anteriores. Puedes intentar hacer preguntas como las siguientes y el chatbot debería devolver respuestas relevantes con enlaces a publicaciones específicas del blog de donde obtiene el contenido.
- ¿Qué escribió Chandler sobre Kevin Rudd en 2020?
- Cuéntame todo lo que Chandler escribió sobre Ray Dalio entre 2020 y ahora
- ¿Qué escribió Chandler sobre las Health Savings Accounts en 2022?
- ¿Qué hizo Chandler en 2015?
Eso es todo por ahora. Necesito volver a trabajar en el chatbot financiero :P
Si has experimentado con Weaviate o la búsqueda híbrida con filtros de metadatos, me encantaría saber qué te funcionó.
Un abrazo,
Chandler
Actualización septiembre 2024
Sydney ahora es un agente multitalento capaz de:
- Responder preguntas sobre las empresas actuales del S&P 500, incluyendo lo que han enviado a la SEC durante los últimos 10 años.
- Proporcionar perspectivas de mis 15 años de contenido del blog.
Échale un vistazo aquí.
P.D.: A continuación hay ejemplos del tipo de prompt que estoy usando para la traducción de consultas y la estructuración de consultas.
"You are a helpful assistant that generates multiple sub-questions related to an input question. "
"The current year is 2024."
"The goal is to break down the input into a set of specific sub-problems / sub-questions that can be answered in isolation. "
"Each specific sub-question will be used to retrieve relevant content from a vector store, using similarity search with score. "
"Phrase the wording of the questions appropriately for this purpose.\n"
"This vector store includes all of the published blog posts from Chandler Nguyen's blog from 2007 to 2024.\n\n"
"Original question: \{query\}\n\n"
"Generate the minimum number of sub-questions necessary to answer the original question. "
"Your response should be formatted as a JSON array of strings, where each string represents a sub-question. "
"Do not include any additional words, characters, or explanations in the response.\n\n"
"Example response:\n"
'[\n'
' "sub-question 1",\n'
' "sub-question 2"\n'
']'
"""You are a helpful assistant that generates a structured query related to an input question.
The goal is to break down the input into a structured query that can be used to retrieve relevant content from a vector store, using similarity search with score.
This vector store includes all of the published blog posts from Chandler Nguyen's blog from 2007 to 2024.
Original question: \{query\}
You must generate a response in JSON format as described below without any additional words or characters:
[
"content_search": Similarity search query used to apply to the content of the Chandler Nguyen published blog posts to find similar documents related to the sub-question(s). Ensure the content_search query is not too broad or too specific, and strikes a balance between relevance and completeness. \n
"start_date": optional field, the start date to search for blog posts that are relevant to the sub-question(s) in YYYY-MM-DD format. If the sub-question(s) do not specify a time frame, leave this field blank or set it to the earliest possible date (e.g., 2007-01-01) to cover a broader range. \n
"end_date": optional field, the end date to search for blog posts that are relevant to the sub-question(s) in YYYY-MM-DD format. If the sub-question(s) do not specify a time frame, leave this field blank or set it to the latest possible date (e.g., 2024-12-31) to cover a broader range. \n
]
If the sub-question(s) include multiple years or a specific time range, generate 1 response for each year or time range, enclosed in separate JSON objects within the outer array.
Example responses:
For an open-ended sub-question without a specific time frame:
Sub-questions: ["What are the key insights Chandler wrote about Health Savings Accounts (HSA)?"]
[
"content_search": "Chandler Nguyen blog posts about Health Savings Accounts",
"start_date": "2007-01-01",
"end_date": "2024-12-31"
]
For a sub-question specifying a year:
Sub-questions: ["What blog posts did Chandler write in 2018?", "Which blog posts written by Chandler in 2018 mention Kevin Rudd?"]
[
"content_search": "Chandler Nguyen blog posts in 2018",
"start_date": "2018-01-01",
"end_date": "2018-12-31"
],
[
"content_search": "Kevin Rudd mentioned in Chandler Nguyen blog posts in 2018",
"start_date": "2018-01-01",
"end_date": "2018-12-31"
]
For a sub-question specifying a time range:
Sub-questions: ["What did Chandler write about Ray Dalio in 2020?", "What did Chandler write about Ray Dalio in 2021?", "What did Chandler write about Ray Dalio in 2022?"]
[
"content_search": "Chandler Nguyen blog posts about Ray Dalio in 2020",
"start_date": "2020-01-01",
"end_date": "2020-12-31"
],
[
"content_search": "Chandler Nguyen blog posts about Ray Dalio in 2021",
"start_date": "2021-01-01",
"end_date": "2021-12-31"
],
[
"content_search": "Chandler Nguyen blog posts about Ray Dalio in 2022",
"start_date": "2022-01-01",
"end_date": "2022-12-31"
]
"""
P.P.D.: Sé que el frontend todavía es muy lento, así que probablemente necesite aprender más sobre desarrollo frontend.





