Um upgrade no meu chatbot atual
Atualizei meu chatbot Sydney para testar a busca híbrida e a estruturação de consultas do Weaviate — recursos que preciso para escalar meu chatbot financeiro para mais de 500 empresas.
Atualização (2026): Sydney evoluiu muito desde este experimento com Weaviate. Depois de testar FAISS, Weaviate e outros, me decidi pelo Supabase pgvector para a versão de produção. Sydney agora roda no Claude com respostas em streaming e uso de ferramentas. As ideias de busca híbrida e estruturação de consultas abaixo influenciaram diretamente como Sydney funciona hoje.
Post original de maio de 2024 preservado abaixo para contexto.
Como mencionado no meu último post, estou trabalhando em um Chatbot Financeiro com auto-avaliação. Então por que esse desvio para atualizar o chatbot atual Sydney? Bem, alguns motivos:
- Testar o vector store Weaviate de ponta a ponta:
- Estou tentando usar o Weaviate como o vector store principal para o chatbot financeiro, mas estou me deparando com o problema de escala/tamanho de memória. Especificamente, com apenas os últimos 10 anos de documentos 10K e 10Q para cerca de 20 empresas, o tamanho da coleção do Weaviate já é de 2 GB. Então, com a abordagem atual, as empresas do S&P 500 inteiro significariam uma coleção de cerca de 50+ GB. É muito grande e custará muito dinheiro para executar/manter. Então estou tentando testar diferentes parâmetros de Quantização de Produto (PQ).
- Depois de experimentar muitos outros vector stores, estou inclinado para o Weaviate por sua capacidade de conduzir busca híbrida com filtros de metadados em velocidades rápidas.
- Enquanto trabalhava no PQ para o Weaviate, uma pergunta que tinha era como fazer o deploy do Weaviate em um ambiente de produção, ou seja, Weaviate Cloud ou usando AWS/Google Cloud? Será difícil fazer o deploy? Quanto dinheiro custará?
- Por causa dessas questões, decidi fazer o deploy do Weaviate para o chatbot atual Sydney. Basicamente, substituirei o FAISS pelo Weaviate.
- Para a versão atual, estou usando o Weaviate Cloud
- Implementar tradução de consultas e estruturação de consultas, garantindo que o output esteja em JSON para que possam ser usados.
- Com tradução de consultas, o objetivo é dividir a entrada em um conjunto de sub-problemas ou sub-questões específicas que podem ser respondidas isoladamente.
- Com estruturação de consultas: me importo muito em gerar não apenas um termo/frases de busca adequados para busca híbrida, mas também metadados adequados para filtragem.
- Isso é super importante porque quero que o chatbot financeiro filtre corretamente por ano, setor, etc., conforme necessário.
- Como conduzir busca híbrida com múltiplos filtros e retornar não apenas o conteúdo, mas também os metadados.
Como você pode ver, preciso que tudo isso acima funcione para criar o chatbot financeiro, então por que não tentar aplicar isso em uma escala muito menor no chatbot Sydney primeiro :)
Fico feliz em dizer que você pode experimentar Sydney agora. Ela tem todas as funcionalidades acima. Você pode tentar fazer perguntas como as abaixo e o chatbot deve retornar respostas relevantes com links para posts específicos do blog de onde obtém o conteúdo.
- O que chandler escreveu sobre Kevin Rudd em 2020?
- Me diga tudo que Chandler escreveu sobre Ray Dalio entre 2020 até agora
- O que chandler escreveu sobre Health Savings Accounts em 2022?
- O que chandler fez em 2015?
É isso por agora. Preciso voltar a trabalhar no chatbot financeiro :P
Se você experimentou o Weaviate ou busca híbrida com filtros de metadados, adoraria ouvir o que funcionou para você.
Abraços,
Chandler
Atualização setembro de 2024
Sydney agora é um agente multi-talentoso capaz de:
- Responder perguntas sobre as atuais empresas do S&P 500, incluindo o que elas enviaram à SEC nos últimos 10 anos.
- Fornecer insights dos meus 15 anos de conteúdo de blog.
Confira aqui.
P.S: Abaixo estão exemplos do tipo de prompt que estou usando para tradução de consultas e estruturação 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.S: Sei que o frontend ainda está muito lento, então provavelmente preciso aprender mais sobre desenvolvimento frontend.





