이제 AI 페르소나에 대량의 텍스트를 포함할 수 있습니다!
이 기능은 여러 가지 이점을 제공합니다:
- 모델 학습 데이터에 없는 대량의 텍스트(예: 내부 학습 문서, 내부 보고서)를 사용자 정의 AI 봇에 도입할 수 있습니다.
- 페르소나를 구체적인 데이터로 더 잘 뒷받침할 수 있습니다(모델 학습 세트에 존재하더라도). 이를 통해 모델이 특정 정보를 올바르게 인용하고 결과의 품질을 높이는 데 도움이 됩니다.
업로드를 추가하려면:
-
/admin/plugins/discourse-ai/ai-personas/인터페이스를 사용하여 새로운 페르소나를 생성합니다. -
페르소나에 포함하려는 텍스트 파일을 업로드합니다.
파일 업로드 전에 사이트 설정의
authorized extensions를 통해 관련 확장명(.md및.txt)을 추가하여 페르소나가 이를 사용할 수 있도록 하세요.
- 색인화 옵션을 원하는 대로 조정합니다.
사전 요구 사항
이 옵션이 작동하려면 ai_embeddings_enabled이 활성화되어 있고 ai_embeddings_model이 구성되어 있어야 합니다.
Discourse AI는 매우 많은 양의 임베딩 모델을 지원합니다.
호스팅 고객은 최첨단 bge-large-en 모델에 대한 무료 액세스를 제공합니다.
자체 호스팅 사용자나 더 많은 선택지를 원하는 사용자는 임베딩 모델을 자체 호스팅하거나 Open AI, Google(Gemini) 등의 모델을 사용할 수 있습니다.
이것이 RAG인가요?
우리의 업로드 지원 구현은 실제로 검색 증강 생성(Retrieval-Augmented Generation)입니다.
높은 수준에서 설명하면, LLM에게 사용자의 질문에 대한 답변을 요청하기 전에 사용자가 입력한 텍스트를 기반으로 매우 관련성 높은 정보를 찾아 시스템 프롬프트에 주입합니다.
다양한 색인화 옵션 설명
토큰이란 무엇인가요? 토큰은 대규모 언어 모델이 텍스트를 분할하는 데 사용되는 기본 단위입니다. 훌륭한 시각적 설명은 여기에서 볼 수 있습니다: https://platform.openai.com/tokenizer
Discourse AI 업로드 구현에는 다음과 같은 토글이 포함되어 있습니다:
Upload Chunk Tokens: 파일이 업로드되면 조각으로 분할됩니다. 이를 통해 조각의 크기를 제어할 수 있습니다. 조각이 임베딩 모델에 대해 너무 크면 임베딩이 잘립니다(토큰의 일부만 처리됨).
Upload Chunk Overlap Tokens: 이는 현재 조각에 포함된 이전 조각의 토큰 수입니다. 이 숫자가 클수록 색인화에 저장되는 중복 정보가 많아집니다.
Search Conversation Chunks: 이는 완성 프롬프트에서 관련성에 기반하여 무조건적으로 포함될 토큰 "조각"의 수를 제어합니다. 숫자가 클수록 LLM에 제공되는 컨텍스트가 많아지고(호출 비용이 증가합니다). 예를 들어: 이 값이 10이고 Upload Chunk Tokens가 200으로 설정되어 있다면 모든 완성 호출에는 2000개의 토큰이 추가 오버헤드로 포함됩니다.
Discourse AI는 대량의 텍스트를 어떻게 분할하나요?
Discourse는 재귀적 문자 텍스트 분할기(Recursive Character Text Splitter)를 사용하여 분할 시 단락, 줄, 그리고 마지막으로 단어를 함께 유지하도록 시도합니다.
또한 Discourse는 텍스트가 분할되는 방식에 대한 추가 제어를 제공합니다.
[[metadata YOUR METADATA HERE]] 구분자는 대량의 텍스트를 분할하고 각 섹션이 무엇을 다루는지 올바르게 강조하는 데 사용할 수 있습니다.
예를 들어:
[[metadata about cats]]
고양이에 대한 긴 이야기
[[metadata about dogs]]
개에 대한 긴 이야기
이를 통해 단일 텍스트 문서가 다양한 콘텐츠를 다루도록 할 수 있으며 "조각 오염(chunk contamination)"으로부터 보호됩니다. 고양이 관련 데이터만 고양이 조각에, 개 관련 데이터만 개 조각에 포함됨이 보장됩니다.
복잡해 보이는데, 어떻게 디버깅하나요?
Discourse AI에는 사이트 설정 ai bot debugging enabled groups가 포함되어 있으며, 이 그룹의 사용자는 AI 디버깅에 액세스할 수 있습니다:
AI 디버깅 화면은 AI에게 보내는 정보를 들여다볼 수 있는 창을 제공합니다.
쓰레기 입력 - 쓰레기 출력(Garbage in - Garbage out) LLM에게 쓸모없거나 모호한 정보를 제공하면 이를 마법처럼 유용한 정보로 변환할 수 없습니다.
이 화면은 조각의 크기를 어떻게 설정해야 하는지 또는 너무 많거나 적은 조각을 포함하고 있는지 판단하는 데 도움이 될 수 있습니다.
이것이 실제로 작동하나요?
실제 사례로는 HAProxy 문서를 분할하여 페르소나에 공급하는 것이 있습니다:
시스템 프롬프트:
당신은 HAProxy에 대한 질문에 답하는 데 전문적인 봇입니다.
당신은 Discourse 포럼에 거주하며 Discourse 마크다운을 렌더링합니다.
답변을 제공할 때는 항상 HAProxy 문서로 돌아가는 링크를 포함하려고 하세요.
예를 들어, 섹션 10.1.1에 링크를 걸려면 이렇게 합니다. 섹션이나 옵션 내에 링크를 걸 수 있음을 명심하세요.
[fcgi-app](https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#10.1.1-fcgi-app)링크를 아낌없이 사용하세요. 매우 유용합니다.
업로드 내용:
processed-haproxy-2.txt (1.2 MB)
이는 다음 스크립트를 사용하여 생성되었습니다:
file_content = File.read("configuration.txt")
title = nil
body = nil
last_line = nil
sections = []
file_content.each_line do |line|
if line.strip.match?(/^[-]+$/)
section_number, title = title.to_s.split(" ", 2)
sections << {
section_number: section_number,
title: title,
body: body.to_s.strip
}
title = last_line
body = nil
last_line = nil
else
body = body.to_s + last_line.to_s
last_line = line
end
end
section_number, title = title.to_s.split(" ", 2)
sections << { section_number: section_number, title: title, body: body }
section_names =
sections.map { |section| [section[:section_number], section[:title]] }.to_h
sections[4..-1].each do |section|
title = []
current = +""
section_number = section[:section_number]
section_number
.split(".")
.each do |number|
current << number
current << "."
title << section_names[current].to_s.strip
end
title = title.join(" - ")
body = section[:body]
next if body.strip.empty?
puts "[[metadata section=\"#{section_number}\" title=\"#{title.strip}\"]]"
puts body
end
Claude Opus와 GPT-4 모두 복잡한 질문에 대해 상당히 엉망으로 실패할 수 있습니다. 이는 이해할 수 있는 일입니다. 인터넷의 모든 토큰을 학습하므로 50가지 다른 버전의 HAProxy 문서와 전 세계에 대한 모든 논의가 뇌로 들어가기 때문에 매우 혼란스러워할 수 있기 때문입니다:
혼란스러운 GPT-4 및 Claude 3 Opus의 예
https://meta.discourse.org/discourse-ai/ai-bot/shared-ai-conversations/r1PWS1LOsMsJny6VqNQ2vQ
https://meta.discourse.org/discourse-ai/ai-bot/shared-ai-conversations/iaUfc3xSyLliRGZ_3RFm8w
둘 다 Discourse RAG가 제공하는 미세 조정된 답변만큼 객관적으로 훌륭하지 않습니다:
덜 혼란스러운 GPT-4 및 Claude Opus의 예
https://meta.discourse.org/discourse-ai/ai-bot/shared-ai-conversations/4eaV4H5qMgV7XU_NyKtIGQ
https://meta.discourse.org/discourse-ai/ai-bot/shared-ai-conversations/UuvYZFFsQc1Vwkre0shXQw
미래
우리는 피드백을 기다리고 있으며, 미래에 대한 아이디어로는 다음과 같은 것이 있을 수 있습니다:
- 텍스트로 변환할 필요가 없도록 PDF/DOCX/XLS 등 지원
- 소스 코드/HTML에 대한 더 지능적인 청킹(chunking)
- 색인화 전 수신 데이터의 스마트한 변환
여러분의 생각을 알려주세요!
이 기능을 구현해 주신 @Roman님께 큰 감사를 드립니다 ![]()



