Améliorer la qualité des filtres de recherche dans Discourse AI

Tout d’abord, c’est vraiment incroyable - merci beaucoup ! :heart_eyes:

J’ai une question concernant un persona que j’ai créé avec ces commandes activées : Search, Categories, Read, Tags.

J’ai également téléchargé un fichier .txt. Mon objectif avec ce persona est qu’il recherche toujours mon forum et les téléchargements, et qu’il fasse du RAG avec les deux.

Après avoir téléchargé le fichier .txt, j’ai remarqué qu’il avait arrêté de rechercher sur mon forum. Voici ce que j’ai dans ma requête de recherche de base : #docs #faqs #anking-wiki
#docs et #faqs sont des catégories tandis que #anking-wiki est une balise.

Questions :

  • Ai-je vraiment besoin des commandes categories et tags ? Je vois que ces commandes listent simplement les tags et les catégories de mon instance. Il semble que la commande search devrait suffire.
  • Ma requête de recherche de base est-elle correcte ?
  • pourquoi le bot a-t-il arrêté de rechercher sur mon forum ?
    • La solution est-elle simplement d’ajuster mon prompt pour préciser qu’il doit toujours utiliser la fonction de recherche ?

Voici le prompt tel qu’il apparaît dans les informations de débogage :

You are a helpful Discourse assistant for AnkiHub users.
You understand and generate Discourse Markdown.
You live in a Discourse Forum Message.
You live in the forum with the URL: https://community.ankihub.net
The title of your site: AnkiHub Community
The description is: A community forum for the AnkiHub and AnKing projects
The participants in this conversation are: gpt4o_bot, andrew
The date now is: 2024-06-07 23:32:13 UTC, much has changed since you were
trained.
You were trained on OLD data, lean on search to get up to date information about this forum
When searching try to SIMPLIFY search terms
Discourse search joins all terms with AND. Reduce and simplify terms to find more results.

The following texts will give you additional guidance for your response. We included them because we believe they are relevant to this conversation topic. Texts:

J’ai essayé d’ajouter “Be sure to always use the search function” à mon prompt. Cela a eu pour effet qu’il utilise effectivement la fonction de recherche, mais avec de mauvais résultats :

Il a apparemment effectué 3 recherches et a mal indiqué “Found 0 results” à trois reprises. Si vous cliquez sur les liens des résultats de recherche, vous pouvez voir qu’il y avait bien des résultats. De plus, vous pouvez voir que les paramètres de ma “Base Search Query” n’ont pas été utilisés, il a donc recherché sur l’ensemble du forum au lieu des catégories spécifiques.

Je pense qu’une partie du problème ici est que notre recherche est un peu confuse :

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

Recherche Bug ET Feature - test

Ce que vous voulez ici, c’est :

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

2 « J'aime »

Je suis confus. Cela ne fonctionne pas comme je m’y attendais. Je m’attendais à ce que la recherche ne retourne que des résultats des catégories spécifiées. Cependant, la recherche retourne des résultats de n’importe quelle catégorie. Le premier résultat de cette recherche se trouve dans la catégorie Theme component.

2 « J'aime »

C’est vrai, cela semble bogué, oh non, je vais y jeter un œil.

1 « J'aime »

Ceci est corrigé selon :

Je suis d’accord qu’il est intuitif de prendre en charge #bug #feature quelque chose, mais cela n’est pas encore tout à fait pris en charge et nécessite une discussion.

categories:bug,feature quelque chose fonctionnera maintenant, et category:bug,feature quelque chose aussi.

1 « J'aime »

Génial ! Merci d’avoir publié ce correctif si rapidement. :bowing_man:

Bien que la recherche fonctionne maintenant correctement, le Bot Discourse AI ne semble toujours pas fonctionner comme prévu. Voici mes observations avec 3.3.0.beta3-dev (a1d881f625) :

  • N’utilise pas l’option base_query
    • il semble l’ignorer complètement. ma configuration est-elle valide ?
    • d’après ce que j’ai pu constater, il n’y a aucune exigence quant aux valeurs de la requête de recherche de base. mais peu importe ce que j’y mets, elle n’est pas utilisée en ajout à search_query.
  • Les résultats de recherche ne sont pas ajoutés au contexte pour le RAG
    • lorsque l’outil de recherche est appelé (bien que sans le base_query), les résultats ne semblent pas être utilisés dans l’appel LLM.
    • Est-ce que je comprends mal le fonctionnement de cet outil ? Je m’attendais à ce qu’il effectue une recherche Discourse et utilise les résultats de recherche (c’est-à-dire le contenu des sujets trouvés) pour le RAG.
      Voir cette requête par exemple :
Requête 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\":[[țiile\"👪 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```

Vous pouvez voir que l’outil de recherche a été appelé mais ne contient pas le base_query.

Vous pouvez également voir que content ne contient que l’invite système par défaut, sans aucun des résultats de recherche.

  • N’affiche pas le bon nombre de résultats de recherche
    • il dit 0 alors qu’il y en a beaucoup, ou 5 alors qu’il y en a 0
    • ne semble correspondre ni aux résultats de recherche normaux ni aux résultats de similarité sémantique
  • Le bot ajoutera des paramètres de requête invalides
    • par exemple, il a ajouté category:non-existent-category à la fin de la requête.

:pleading_face: Demandes

  • Ce serait très utile s’il existait une option pour activer la journalisation détaillée pour discourse-ai afin que nous, qui ne connaissons pas le Ruby (j’apprends ! :nerd_face: ), puissions rapidement avoir un aperçu de ce qui se passe en coulisses en visitant /logs
  • Lorsque l’outil de recherche est utilisé, ajoutez les meilleurs résultats au contexte pour le RAG
  • Conseils sur la façon de s’assurer que le base_query est utilisé.

Ai-je raison de penser que l’appel de fonction devrait effectivement pousser les résultats de l’appel de l’outil dans l’invite, conformément à ceci ?

Donc, peut-être que cela met à jour l’invite, mais ce n’est pas clair d’après la requête montrée par l’outil de débogage ?

Ne devrais-je pas m’attendre à voir tout le contexte ici ? Sinon, c’est déroutant car tout le contexte de l’invite est visible lorsque l’on utilise une persona qui fait du RAG avec des téléchargements.

Je suis toujours confus par le nombre de résultats signalés.

Cela dit, j’obtiens de bien meilleurs résultats après avoir ajouté ce qui suit à l’invite système !

  • Appelez toujours les fonctions de recherche et de lecture.
  • Appelez la fonction de recherche au maximum 3 fois.
  • Lors de l’appel de la fonction de recherche, utilisez toujours cette valeur pour le paramètre de catégorie : “docs,faqs”

Cela va changer la donne une fois que j’aurai correctement configuré les choses.

Je ne sais pas si vous êtes au courant, mais vous nous donnez effectivement quelque chose de bien plus puissant que ce qu’essaie d’accomplir Intercom.

J’essaie déjà de détourner le messager d’Intercom en dirigeant les utilisateurs directement vers Discourse AI :nerd_face: :

Le lien AnkiHub AI ouvre un message privé avec le bot AI avec un lien comme celui-ci : /new-message?username=ankihubai_bot

Oui, l’outil de débogage montre tout ce que nous envoyons au LLM.

Je viens de corriger le nombre de résultats par :

Nous ne faisions pas correctement le lien vers une requête filtrée.

Je déconseille cela, utilisez base_query, je viens de tester et cela fonctionne bien : categories:docs,faqs


Je déconseille l’utilisation de GPT4 ces jours-ci, assurez-vous d’utiliser GPT4o ou Turbo, ils sont tellement moins chers et plus rapides.

Je vérifie juste… avez-vous activé

ai_bot_debugging_allowed_groups pour voir le bouton de débogage ?

2 « J'aime »

Oui. Je vous enverrai un bref partage d’écran pour montrer que les résultats de l’appel de la fonction read ne sont pas utilisés dans l’invite.

J’ai également remarqué que la fonction read n’est jamais appelée à moins que je n’ajoute une note dans l’invite système : “appeler toujours la fonction read”. Ce serait formidable s’il y avait un moyen d’avoir plus de contrôle sur l’appel de fonctions. Par exemple, définir tool_choice: "required" dans le cas d’OpenAI.

Je viens de réessayer avec cette requête de base et les bons paramètres de recherche ont été utilisés. C’est la première fois que je vois cela fonctionner. :person_shrugging:

Je sais, j’expérimente juste avec différents modèles en ce moment :smile: Je me demandais si GPT4 déciderait de faire des appels de fonction différents. Haiku semble très prometteur.

1 « J'aime »

Merci beaucoup

oh, c’est correct, l’injection de prompt système ne se produira que si la persona a des téléchargements. S’il n’y a pas de téléchargements, nous n’injectons rien

Sans téléchargements, nous n’utilisons pas l’injection de prompt système inconditionnelle et nous nous appuyons plutôt sur les appels d’outils avec les résultats des appels d’outils, vous pouvez les voir en faisant défiler.

Un mode sans outil ciblant des sujets est certainement intéressant, il consommerait une bonne partie des jetons, le défi cependant est de pêcher le bon contenu d’un sujet.

Si un sujet fait par exemple 5000 jetons, quels jetons choisirions-nous ? comment choisirions-nous les bons jetons.

En l’état actuel, nous n’avons que N jetons intégrés par sujet en fonction du modèle d’intégration que vous utilisez.

Nous devrions donc commencer à intégrer plus de morceaux par sujet ou trouver un algorithme pour déterminer quelle partie du sujet est la plus intéressante.

2 « J'aime »

Je suis confus. Si les résultats de l’invocation de l’outil de lecture ne sont pas utilisés pour le RAG, à quoi sert l’invocation de l’outil de lecture ? Je vois que les résultats de l’appel de l’outil de lecture sont placés dans le contexte brut, mais il ne semble pas que cela soit réellement utilisé par le LLM d’une quelconque manière.

Mon cas d’utilisation souhaité est simple : activer le RAG sur un sous-ensemble de sujets conformément au base_query.

Je pense qu’il serait préférable de ne pas se fier à Discourse pour diviser mes sujets en plusieurs morceaux, chacun avec son propre embedding. Plutôt, je veux être responsable de la création de mes Docs et FAQs de manière à ce qu’ils soient optimisés pour le RAG. C’est-à-dire, l’intégralité du post principal des sujets devrait être intégrable. Je parle ici de sujets wiki, dont les réponses peuvent et devraient être ignorées.

ada-002 a une entrée maximale de 8191 tokens, ce qui est largement suffisant pour tout document ou FAQ bien écrit. De tels sujets devraient être bien en deçà de cette limite. voyage ai a une longueur de contexte beaucoup plus grande de 16000.

Que diriez-vous de quelque chose d’aussi simple que ceci :

  • (tokens dans le prompt système - tokens dans le message utilisateur) = total de tokens restants disponibles
  • injecter autant de sujets que possible dans le prompt en fonction du total de tokens restants disponibles
    • utiliser uniquement le premier post des sujets trouvés

Je suppose que la solution de contournement à court terme pourrait être la suivante :

  • créer un persona qui utilise l’outil de recherche
  • exporter tous les sujets qui pourraient être trouvés avec l’outil de recherche
    • Je n’aurai pas besoin de diviser ces documents car
      • Je ne me soucie pas des réponses aux sujets
      • Le sujet wiki principal est déjà assez petit pour intégrer l’intégralité.
  • Télécharger ces documents vers le persona pour le RAG

De cette façon, le persona effectuera réellement le RAG avec les résultats de la recherche.

J’espère que cela a du sens ! Faites-moi savoir si quelque chose n’est pas clair.

1 « J'aime »

Lorsque vous lisez des éléments, ils sont injectés dans le flux de conversation.

Par exemple :

  • Pouvez-vous lire X
  • Appel d’outil lire X
  • Résultat de l’outil “la page”
  • Réponse du LLM

RAG est un terme très galvaudé, mais au final, lire un sujet l’ajoute au contexte, le LLM est finalement responsable de la manière de l’utiliser, divers LLM peuvent en faire une utilisation meilleure ou moins bonne.

Par exemple : [Untitled AI bot PM] - AI Conversation - Discourse Meta

L’outil de recherche insère déjà des extraits de sujets, l’avoir en même temps qu’un RAG sur le même contenu n’a pas de sens.

Ce que vous dites, je suppose, c’est que “la recherche donne du contexte, mais pas assez de contexte”.

Donc, une solution de contournement consiste à exporter tous les sujets importants dans un fichier, puis à l’utiliser comme RAG. N’utilisez pas l’outil de recherche.


La chose la plus simple pour l’instant est :

categories:cat1,cat2,cat3 in:first

Cela limitera l’outil de recherche aux premiers messages uniquement.

C’est très efficace, voir :

Cela fonctionne car l’outil de recherche injecte ce qui suit dans le contexte :


Je souhaite également un mode “rag” inconditionnel où vous pouvez choisir d’injecter encore plus de données (par exemple, trouver les 5 meilleurs documents et injecter jusqu’à 5000 jetons par document, en essayant de trouver les sections les plus pertinentes).

C’est un changement compliqué, nous y arriverons, mais pour l’instant… la recherche + la lecture vous mènent assez loin.

2 « J'aime »

Je dis juste… vous êtes très proches du point où vous devez introduire des règles de base sur l’utilisation de l’IA. Je veux dire que vous avez déjà quelque chose de similaire pour le CSS et quelques autres choses.

2 « J'aime »

Je vois. C’est logique. D’après les documents d’OpenAI sur l’appel de fonctions :

La séquence d’étapes de base pour l’appel de fonctions est la suivante :

  1. Appelez le modèle avec la requête de l’utilisateur et un ensemble de fonctions définies dans le paramètre functions.
  2. Le modèle peut choisir d’appeler une ou plusieurs fonctions ; si c’est le cas, le contenu sera un objet JSON stringifié adhérant à votre schéma personnalisé (note : le modèle peut halluciner des paramètres).
  3. Analysez la chaîne en JSON dans votre code et appelez votre fonction avec les arguments fournis s’ils existent.
  4. Appelez à nouveau le modèle en ajoutant la réponse de la fonction comme un nouveau message, et laissez le modèle résumer les résultats à l’utilisateur.

De manière critique, je n’étais pas au courant du point #4. Je ne savais pas que les résultats de l’invocation de l’outil étaient ajoutés comme messages. Je pensais que c’était entièrement à la charge du client de savoir si les résultats étaient utilisés dans des appels ultérieurs ! J’étais donc confus lorsque je n’ai pas vu les résultats des appels d’outils dans l’invite elle-même. :facepalm: Tout cela est beaucoup plus logique maintenant. Merci !

:+1: :pray: Il semble que le seul inconvénient ici soit que les réponses des bots n’incluront pas ces jolis résultats de recherche. Recommanderiez-vous fortement d’utiliser les téléchargements de documents et l’outil de recherche pour une raison quelconque, même si ce sera un peu redondant ? Je me demande si les avantages d’obtenir les résultats de recherche dans la conversation en vaudront la peine.

Vous devez tester, cela pourrait fonctionner, cela pourrait vous donner des résultats surprenants et cela dépend beaucoup du LLM que vous utilisez.

1 « J'aime »