Ein Upgrade für meinen aktuellen Chatbot
Ich habe meinen Chatbot Sydney aufgerüstet, um Weaviates Hybrid Search und Query Structuring zu testen – Funktionen, die ich benötige, um meinen Financial Chatbot auf 500+ Unternehmen zu skalieren.
Update (2026): Sydney hat sich seit diesem Weaviate-Experiment stark weiterentwickelt. Nach Tests mit FAISS, Weaviate und anderen habe ich mich für Supabase pgvector in der Produktionsversion entschieden. Sydney läuft jetzt auf Claude mit Streaming-Antworten und Tool Use. Die unten beschriebenen Ideen zu Hybrid Search und Query Structuring haben direkt beeinflusst, wie Sydney heute funktioniert.
Der ursprüngliche Beitrag vom Mai 2024 ist unten zur Orientierung erhalten.
Wie in meinem letzten Beitrag erwähnt, arbeite ich an einem selbst-evaluierenden Financial Chatbot. Warum also der Umweg, den aktuellen Chatbot Sydney upzugraden? Nun, aus einigen Gründen:
- Weaviate Vector Store von Anfang bis Ende testen:
- Ich versuche, Weaviate als den hauptsächlichen Vector Store für den Financial Chatbot zu verwenden, stoße aber auf das Problem der Skalierung/Speichergröße. Konkret: Allein mit den 10-jährigen 10K- und 10Q-Einreichungen für etwa 20 Unternehmen beträgt die Größe der Weaviate Collection bereits 2 GB. Bei der aktuellen Vorgehensweise würden also alle S&P 500-Unternehmen eine Collection von über 50 GB bedeuten. Das ist viel zu groß und würde sehr viel Geld kosten, um es zu betreiben/zu pflegen. Daher versuche ich, verschiedene Product Quantization (PQ)-Parameter zu testen.
- Nach dem Ausprobieren vieler anderer Vector Stores tendiere ich zu Weaviate, weil es in der Lage ist, Hybrid Search mit Metadaten-Filtern bei hoher Geschwindigkeit durchzuführen.
- Während ich an PQ für Weaviate arbeitete, fragte ich mich, wie Weaviate in einer Produktionsumgebung eingesetzt werden kann, also Weaviate Cloud oder über AWS/Google Cloud. Wird die Bereitstellung schwierig sein? Wie viel wird es kosten?
- Aufgrund dieser Fragen beschloss ich, Weaviate für den aktuellen Chatbot Sydney einzusetzen. Im Grunde werde ich FAISS durch Weaviate ersetzen.
- Für die aktuelle Version verwende ich Weaviate Cloud
- Query Translation und Query Structuring implementieren und dabei sicherstellen, dass die Ausgabe im JSON-Format erfolgt, damit sie weiterverwendet werden kann.
- Mit Query Translation ist das Ziel, die Eingabe in eine Reihe spezifischer Teilprobleme oder Teilfragen aufzuteilen, die isoliert beantwortet werden können.
- Mit Query Structuring: Mir ist es sehr wichtig, nicht nur einen geeigneten Suchbegriff/Suchphrasen für die Hybrid Search zu generieren, sondern auch geeignete Metadaten für die Filterung.
- Das ist besonders wichtig, weil ich möchte, dass der Financial Chatbot bei Bedarf korrekt nach Jahr, Branche usw. filtert.
- Wie man Hybrid Search mit mehreren Filtern durchführt und dabei nicht nur den Inhalt, sondern auch die Metadaten zurückgibt.
Wie du siehst, brauche ich all das oben Genannte, damit der Financial Chatbot funktioniert – warum also nicht versuchen, das zunächst in einem viel kleineren Maßstab beim Chatbot Sydney anzuwenden? :)
Ich freue mich sagen zu können, dass du Sydney jetzt ausprobieren kannst. Es verfügt über alle oben genannten Funktionen. Du kannst Fragen wie die folgenden stellen, und der Chatbot sollte relevante Antworten mit Links zu bestimmten Blogbeiträgen zurückgeben, aus denen er den Inhalt bezieht.
- What did chandler write about Kevin Rudd in 2020?
- Tell me everything that Chandler wrote about Ray Dalio between 2020 until now
- what did chandler write about Health Savings Accounts in 2022?
- What did chandler do in 2015?
Das war's für jetzt. Ich muss zurück und am Financial Chatbot weiterarbeiten :P
Falls du mit Weaviate oder Hybrid Search mit Metadaten-Filtern experimentiert hast, würde ich gerne hören, was bei dir funktioniert hat.
Viele Grüße,
Chandler
Update Sep 2024
Sydney ist jetzt ein vielseitiger Agent, der in der Lage ist:
- Fragen über die aktuellen S&P 500-Unternehmen zu beantworten, einschließlich dessen, was sie in den letzten 10 Jahren bei der SEC eingereicht haben.
- Einblicke aus meinen 15 Jahren Blog-Inhalten zu liefern.
Schau es dir hier an.
P.S: Unten sind Beispiele für die Art von Prompts, die ich für Query Translation und Query Structuring verwende.
"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: Ich weiß, dass das Frontend immer noch sehr langsam ist, also muss ich wahrscheinlich mehr über Frontend-Entwicklung lernen.





