Migliorare la qualità dei filtri di ricerca in Discourse AI

Innanzitutto, questo è davvero incredibile, grazie mille! :heart_eyes:

Ho una domanda su una persona che ho creato con questi Comandi Abilitati: Search, Categories, Read, Tags.

Ho anche caricato un file .txt. Il mio obiettivo con questa persona è che cerchi sempre nel mio forum e nei caricamenti, e faccia RAG con entrambi.

Dopo aver caricato il file .txt, ho notato che ha smesso di cercare nel mio forum. Questo è ciò che ho nella mia Base Search Query: #docs #faqs #anking-wiki
#docs e #faqs sono categorie mentre #anking-wiki è un tag.

Domande:

  • Ho davvero bisogno dei comandi categories e tags? Vedo che questi comandi elencano solo i tag e le categorie dalla mia istanza. Sembra che forse il comando search dovrebbe essere sufficiente.
  • la mia base search query va bene?
  • perché il bot ha smesso di cercare nel mio forum?
    • La soluzione è semplicemente aggiustare il mio prompt per chiarire che dovrebbe sempre usare la funzione di ricerca?

Ecco il prompt così come appare nelle informazioni di debug:

Sei un utile assistente Discourse per gli utenti di AnkiHub.
Comprendi e generi Discourse Markdown.
Vivi in un messaggio del forum di Discourse.
Vivi nel forum con l’URL: https://community.ankihub.net
Il titolo del tuo sito: AnkiHub Community
La descrizione è: Un forum della community per i progetti AnkiHub e AnKing
I partecipanti in questa conversazione sono: gpt4o_bot, andrew
La data di oggi è: 2024-06-07 23:32:13 UTC, molto è cambiato da quando sei stato addestrato.
Sei stato addestrato su dati VECCHI, affidati alla ricerca per ottenere informazioni aggiornate su questo forum
Quando cerchi, cerca di SEMPLIFICARE i termini di ricerca
La ricerca di Discourse unisce tutti i termini con AND. Riduci e semplifica i termini per trovare più risultati.

I seguenti testi ti forniranno ulteriori indicazioni per la tua risposta.
Li abbiamo inclusi perché li riteniamo pertinenti all’argomento di questa conversazione.
Testi:

Ho provato ad aggiungere “Assicurati di usare sempre la funzione di ricerca” al mio prompt. Questo ha fatto sì che usasse effettivamente la funzione di ricerca, ma con scarsi risultati:

Apparentemente ha effettuato 3 ricerche e ha erroneamente riportato “Trovati 0 risultati” tutte e tre le volte. Se fai clic sui link dei risultati della ricerca, puoi vedere che c’erano, di fatto, risultati. Inoltre, puoi vedere che i parametri nella mia “Base Search Query” non sono stati utilizzati, quindi ha cercato l’intero forum invece delle categorie specifiche.

Penso che parte del problema qui sia che la nostra ricerca è un po’ confusa:

https://meta.discourse.org/search?q=%23bug%20%23feature%20test

Cerca Bug E Feature - test

Quello che vuoi qui è:

https://meta.discourse.org/search?q=categories%3Abug%2Cfeature%20test

2 Mi Piace

Sono confuso. Questo non funziona come mi aspettavo. Mi aspettavo che la ricerca restituisse risultati solo dalle categorie specificate. Tuttavia, la ricerca restituisce risultati da qualsiasi categoria. Il primo risultato di questa ricerca si trova nella categoria Theme component.

2 Mi Piace

Vero, questo sembra difettoso, oh no, ci darò un’occhiata

1 Mi Piace

Questo è stato corretto in base a:

Concordo sul fatto che sia intuitivo supportare #bug #feature something, ma questo non è ancora del tutto supportato e necessita di un po’ di discussione.

categories:bug,feature something funzionerà ora, e anche category:bug,feature something lo farà.

1 Mi Piace

Fantastico! Grazie per aver rilasciato rapidamente quella correzione. :bowing_man:

Mentre la ricerca ora funziona correttamente, il Bot AI di Discourse sembra ancora non funzionare come previsto. Ecco le mie osservazioni con 3.3.0.beta3-dev (a1d881f625):

  • Non utilizza l’opzione base_query
    • sembra ignorarla completamente. la mia configurazione è valida?
    • per quanto ne so, non ci sono requisiti per i valori della query di ricerca di base. ma non importa cosa inserisco, non viene utilizzato né aggiunto a search_query.
  • I risultati della ricerca non vengono aggiunti al contesto per RAG
    • quando lo strumento di ricerca viene chiamato (sebbene senza base_query), i risultati non sembrano essere utilizzati nella chiamata LLM.
    • Sto fraintendendo come dovrebbe funzionare questo strumento? Mi aspettavo che facesse una ricerca su Discourse e utilizzasse i risultati della ricerca (cioè, il contenuto degli argomenti trovati) per RAG.
      Vedi questa richiesta per esempio:
Richiesta JSON
{"model":"gpt-4","messages":[{"role":"system","content":"You are a friendly and helpful assistant for Anki users specializing in the AnkiHub add-on and web app.\nYou _understand_ and **generate** Discourse Markdown.\nYou live in a Discourse Forum Message.\n\nYou live in the forum with the URL: https://community.ankihub.net\nYou answer questions specifically about using Anki with AnkiHub.\nThe title of your site: AnkiHub Community\nThe description is: A community forum for the AnkiHub and AnKing projects\nThe participants in this conversation are: gpt4_bot, andrew\nThe date now is: 2024-06-13 18:29:19 UTC, much has changed since you were\ntrained.\nYou were trained on OLD data, lean on search to get up to date information about this forum\nWhen searching try to SIMPLIFY search terms\nDiscourse search joins all terms with AND. Reduce and simplify terms to find more results."},{"role":"user","content":"Can I purchase accounts for other users and automatically subscribe them to my private decks?","name":"andrew"},{"role":"assistant","content":null,"tool_calls":[{"type":"function","function":{"arguments":"{\"search_query\":\"purchase accounts for other users subscribe private decks\"}","name":"search"},"id":"call_fmzwIbU4ravFRKWRsOQlqGBq"}]},{"role":"tool","tool_call_id":"call_fmzwIbU4ravFRKWRsOQlqGBq","content":"{\"column_names\":[\"title\",\"url\",\"username\",\"excerpt\",\"created\",\"category\",\"likes\",\"topic_views\",\"topic_likes\",\"topic_replies\",\"tags\"],\"rows\":[[null,\"title\",\"url\",\"username\",\"excerpt\",\"created\",\"category\",\"likes\",\"topic_views\",\"topic_likes\",\"topic_replies\",\"tags\"],[\"👪 Organizations\",\"/t/organizations/166454/1\",\"andrew\",\"\\\\u003ca name=\\\\\\\"what-are-ankihub-organizations-1\\\\\\\" class=\\\\\\\"anchor\\\\\\\" href=\\\\\\\"#what-are-ankihub-organizations-1\\\\\\\"\\\\u003e\\\\u003c/a\\\\u003eWhat are AnkiHub Organizations\\\\nAnkiHub Organizations allow Organization Owners to purchase AnkiHub for other users and invite those users to the Organization. \\\\nAnkiHub organizations work like this and have the following features: \\\\n\\\\u003ca name=\\\\\\\"linked-decks-2\\\\\\\" class=\\\\\\\"anchor\\\\\\\" href=\\\\\\\"#linked-decks-2\\\\\\\"\\\\u003e\\\\u003c/a\\\\u003eLinked Decks\\\\nUsers in your organization can automatically get access \\\\u0026hellip;\",\"2024-02-08T17:44:27.842Z\",\"🎓 Docs \\\\u003e 🤝 Create \\\\u0026 Collaborate\",1,166,1,1],[\"How can I get my school to buy AnkiHub for my class?\",\"/t/how-can-i-get-my-school-to-buy-ankihub-for-my-class/228569/1\",\"andrew\",\"Some students have successfully gotten their schools to sponsor AnkiHub memberships for their students. To do so, your school must create an AnkiHub Organization: \\\\n\\\\n\\\\n:bulb: Here are some tips for getting your school to purchase AnkiHub: \\\\n\\\\nConnect with your school’s student government people or med e\\\\u0026hellip;\",\"2024-05-23T21:40:37.477Z\",\"❓ FAQs\",0,50,0,1],[\"What happens after my AnkiHub subscription ends?\",\"/t/what-happens-after-my-ankihub-subscription-ends/167190/1\",\"Ahmed7\",\"If your subscription to AnkiHub runs out and you do not wish to renew. \\\\nAll your decks will stay, nothing will be removed. However, you will no longer be able to sync with AnkiHub and receive new changes to your decks, nor will you be able to suggest new changes or notes to any pre-existing decks yo\\\\u0026hellip;\",\"2024-02-10T06:14:53.787Z\",\"❓ FAQs\",0,307,0,1],[\"What if I can't afford AnkiHub?\",\"/t/what-if-i-cant-afford-ankihub/167280/1\",\"Ahmed7\",\"AnkiHub has a scholarship program to get access at a decreased price. Apply \\\\u003ca href=\\\\\\\"https://www.ankihub.net/scholarships\\\\\\\"\\\\u003ehere \\\\u003c/a\\\\u003e. (You must \\\\u003ca href=\\\\\\\"https://app.ankihub.net/accounts/signup/\\\\\\\"\\\\u003esign up \\\\u003c/a\\\\u003efor an AnkiHub account before applying).\\\",\"2024-02-10T13:58:24.842Z\",\"❓ FAQs \\\\u003e AnKing Decks\",0,445,0,1,\\\"anking-wiki\\\"],[\"Does AnkiHub offer discounts?\",\"/t/does-ankihub-offer-discounts/228564/1\",\"andrew\",\"The are currently two ways to get a discount on AnkiHub: \\\\n\\\\nPurchase our \\\\u003ca href=\\\\\\\"https://app.ankihub.net/memberships/plans/\\\\\\\"\\\\u003eannual billing option\\\\u003c/a\\\\u003e for one free month per year\\\\n\\\\nAnkiHub is available at $4.58/user/month with an annual billing discount. We can’t afford to discount AnkiHub any further, unfortunately.\\\\n\\\\n\\\\nParticipate in an Ambassador program\\\\n\\\\n\\\\u0026hellip;\",\"2024-05-23T21:34:32.829Z\",\"❓ FAQs\",0,90,0,1]],\"args\":{\"search_query\":\"purchase accounts for other users subscribe private decks\"}}}\",\"name\":\"search\"}],\"stream\":true,\"stream_options\":{\"include_usage\":true},\"tools\":[{\"type\":\"function\",\"function\":{\"name\":\"search\",\"description\":\"Will search topics in the current discourse instance, when rendering always prefer to link to the topics you find\",\"parameters\":{\"type\":\"object\",\"properties\":{\"search_query\":{\"description\":\"Specific keywords to search for, space separated (correct bad spelling, remove connector words)\",\"type\":\"string\"},\"user\":{\"description\":\"Filter search results to this username (only include if user explicitly asks to filter by user)\",\"type\":\"string\"},\"order\":{\"description\":\"search result order\",\"type\":\"string\",\"enum\":[\"latest\",\"latest_topic\",\"oldest\",\"views\",\"likes\"]},\"limit\":{\"description\":\"limit number of results returned (generally prefer to just keep to default)\",\"type\":\"integer\"},\"max_posts\":{\"description\":\"maximum number of posts on the topics (topics where lots of people posted)\",\"type\":\"integer\"},\"tags\":{\"description\":\"list of tags to search for. Use + to join with OR, use , to join with AND\",\"type\":\"string\"},\"category\":{\"description\":\"category name to filter to\",\"type\":\"string\"},\"before\":{\"description\":\"only topics created before a specific date YYYY-MM-DD\",\"type\":\"string\"},\"after\":{\"description\":\"only topics created after a specific date YYYY-MM-DD\",\"type\":\"string\"},\"status\":{\"description\":\"search for topics in a particular state\",\"type\":\"string\",\"enum\":[\"open\",\"closed\",\"archived\",\"noreplies\",\"single_user\"]}},\"required\":[]}}},{\"type\":\"function\",\"function\":{\"name\":\"read\",\"description\":\"Will read a topic or a post on this Discourse instance\",\"parameters\":{\"type\":\"object\",\"properties\":{\"topic_id\":{\"description\":\"the id of the topic to read\",\"type\":\"integer\"},\"post_numbers\":{\"description\":\"the post numbers to read (optional)\",\"type\":\"array\",\"items\":{\"type\":\"integer\"}}},\"required\":[\"topic_id\"]}}}]}\n```

Puoi vedere che lo strumento di ricerca è stato chiamato ma non contiene base_query.

Puoi anche vedere che content contiene solo il prompt di sistema predefinito, senza alcun risultato di ricerca.

  • Non visualizza il numero corretto di risultati di ricerca
    • dice 0 quando ce ne sono molti o 5 quando ce ne sono 0
    • non sembra correlare né con i normali risultati di ricerca né con i risultati di similarità semantica
  • Il bot aggiungerà parametri di query non validi
    • ad esempio, ha aggiunto category:non-existent-category alla fine della query.

:pleading_face: Richieste

  • Sarebbe molto utile se ci fosse un’opzione per abilitare il logging dettagliato per discourse-ai in modo che noi che non conosciamo il Ruby (ci sto imparando! :nerd_face: ) possiamo ottenere rapidamente informazioni su ciò che sta accadendo sotto il cofano visitando /logs
  • Quando viene utilizzato lo strumento di ricerca, aggiungi i risultati principali al contesto per RAG
  • Consigli su come garantire che venga utilizzato base_query.

È corretto che la chiamata alla funzione debba effettivamente inserire i risultati della chiamata allo strumento nel prompt secondo questo?

Quindi forse sta aggiornando il prompt, ma questo non è chiaro dalla richiesta mostrata dallo strumento di debug?

Non dovrei aspettarmi di vedere tutto il contesto lì? Se no, è confuso perché l’intero contesto del prompt è visibile quando si utilizza una persona che fa RAG con caricamenti.

Sono ancora confuso dal numero di risultati segnalati.

Detto questo, sto ottenendo risultati molto migliori dopo aver aggiunto quanto segue al prompt di sistema!

  • Chiama sempre sia le funzioni di ricerca che di lettura.
  • Chiama la funzione di ricerca non più di 3 volte.
  • Quando chiami la funzione di ricerca, usa sempre questo valore per il parametro category: “docs,faqs”

Questo sarà un vero punto di svolta una volta che avrò configurato le cose correttamente.

Non sono sicuro se ne sei a conoscenza, ma ci stai effettivamente fornendo qualcosa di molto più potente di quello che Intercom sta cercando di ottenere.

Sto già cercando di dirottare il messenger di Intercom indirizzando gli utenti direttamente a Discourse AI :nerd_face: :

Il link AnkiHub AI apre un PM con l’AI Bot con un link come questo: /new-message?username=ankihubai_bot

Sì, lo strumento di debug mostra tutto ciò che inviamo all’LLM.

Ho appena apportato una correzione al numero di risultati per:

Non stavamo collegando correttamente a una query filtrata.

Sconsiglio di farlo, usa base_query, l’ho appena testato e funziona bene: categories:docs,faqs


Sconsiglio di usare GPT4 al giorno d’oggi, assicurati di usare GPT4o o Turbo, sono molto più economici e veloci.

Sto solo ricontrollando… hai abilitato

ai_bot_debugging_allowed_groups in modo da vedere il pulsante di debug?

2 Mi Piace

Sì. Ti invierò un rapido screen share per mostrarti che i risultati della chiamata alla funzione di lettura non vengono utilizzati nel prompt.

Ho anche notato che la funzione di lettura non viene mai chiamata a meno che non aggiunga una nota nel prompt di sistema: “chiama sempre la funzione di lettura”. Sarebbe fantastico se ci fosse un modo per avere un maggiore controllo sulla chiamata alle funzioni. Ad esempio, imposta tool_choice: "required" nel caso di OpenAI.

Ci ho appena riprovato con questa query di base e sono stati utilizzati i corretti parametri di ricerca. È la prima volta che lo vedo funzionare. :person_shrugging:

Lo so, al momento sto solo sperimentando con modelli diversi :smile: Mi chiedevo se GPT4 decidesse di effettuare chiamate di funzione diverse. Haiku sembra molto promettente.

1 Mi Piace

Grazie mille

oh, è corretto, l’iniezione di prompt di sistema avverrà solo se la persona ha caricamenti. Se non ci sono caricamenti, non iniettiamo nulla

Senza caricamenti non utilizziamo l’iniezione incondizionata di prompt di sistema e ci affidiamo invece alle chiamate di strumenti con risultati di chiamate di strumenti, puoi vederle scorrendo.

Una modalità senza strumenti mirata agli argomenti è certamente interessante, consumerebbe una buona quantità di token, la sfida però è pescare il contenuto giusto da un argomento.

Se un argomento, ad esempio, è di 5000 token, quali token sceglieremmo? come sceglieremmo i token giusti.

Così come stanno le cose, abbiamo solo N token incorporati per argomento a seconda del modello di embedding che stai utilizzando.

Quindi dovremmo iniziare a incorporare più blocchi per argomento o trovare un algoritmo per capire quale parte dell’argomento è la più interessante.

2 Mi Piace

Sono confuso. Se i risultati dell’invocazione dello strumento di lettura non vengono utilizzati per RAG, cosa fa l’invocazione dello strumento di lettura? Vedo che i risultati della chiamata allo strumento di lettura vengono inseriti nel contesto grezzo, ma non sembra che questo venga effettivamente utilizzato dall’LLM in alcun modo.

Il mio caso d’uso desiderato è semplice: abilita RAG su un sottoinsieme di argomenti secondo il base_query.

Penso che sarebbe meglio non fare affidamento su Discourse per gestire la suddivisione dei miei argomenti in più blocchi, ognuno con il proprio embedding. Piuttosto, voglio essere responsabile della creazione dei miei Documenti e FAQ in modo che siano ottimizzati per RAG. Cioè, l’intero post principale degli argomenti dovrebbe essere incorporabile. Sto parlando di argomenti wiki qui, le cui risposte possono e dovrebbero essere ignorate.

ada-002 ha un max token input di 8191, che è più che sufficiente per qualsiasi documento o faq ben scritto. Tali argomenti dovrebbero essere ben al di sotto di questo limite. voyage ai ha una lunghezza di contesto molto più ampia. di 16000.

Che ne dici di qualcosa di semplice come questo:

  • (token nel prompt di sistema - token nel messaggio utente) = token rimanenti totali disponibili
  • inserisci quanti più argomenti possibile nel prompt in base a token rimanenti totali disponibili
    • usa solo il primo post negli argomenti trovati

Immagino che la soluzione temporanea a breve termine potrebbe essere la seguente:

  • crea una persona che utilizza lo strumento di ricerca
  • esporta tutti gli argomenti che potrebbero essere trovati con lo strumento di ricerca
    • Non avrò bisogno di dividere questi documenti perché
      • Non mi interessano le risposte agli argomenti
      • L’argomento wiki principale è già abbastanza piccolo da incorporare l’intero.
  • Carica quei documenti sulla persona per RAG

In questo modo, la persona farà effettivamente RAG con i risultati della ricerca.

Spero che abbia senso! Fammi sapere se qualcosa non è chiaro.

1 Mi Piace

Quando leggi qualcosa, viene inserito nello stream della conversazione.

Ad esempio:

  • Puoi leggere X
  • Chiamata allo strumento leggi X
  • Risultato dello strumento “la pagina”
  • Risposta LLM

RAG è un termine molto sovraccarico, ma alla fine la lettura di un argomento lo aggiunge al contesto, l’LLM alla fine è responsabile di come usarlo, vari LLM possono farne un uso migliore o peggiore.

Ad esempio: [Untitled AI bot PM] - AI Conversation - Discourse Meta

Lo strumento di ricerca inserisce già estratti di argomenti, averlo e un RAG sullo stesso contenuto non ha senso.

Quello che stai dicendo, immagino, è che “la ricerca fornisce contesto, ma non abbastanza contesto”.

Quindi una soluzione alternativa è esportare tutti gli argomenti importanti in un file, quindi utilizzarlo come RAG. Non utilizzare lo strumento di ricerca.


La cosa più semplice per ora è:

categories:cat1,cat2,cat3 in:first

Questo limiterà lo strumento di ricerca ai soli primi post.

È molto efficiente, vedi:

Questo funziona perché lo strumento di ricerca inserisce quanto segue nel contesto:


Voglio anche una modalità “rag” incondizionata in cui si può scegliere di inserire ancora più dati (ad esempio, trovare i primi 5 documenti e inserire fino a 5000 token per documento, cercando di trovare le sezioni più pertinenti)

È un cambiamento complicato, ci arriveremo, ma per ora… ricerca + lettura ti portano abbastanza lontano.

2 Mi Piace

Sto solo dicendo… siete molto vicini al punto in cui dovete fare un’introduzione alle regole di base su come usare l’IA. Voglio dire, avete già qualcosa di simile per i CSS e un paio di altre cose.

2 Mi Piace

Capisco. Ha senso. Dalla documentazione di OpenAI sulle chiamate di funzione:

La sequenza di base dei passaggi per le chiamate di funzione è la seguente:

  1. Chiama il modello con la query dell’utente e un set di funzioni definite nel parametro functions.
  2. Il modello può scegliere di chiamare una o più funzioni; in tal caso, il contenuto sarà un oggetto JSON stringificato che aderisce al tuo schema personalizzato (nota: il modello potrebbe inventare parametri).
  3. Analizza la stringa in JSON nel tuo codice e chiama la tua funzione con gli argomenti forniti, se esistono.
  4. Chiama nuovamente il modello aggiungendo la risposta della funzione come nuovo messaggio e lascia che il modello riassuma i risultati all’utente.

Criticamente, non ero a conoscenza del punto #4. Non mi ero reso conto che i risultati dell’invocazione dello strumento venissero aggiunti come messaggi. Pensavo dipendesse interamente dal client se i risultati venivano utilizzati nelle chiamate successive! Quindi ero confuso quando non ho visto i risultati delle chiamate di strumento nel prompt stesso. :facepalm: Ora tutto ha molto più senso. Grazie!

:+1: :pray: Sembra che l’unico svantaggio qui sia che le risposte del bot non includeranno quei bei risultati di ricerca. Consiglieresti vivamente di utilizzare i caricamenti di documenti e lo strumento di ricerca per qualsiasi motivo, anche se sarà un po’ ridondante? Mi chiedo se i vantaggi di ottenere i risultati della ricerca nella conversazione ne varranno la pena.

Devi testarlo, potrebbe funzionare, potrebbe darti risultati sorprendenti e molto dipende dall’LLM che stai utilizzando.

1 Mi Piace