Discourse 챗봇 πŸ€–

이것은 주둜 호좜과 응닡 λ°©μ‹μ˜ λ΄‡μž…λ‹ˆλ‹€(μ„€μ •λœ μΉ΄ν…Œκ³ λ¦¬μ—μ„œ μ£Όμ œκ°€ μƒμ„±λ˜λ©΄ μžλ™μœΌλ‘œ μ‹€ν–‰λ˜κΈ°λ„ ν•©λ‹ˆλ‹€). ν˜„μž¬λŠ” λͺ¨λ”λ ˆμ΄ν„° 역할을 μˆ˜ν–‰ν•˜λ„λ‘ μ„€κ³„λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

1개의 μ’‹μ•„μš”

μ•„, 방금 μ—…λ°μ΄νŠΈλ₯Ό λ§ˆμ³€μŠ΅λ‹ˆλ‹€ (100컀밋 μ •λ„λ§Œ λ’€μ²˜μ Έ μžˆμ—ˆμŠ΅λ‹ˆλ‹€). μ½”μ–΄μ—μ„œ μ±„νŒ… μ‚¬μš©μ— 영ν–₯을 λ―ΈμΉ˜λŠ” ν˜Έν™˜μ„± 깨짐(breaking change)이 생긴 것 κ°™μŠ΅λ‹ˆλ‹€. 확인해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

κ·Έλ™μ•ˆ λΉ λ₯Έ μ‹€ν–‰(Quick Launch)을 개인 λ©”μ‹œμ§€λ‘œ μ „ν™˜ν•΄ 보싀 수 μžˆμŠ΅λ‹ˆλ‹€.

1개의 μ’‹μ•„μš”

ν”ŒλŸ¬κ·ΈμΈμ„ μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€.

μ±„νŒ…μ΄ 이전과 λ™μΌν•˜κ²Œ μž‘λ™ν•΄μ•Ό ν•©λ‹ˆλ‹€:

2개의 μ’‹μ•„μš”

λ˜ν•œ μ±„νŒ… μŠ€λ ˆλ“œ(Chat Threads) 지원도 μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

이제 μ±—λ΄‡μ˜ μ»¨ν…μŠ€νŠΈλŠ” ν˜„μž¬ μ±„νŒ… μŠ€λ ˆλ“œλ‘œ μ œν•œλ˜λ©°, ν˜„μž¬ μŠ€λ ˆλ“œμ— λŒ€ν•΄μ„œλ§Œ 응닡해야 ν•©λ‹ˆλ‹€.

λ¬Έμ œκ°€ λ°œμƒν•˜λ©΄ μ•Œλ €μ£Όμ„Έμš”.

1개의 μ’‹μ•„μš”

1.3 릴리슀둜 인해 포럼 검색이 μž‘λ™ν•˜μ§€ μ•ŠλŠ” λ¬Έμ œκ°€ λ°œμƒν–ˆμœΌλ‚˜, 이제 μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

2개의 μ’‹μ•„μš”

3μ‹œκ°„ 전에 μ—…λ°μ΄νŠΈν–ˆμ§€λ§Œ μ—¬μ „νžˆ λ™μΌν•œ 였λ₯˜κ°€ λ°œμƒν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

activesupport-7.1.4.1/lib/active_support/broadcast_logger.rb:134:in `block in error'

activesupport-7.1.4.1/lib/active_support/broadcast_logger.rb:231:in `block in dispatch'

activesupport-7.1.4.1/lib/active_support/broadcast_logger.rb:231:in `each'

activesupport-7.1.4.1/lib/active_support/broadcast_logger.rb:231:in `dispatch'

activesupport-7.1.4.1/lib/active_support/broadcast_logger.rb:134:in `error'

/var/www/discourse/plugins/discourse-chatbot/lib/discourse_chatbot/message/message_reply_creator.rb:38:in `rescue in create'

/var/www/discourse/plugins/discourse-chatbot/lib/discourse_chatbot/message/message_reply_creator.rb:11:in `create'

/var/www/discourse/plugins/discourse-chatbot/app/jobs/regular/chatbot_reply.rb:150:in `execute'

/var/www/discourse/app/jobs/base.rb:322:in `block (2 levels) in perform'

rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'

rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `with_connection'

/var/www/discourse/app/jobs/base.rb:309:in `block in perform'

/var/www/discourse/app/jobs/base.rb:305:in `each'

/var/www/discourse/app/jobs/base.rb:305:in `perform'

sidekiq-6.5.12/lib/sidekiq/processor.rb:202:in `execute_job'

sidekiq-6.5.12/lib/sidekiq/processor.rb:170:in `block (2 levels) in process'

sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:177:in `block in invoke'

/var/www/discourse/lib/sidekiq/pausable.rb:132:in `call'

sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:179:in `block in invoke'

sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:182:in `invoke'

sidekiq-6.5.12/lib/sidekiq/processor.rb:169:in `block in process'

sidekiq-6.5.12/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch'

sidekiq-6.5.12/lib/sidekiq/job_retry.rb:113:in `local'

sidekiq-6.5.12/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch'

sidekiq-6.5.12/lib/sidekiq.rb:44:in `block in <module:Sidekiq>'

sidekiq-6.5.12/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch'

sidekiq-6.5.12/lib/sidekiq/processor.rb:263:in `stats'

sidekiq-6.5.12/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch'

sidekiq-6.5.12/lib/sidekiq/job_logger.rb:13:in `call'

sidekiq-6.5.12/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch'

sidekiq-6.5.12/lib/sidekiq/job_retry.rb:80:in `global'

sidekiq-6.5.12/lib/sidekiq/processor.rb:124:in `block in dispatch'

sidekiq-6.5.12/lib/sidekiq/job_logger.rb:39:in `prepare'

sidekiq-6.5.12/lib/sidekiq/processor.rb:123:in `dispatch'

sidekiq-6.5.12/lib/sidekiq/processor.rb:168:in `process'

sidekiq-6.5.12/lib/sidekiq/processor.rb:78:in `process_one'

sidekiq-6.5.12/lib/sidekiq/processor.rb:68:in `run'

sidekiq-6.5.12/lib/sidekiq/component.rb:8:in `watchdog'

sidekiq-6.5.12/lib/sidekiq/component.rb:17:in `block in safe_thread'

그리고 μ‚¬μ΄νŠΈλ₯Ό μ™„μ „νžˆ λ‹€μ‹œ κ΅¬μΆ•ν•œ κ±΄κ°€μš”?

ν”ŒλŸ¬κ·ΈμΈμ„ μ—…κ·Έλ ˆμ΄λ“œν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œλ„ μΆ©λΆ„ν–ˆμ„ ν…λ°μš”.

ν˜„μž¬ μ‚¬μš© 쀑인 버전은 λ¬΄μ—‡μΈκ°€μš”? ν”ŒλŸ¬κ·ΈμΈκ³Ό Discourse λͺ¨λ‘μš”.

이 μˆ˜μ • 사항을 λ°°ν¬ν•˜κ³  μ—…κ·Έλ ˆμ΄λ“œν•œ ν›„, ν•΄λ‹Ή 문제λ₯Ό μž¬ν˜„ν•  수 μ—†μŠ΅λ‹ˆλ‹€(ν•˜μ§€λ§Œ κ·Έ μ „μ—λŠ” λΆ„λͺ…νžˆ μž¬ν˜„ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€).

1개의 μ’‹μ•„μš”

μ™„μ „ν•œ μž¬λΉŒλ“œ 이후에 μž‘λ™ν•©λ‹ˆλ‹€. μ‹œκ°„ λ‚΄μ–΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

2개의 μ’‹μ•„μš”

졜근 μ—…λ°μ΄νŠΈ 이후 봇이 응닡을 λ©ˆμΆ”κ³  λ‹€μŒκ³Ό 같은 였λ₯˜λ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€:

Chatbot: λ¬Έμ œκ°€ λ°œμƒν–ˆμ§€λ§Œ ν•œλ„κΉŒμ§€ μž¬μ‹œλ„ν•©λ‹ˆλ‹€: DiscourseChatbot::OpenAiBotBasic μΈμŠ€ν„΄μŠ€μ—μ„œ 둜컬 λ³€μˆ˜ λ˜λŠ” λ©”μ„œλ“œ resκ°€ μ •μ˜λ˜μ§€ μ•ŠμŒ

Job exception: DiscourseChatbot::OpenAiBotBasic μΈμŠ€ν„΄μŠ€μ—μ„œ 둜컬 λ³€μˆ˜ λ˜λŠ” λ©”μ„œλ“œ resκ°€ μ •μ˜λ˜μ§€ μ•ŠμŒ

이 였λ₯˜μ— λŒ€ν•΄ μ•„μ‹œλŠ” 점이 μžˆμœΌμ‹ κ°€μš”?

2개의 μ’‹μ•„μš”

무엇이 λ¬Έμ œμΈμ§€ μ§μž‘μ΄ κ°€λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. ν™•μΈν•΄μ„œ λ‹€μ‹œ μ•Œλ €λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

μΆ”μΈ‘μ»¨λŒ€, RAG λ΄‡μ—λŠ” λ¬Έμ œκ°€ μ—†λ‚˜μš”?

1개의 μ’‹μ•„μš”

이제 μˆ˜μ •λ˜μ—ˆμ„ κ²ƒμž…λ‹ˆλ‹€:

μ—…λ°μ΄νŠΈ ν›„ 확인해 μ£Όμ„Έμš”.

1개의 μ’‹μ•„μš”

정말 μ›ƒκΈ°λ„€μš”. μ œκ°€ λ‹€μ‹œ λΉŒλ“œν•œ μ§€ 반 μ‹œκ°„μ―€ 뒀에 또 μˆ˜μ •μ΄ μ μš©λμ–΄μš” :joy:

μˆ˜μ •ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. 타이밍은 쒀… :rofl:

2개의 μ’‹μ•„μš”

λ„€, 이제 μž‘λ™ν•©λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€.

2개의 μ’‹μ•„μš”

이 ν”ŒλŸ¬κ·ΈμΈμ„ λ§Œλ“€μ–΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! μ„€μΉ˜λ₯Ό μ™„λ£Œν–ˆκ³ , λͺ¨λ“  것이 잘 된 것 κ°™μŠ΅λ‹ˆλ‹€ (λͺ¨λ“  섀정이 있고, API ν‚€, OpenAI ν¬λ ˆλ”§μ΄ 있으며, 챗봇이 μ‚¬μš©μžλ‘œ μΆ”κ°€λ˜μ—ˆκ³ , μ €λ₯Ό κ³ μ‹ λ’° κ·Έλ£Ή 쀑 ν•˜λ‚˜λ‘œ μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€). ν•˜μ§€λ§Œ μ±„νŒ…λ°•μŠ€μ—μ„œ 응닡을 λ°›μ§€ λͺ»ν•©λ‹ˆλ‹€. 개인 μ±„νŒ…μ΄λ“  곡개 μ±„νŒ…μ΄λ“  λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€. μ œκ°€ 무엇을 잘λͺ»ν•˜κ³  μžˆλŠ”μ§€, μ–΄λ–€ 정보λ₯Ό κ³΅μœ ν•΄μ•Ό ν• μ§€ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

λ˜ν•œ, β€˜μ±—λ΄‡κ³Ό λŒ€ν™”ν•˜κΈ°β€™ λ²„νŠΌμ„ 클릭해도 아무 λ°˜μ‘μ΄ μ—†μŠ΅λ‹ˆλ‹€. :thinking:

말이 λΉ¨λžλ‹€. 봇 이름을 λ°”κΏ¨κΈ° λ•Œλ¬Έμ΄μ—ˆλ‹€. 이제 λͺ‡ 개의 λ©”μ‹œμ§€λ§Œ λ³΄λƒˆλŠ”λ° μ™œ ν• λ‹ΉλŸ‰μ— λ„λ‹¬ν–ˆλŠ”μ§€ μ•Œμ•„λ‚΄μ•Ό ν•œλ‹€.

1개의 μ’‹μ•„μš”

μ‚¬μš©μžκ°€ ν˜„μž¬ μ–΄λ–€ Chatbot μ‹ λ’° μˆ˜μ€€μ— μžˆλŠ”μ§€ ν™•μΈν•˜μ„Έμš”.

μ„Έ κ°€μ§€ "μ‹ λ’° μˆ˜μ€€"은 각각 Discourse 그룹의 λͺ¨μŒμž…λ‹ˆλ‹€.

일반적으둜 κ΄€λ¦¬μžλŠ” High에 ν¬ν•¨λœ 그룹에 μ†ν•˜λ„λ‘ μ„€μ •ν•©λ‹ˆλ‹€.

κΈ°λ³Έ μ „λž΅μΈ 쿼리 좔적(chatbot_quota_basis)으둜 μ‹œμž‘ν•˜λŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€. 이 섀정을 ν† ν°μœΌλ‘œ λ³€κ²½ν•œ 경우, 각 쿼리가 수천 개의 토큰을 μ†Œλͺ¨ν•  수 μžˆμœΌλ―€λ‘œ λͺ¨λ“  μ‹ λ’° μˆ˜μ€€μ˜ κΈ°λ³Έ ν• λ‹ΉλŸ‰μ„ 크게 λŠ˜λ €μ•Ό ν•©λ‹ˆλ‹€. 기본값은 쿼리 처리λ₯Ό μ§€μ›ν•˜λ„λ‘ μ„€μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

λ„€, μ €λŠ” κ³ μ‹ λ’° 그룹에 속해 μžˆμŠ΅λ‹ˆλ‹€. 그리고 ν• λ‹ΉλŸ‰ 기쀀을 쿼리둜 μ„€μ •ν•΄ λ‘μ—ˆμŠ΅λ‹ˆλ‹€. 챗봇이 μ§ˆλ¬Έμ— ν•˜λ‚˜λ₯Ό λ‹΅λ³€ν•œ ν›„ λ°”λ‘œ λ‹€μŒκ³Ό 같이 ν‘œμ‹œν–ˆμŠ΅λ‹ˆλ‹€: *


*

1개의 μ’‹μ•„μš”

ν•΄λ‹Ή 트리거 λ²„νŠΌμ„ 눌러 sidekiqμ—μ„œ μΏΌν„° 리셋 μž‘μ—…μ„ μ‹€ν–‰ν•΄ λ³΄μ„Έμš”:

κ·Έ ν›„ λ΄‡μ—κ²Œ 남은 μΏΌν„°κ°€ μ–Όλ§ˆμΈμ§€ λ¬Όμ–΄λ³΄μ„Έμš”.

1개의 μ’‹μ•„μš”

λ™μž‘ν•©λ‹ˆλ‹€! 정말 κ°μ‚¬ν•©λ‹ˆλ‹€!

2개의 μ’‹μ•„μš”

μ’‹μ•„μš”!

ν•˜μ§€λ§Œ μ•„, Ro-Bot이 거짓말을 ν–ˆλ„€μš” (이것은 LLM의 ν•œκ³„μž…λ‹ˆλ‹€).

μ‹œμŠ€ν…œ ν”„λ‘¬ν”„νŠΈμ— μΆ”κ°€ν•˜μ§€ μ•ŠλŠ” ν•œ Ro-Bot은 이λ₯Ό μ•Œ 수 μ—†μœΌλ©°, μ–΄λ–€ 쿼리든 μΏΌν„°λ₯Ό μ†Œλͺ¨ν•˜κ²Œ λ©λ‹ˆλ‹€ (μΏΌν„°κ°€ μ†Œμ§„λ  λ•ŒκΉŒμ§€).

2개의 μ’‹μ•„μš”