Discourse AI 검색 필터 품질 개선

우선, 정말 놀랍습니다. 감사드립니다! :heart_eyes:

활성화한 명령어(Enabled Commands): Search, Categories, Read, Tags를 사용하여 만든 페르소나에 대해 질문이 있습니다.

또한 .txt 파일도 업로드했습니다. 이 페르소나의 목표는 항상 제 포럼과 업로드된 파일을 검색하고, 두 가지를 모두 활용해 RAG(검색 증강 생성)를 수행하는 것입니다.

.txt 파일을 업로드한 후, 포럼 검색이 중단되는 것을 발견했습니다. 제 기본 검색 쿼리(Base Search Query)에는 다음이 포함되어 있습니다: #docs #faqs #anking-wiki
여기서 #docs와 #faqs는 카테고리이고, #anking-wiki는 태그입니다.

질문:

  • 실제로 카테고리와 태그 명령어가 필요한가요? 이 명령어들은 제 인스턴스의 태그와 카테고리를 나열하는 것만 하는 것으로 보입니다. 검색 명령어 하나면 충분할 것 같은데 어떻게 생각하시나요?
  • 제 기본 검색 쿼리는 괜찮은가요?
  • 왜 봇이 포럼 검색을 중단했나요?
    • 해결책이 단순히 프롬프트를 조정하여 항상 검색 기능을 사용해야 한다고 명확히 하는 것일까요?

디버깅 정보에서 확인되는 프롬프트는 다음과 같습니다:

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:

프롬프트에 "반드시 항상 검색 기능을 사용하세요(Be sure to always use the search function)"라는 문구를 추가해 보았습니다. 그랬더니 실제로 검색 기능은 사용했지만 결과가 좋지 않았습니다:
Missing Images After AnkiHub Version Update Issue - AI Conversation - AnkiHub Community

검색을 3회 수행하고 세 번 모두 "결과 0건 발견(Found 0 results)"이라고 잘못 보고했습니다. 검색 결과 링크를 클릭하면 실제로 결과가 있었음을 확인할 수 있습니다. 또한, "기본 검색 쿼리"의 파라미터가 사용되지 않았음을 알 수 있으며, 따라서 특정 카테고리가 아닌 포럼 전체를 검색했습니다.

여기 문제의 일부는 우리의 검색 기능이 다소 혼란스럽다는 점이라고 생각합니다:

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

Contribute > Bug AND Contribute > Feature - test 검색

여기서 원하시는 것은 다음입니다:

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

혼란스럽습니다. 이 검색은 제가 예상한 대로 작동하지 않습니다. 검색 결과가 지정된 카테고리에서만 반환될 것이라고 예상했는데, 실제로는 모든 카테고리에서 결과가 반환됩니다. 이 검색의 첫 번째 결과는 Customization > Theme component 카테고리에 있습니다.

맞아요, 버그가 있는 것 같네요. 아, 어떡하지. 한번 살펴볼게요.

다음 링크에서 수정되었습니다:

#contribute:bug #contribute:feature something과 같은 형식을 직관적으로 지원해야 한다는 데 동의합니다. 하지만 아직 완전히 지원되지 않으며, 이에 대한 추가 논의가 필요합니다.

categories:bug,feature something은 이제 작동하며, category:bug,feature something도 마찬가지입니다.

훌륭합니다! 그 수정을 이렇게 빨리 내줘서 감사합니다. :bowing_man:

이제 검색은 정상적으로 작동하지만, Discourse AI 봇은 여전히 예상대로 작동하지 않는 것 같습니다. 3.3.0.beta3-dev (a1d881f625) 버전에서의 관찰 결과는 다음과 같습니다:

  • base_query 옵션을 사용하지 않음
    • 완전히 무시하는 것처럼 보입니다. 제 설정이 유효한가요?
    • 제 판단으로는 기본 검색 쿼리 값에 대한 특별한 요구사항은 없는 것 같습니다. 하지만 아무 값을 입력해도 search_query에 추가되지 않습니다.
  • 검색 결과가 RAG를 위한 컨텍스트에 추가되지 않음
    • 검색 도구가 호출될 때(비록 base_query 없이도), 결과가 LLM 호출에 사용되는 것처럼 보이지 않습니다.
    • 이 도구가 어떻게 작동해야 하는지 제가 잘못 이해하고 있는 건가요? Discourse 검색을 수행하고 검색 결과(즉, 발견된 토픽의 내용)를 RAG에 사용하도록 기대했습니다.
      예를 들어 이 요청을 참고해 주세요:
요청 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\":[[\"👪 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"]}}}]}

검색 도구가 호출되었지만 base_query가 포함되어 있지 않음을 볼 수 있습니다.

또한 content에는 검색 결과 없이 기본 시스템 프롬프트만 포함되어 있음을 볼 수 있습니다.

  • 검색 결과 수가 올바르게 표시되지 않음
    • 결과가 많을 때는 0이라고 표시하거나, 결과가 없을 때는 5라고 표시합니다
    • 일반 검색 결과나 의미적 유사도 결과 중 어느 것과도 일치하지 않는 것 같습니다
  • 봇이 잘못된 쿼리 매개변수를 추가함
    • 예: 쿼리 끝에 category:non-existent-category를 추가했습니다.

:pleading_face: 요청 사항

  • discourse-ai에 대해 상세 로그(verbose logging)를 활성화할 옵션이 있으면 매우 도움이 될 것입니다. 그러면 Ruby에 익숙하지 않은 우리(배우고 있습니다! :nerd_face: )도 /logs를 방문하여 내부에서 무슨 일이 일어나고 있는지 빠르게 파악할 수 있을 것입니다.
  • 검색 도구가 사용될 때, 상위 결과를 RAG를 위한 컨텍스트에 추가해 주세요.
  • base_query가 사용되도록 보장하는 방법에 대한 조언을 부탁드립니다.

제가 이해한 대로, 이 코드에 따르면 함수 호출 시 도구 호출의 결과를 프롬프트에 추가해야 하는 것이 맞나요?

즉, 프롬프트는 업데이트되고 있지만, 디버깅 도구에서 표시되는 요청에서는 이것이 명확하게 보이지 않는 것일까요?

거기서 모든 컨텍스트를 볼 수 있어야 하는 것이 아닌가요? 만약 그렇지 않다면, 업로드를 통해 RAG를 수행하는 페르소나를 사용할 때는 전체 프롬프트 컨텍스트가 보이므로 혼란스럽습니다.

보고된 결과 수에 대해서도 여전히 혼란스럽습니다.

그럼에도 불구하고, 시스템 프롬프트에 다음 내용을 추가한 후 훨씬 더 좋은 결과를 얻고 있습니다!

  • 항상 search와 read 함수를 모두 호출하세요.
  • search 함수를 3회 이상 호출하지 마세요.
  • search 함수를 호출할 때 category 매개변수에 항상 “docs,faqs” 값을 사용하세요.

이것을 제대로 구성하면 진정한 게임 체인저가 될 것입니다.

이점에 대해 알고 계실지 모르겠지만, Intercom이 달성하려는 것보다 훨씬 더 강력한 기능을 우리에게 부여하고 있습니다.

이미 Intercom의 메신저를 해킹하여 사용자를 Discourse AI로 직접 연결하고 있습니다 :nerd_face: :

AnkiHub AI 링크는 AI 봇과 PM을 열고 다음과 같은 링크(/new-message?username=ankihubai_bot)를 포함합니다.

네, 디버깅 도구는 LLM으로 보내는 모든 내용을 표시합니다.

방금 결과 수에 대한 수정을 적용했습니다:

필터링된 쿼리로 올바르게 링크하지 않고 있었습니다.

이것은 권장하지 않으며, base_query를 사용하는 것을 권장합니다. 방금 테스트해보니 categories:docs,faqs로 잘 작동합니다.


요즘에는 GPT4 사용은 권장하지 않습니다. GPT4o나 Turbo를 사용하는 것이 훨씬 저렴하고 빠르므로 꼭 사용하세요.

다시 한번 확인해 보는데 … 디버깅 버튼이 보이도록 ai_bot_debugging_allowed_groups를 활성화하셨나요?

네. 읽기 함수 호출 결과가 프롬프트에 사용되지 않는다는 것을 보여주기 위해 간단한 화면 공유를 PM으로 보내겠습니다.

또한 시스템 프롬프트에 "항상 읽기 함수를 호출하세요."라는 주석을 추가하지 않는 한 읽기 함수가 절대 호출되지 않는다는 것도 알아차렸습니다. 함수 호출에 대해 더 많은 제어권을 가질 수 있는 방법이 있다면 정말 좋겠습니다. 예를 들어, OpenAI의 경우 set tool_choice: "required"를 설정하는 것처럼요.

방금 이 base query로 다시 시도해봤는데, 올바른 검색 매개변수가 사용되었습니다. 이것이 제대로 작동하는 것을 처음 보는 것입니다. :person_shrugging:

알고 있습니다. 지금은 다양한 모델로 실험하고 있을 뿐입니다 :smile: GPT4가 다른 함수 호출을 결정할지 궁금했습니다. Haiku는 매우 유망해 보입니다.

정말 감사합니다.

아, 맞습니다. 시스템 프롬프트 인젝션은 페르소나에 업로드가 있는 경우에만 발생하죠. 업로드가 없으면 아무것도 주입하지 않습니다.

업로드가 없는 경우 무조건적인 시스템 프롬프트 인젝션을 사용하지 않고, 대신 도구 호출과 그 결과를 의존합니다. 스크롤을 통해 확인할 수 있습니다.

특정 주제에 초점을 맞춘 도구 없는 모드는 분명 흥미롭지만, 상당한 양의 토큰을 소모하게 됩니다. 다만, 주제에서 적절한 콘텐츠를 추출해내는 것이 과제입니다.

예를 들어 한 주제가 5000토큰이라면, 어떤 토큰을 선택해야 할까요? 어떻게 올바른 토큰을 고를 수 있을까요?

현재로서는 사용하는 임베딩 모델에 따라 주제당 N개의 토큰만 임베딩되어 있습니다.

따라서 주제당 더 많은 청크를 임베딩해야 하거나, 주제에서 가장 흥미로운 부분이 어디인지 파악할 수 있는 알고리즘을 개발해야 합니다.

좀 혼란스럽습니다. 읽기(read) 도구를 호출한 결과가 RAG에 사용되지 않는다면, 읽기 도구를 호출하는 것의 의미는 무엇인가요? 읽기 도구 호출의 결과가 raw context에 넣히는 것을 볼 수 있지만, 이것이 LLM에 의해 실제로 어떤 방식으로든 사용되고 있는 것으로 보이지 않습니다.

제가 원하는 사용 사례는 간단합니다: base_query에 따라 토픽의 일부에 RAG를 활성화하는 것입니다.

Discourse가 제 토픽을 여러 개의 청크로 나누고 각각에 임베딩을 처리하도록 의존하는 것보다는, RAG에 최적화되도록 문서와 FAQ를 작성하는 것이 제 책임이라고 생각합니다. 즉, 토픽의 메인 게시글 전체가 임베딩될 수 있어야 합니다. 여기서 말하는 것은 위키 토픽이며, 이에 대한 답글은 무시해도 괜찮고 실제로 무시해야 합니다.

ada-002는 최대 입력 토큰이 8191로, 잘 작성된 문서나 FAQ 토픽에는 충분한 크기입니다. 이러한 토픽은 이 한도를 훨씬 밑돌아야 합니다. voyage ai는 16000이라는 훨씬 더 큰 컨텍스트 길이를 제공합니다.

다음과 같이 단순한 방법은 어떨까요?

  • (시스템 프롬프트의 토큰 수 - 사용자 메시지의 토큰 수) = 사용 가능한 총 잔여 토큰 수
  • 사용 가능한 총 잔여 토큰 수에 기반하여 프롬프트에 가능한 한 많은 토픽을 주입합니다.
    • 발견된 토픽의 첫 번째 게시글만 사용합니다.

가까운 시기의 임시 해결책은 다음과 같을 수 있습니다:

  • 검색 도구를 사용하는 페르소나를 생성합니다.
  • 검색 도구로 찾을 수 있는 모든 토픽을 내보냅니다.
    • 이 문서들을 분할할 필요가 없습니다.
      • 토픽 답글은 중요하지 않기 때문입니다.
      • 메인 위키 토픽은 이미 전체를 임베딩하기에 충분히 작습니다.
  • 이러한 문서를 페르소나에 업로드하여 RAG를 수행합니다.

이렇게 하면 페르소나가 검색 결과에 대해 실제로 RAG를 수행하게 됩니다.

이것이 이해가 되길 바랍니다! 명확하지 않은 부분이 있으면 알려주세요.

무언가를 읽으면 그 내용이 대화 스트림에 주입됩니다.

예를 들어:

  • X를 읽어볼 수 있겠니
  • 도구 호출: X 읽기
  • 도구 결과: “해당 페이지”
  • LLM 답변

RAG는 매우 오용되는 용어이지만, 결국 토픽을 읽는 것은 그것을 컨텍스트에 추가하는 것이며, 최종적으로 그것을 어떻게 사용할지는 LLM의 책임입니다. LLM에 따라 그것을 더 잘 또는 더 나쁘게 활용할 수 있습니다.

예: [Untitled AI bot PM] - AI Conversation - Discourse Meta

검색 도구는 이미 토픽의 발췌문을 삽입하므로, 동일한 콘텐츠에 검색 도구와 RAG를 함께 사용하는 것은 의미가 없습니다.

말씀하신 내용은 "검색이 컨텍스트를 제공하지만, 충분한 컨텍스트를 제공하지 않는다"는 것인 것 같습니다.

따라서 하나의 우회 방법은 중요한 토픽들을 모두 파일로 내보낸 후, 그것을 RAG로 사용하는 것입니다. 검색 도구를 사용하지 마세요.


지금은 가장 간단한 방법은 다음과 같습니다:

categories:cat1,cat2,cat3 in:first

이것은 검색 도구를 첫 번째 게시물로만 제한합니다.

매우 효율적이며, 참조:

https://meta.discourse.org/discourse-ai/ai-bot/shared-ai-conversations/xw47vzgTQExpyYD777J5mQ

이것이 작동하는 이유는 검색 도구가 컨텍스트에 다음을 주입하기 때문입니다:


또한, 더 많은 데이터를 주입할 수 있는 선택적인(무조건적인) “rag” 모드도 원합니다(예: 상위 5개 문서를 찾아 문서당 최대 5000토큰까지 주입하고, 가장 관련성 높은 섹션을 찾으려 함)

복잡한 변경 사항이지만, 결국 도달할 것입니다. 하지만 지금은 … 검색 + 읽기로 꽤 멀리 갈 수 있습니다.

단순히 말하지만… 여러분은 AI 사용에 관한 기본 규칙을 소개해야 하는 시점에 거의 도달한 것 같습니다. CSS와 몇 가지 다른 주제에 대해 이미 비슷한 가이드를 가지고 있으니까요.

아, 그렇군요. 그 말이 맞습니다. OpenAI의 함수 호출(function calling) 문서에 따르면:

함수 호출의 기본 단계는 다음과 같습니다:
1. 사용자 쿼리와 functions 매개변수에 정의된 함수 집합을 사용하여 모델을 호출합니다.
2. 모델은 하나 이상의 함수를 호출할 수 있습니다. 그렇게 하면 콘텐츠는 사용자 정의 스키마를 따르는 문자열화된 JSON 객체가 됩니다(참고: 모델이 매개변수를 환각할 수 있음).
3. 코드의 문자열을 JSON으로 파싱하고, 인자가 존재하는 경우 해당 인자를 사용하여 함수를 호출합니다.
4. 함수 응답을 새로운 메시지로 추가하여 모델을 다시 호출하고, 모델이 결과를 사용자에게 요약하도록 합니다.

중요한 점은 4번 단계에 대해 저는 알지 못했다는 것입니다. 도구를 호출한 결과가 메시지로 추가된다는 사실을 몰랐습니다. 결과가 후속 호출에서 사용되는지는 클라이언트가 전적으로 결정한다고 생각했거든요! 그래서 프롬프트 자체에서 도구 호출 결과를 볼 수 없었을 때 혼란스러웠습니다. :facepalm: 이제 모든 것이 훨씬 더 명확해졌습니다. 감사합니다!

:+1: :pray: 여기서 유일한 단점이 봇의 응답에 그 좋은 검색 결과가 포함되지 않는다는 것뿐인 것 같습니다. 조금 중복되더라도 문서 업로드 와 검색 도구를 함께 사용하는 것을 강력히 추천하시나요? 대화에 검색 결과가 포함되는 것이 가져다주는 이점이 그 정도를 상쇄할 수 있을지 궁금합니다.

직접 테스트해 보셔야 합니다. 효과가 있을 수도 있고, 놀라운 결과를 얻을 수도 있으며, 이는 사용 중인 LLM에 따라 크게 달라집니다.