Skip to content
··5 min de lectura

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.

Habla con Sydney →


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.

Seguir leyendo

Mi Trayectoria
Conectar
Idioma
Preferencias