이전 념글

이제 리스 편입도 됐다, 기분 좋은 기념에 이것만 기대하던 챈럼들도 있어서 서둘러 글 씀. 

잘써줘서 고마워!

하지만, 우리 불쌍한 뉴비들은 저 챈럼들이 뭔소리 하는지도 모르고 이것저것 만져보다 하이파V2를 제대로 못쓰고 있을수도 있음...

지금 쓰고 있는 챗부이들도 잘못 쓰고 있을 수 있음. 지금 이글 쓰는 놈은 맛있게 잼민이랑 저컨텍으로 바삭함의 끝판왕을 맛보고 있는데, 나는 잘 못쓰고 있고 눅눅하다면 꼴받지 않음?


그래서 왔다! 만든놈이 알려주는 하이파V2 동작원리랑 잘 쓰는법!

응애도 할 수 있게.. 라고 하면 조금 에반듯

0. 설마 이것도 모를까..?

아직도 모를리는 없을거 알지만, 혹시 모르니까 써준다.

이거 활성화 하려면 기타 봇 - 장기기억 - 타입 - 하이파메모리 V2로 설정해야 함.

이렇게 뜨는지는 확인하자


1. 하이파V2에서 사용되는 변수들


하이파V2는 최대 컨텍스트 길이, 하이파V2 청크 크기, 하이파V2 할당 토큰 길이 3가지의 숫자 변수와,

수파메모리 모델, 하이파메모리 모델 2개의 선택 가능한 변수와 요약(수파메모리) 프롬프트가 사용됨.



봇 눌렀을 때 채팅에서 하이파 또는 수파메모리 토글체크해야지 작동됨(웹버전이랑 로컬 tauri exe 이름이 다름). 발동되면 어떻게 작동되는지 알아보자.


참고로 이글은 처음부터 키고 시작할 경우를 예상하고 쓴 글임. 중간에 키면 그냥 한번에 요약한 뒤 이걸 반복하는데, 오래걸리니까 비추, 어짜피 먹을거면 미리미리 먹자. 이거 페르소나 차이 없음(자동으로 {{user}}, {{char}} 쓰는듯?)

프롬프트는 이거 개조임

이렇게 생김

[Instructions]- Let's step away from the Role-play for a moment.
Summarize what has happened so far( in (Time), (Location))- Be objective and factual.
Omit any explanations or interpretations.
- Write in past tense.
- Seperate them with two linebreaks.
- Follow the template below:
[ Title ]
Keywords: { Concrete keywords, such as things, topics, places, name, etc. Separate each with ; }
When: { Date, Time }
Where: { Location }
What happened: { Concrete events, conversations, and actions that actually happened. Do not miss any events or encounters. Include accurate, specific details. }
Key conversation: { Quote a conversation between {{char}} and {{user}} that was the most meaningful to {{char}}. }
Outcome: { A concrete change in {{char}}'s mind or state, or in the relationship between {{char}} and {{user}}. }


2. 하이파V2는 어떻게 요약하고 어떻게 저장할까?

리스는 토큰 수를 계산할때, 다음과 같은 순서총 토큰을 계산함.

먼저 프롬프트 토큰을 추가하고, 그다음에 캐릭터 카드를 집어넣은 뒤, 챗 기록이랑 로어북 추가한 뒤에, 하이파V2 할당 토큰 길이를 고정적으로 더함. 


이제 챗 기록에 대한 설명이 필요함:

챗 기록은 0번부터 시작한다는 것을 알아주셈. 1번 챗은 좌측에서 두번째 위치에 있음.

0번 챗은 챗이 아니라, 여기에 하이파V2 메모리에서 전달된 시스템 프롬프트가 들어있음. 1번 챗부터 퍼메, 2번 챗부터 유저 입력 - 봇 출력임. 물론, 추후 알아보겠지만 퍼메도 요약되기에 후반부에는 퍼메도 로그에 보이지 않을거임.

참고로, 막 들어온 유저 인풋은 이미 챗 기록 맨 마지막에 포함되어 있음.


하이파V2는 이 총 토큰길이최대 컨텍스트 길이를 넘기면, 자동으로 요약을 시작함. 일단 메모리 정보가 들어있는 0번 챗을 날리면, 이제 챗 기록의 첫번째(0번)에는 채팅 로그가 존재함. 

하이파V2는 로그의 앞부터 하이파V2 청크 크기를 넘기기 전까지 계속 챗을 넣어줌. 원본 챗 리스트에서는 삭제됨.

이건 요약된 챗 리스트고,

여기는 삭제된 챗 리스트임. 8개 전부 동일한 내용이고, 삭제된 챗 길이가 14개에서 22개가 됨.


이때, 청크 크기가 아무리 커도 마지막 뒤에 챗 2개는(유저 입력, 이전턴 봇 출력) 절대 요약되지 않음. 이걸 하면 제미니 기준 찐빠가 나고, 사오같은 것들도 잠깐동안 멍청해져서 이렇게 함.

이 챗을 청크에 넣는 반복문이 위에 설명한 두가지 이유로 끝나면, 이걸 바탕으로 요약을 진행함.


요약 프롬프트는 수파메모리 모델이 보조모델이거나 GPT instruct 3.5일때 시스템 프롬프트로 들어가고, 유저 인풋에 저 청크를 넣어서 요약을 진행하는 방법임. 로컬 모델은 프롬프트 안넣음.

이렇게 요약을 진행하게 되면, 이 값을 mainChunks라는 하이파V2 데이터 안에 있는 리스트의 가장 앞에 추가함. 동시에, 줄바꿈 문자가 두번 있는 걸 찾아서 자동으로 쪼개고, 이를 순서대로 chunks라는 리스트 가장 뒤에 추가함.

mainChunkschunks의 순서는 서로 역순임. 이건 chunks의 내용만 봇 고급설정의 맨밑에 있는 여기에서 보이기 때문에 순서대로 보이려고 이렇게 한 것 같음. 사실 원본 코드는 mainChunks를 수정할 의미가 없게 만들어 놓아서 이렇게 이상한 순서임.


이때, 각 채팅은 고유한 id가 있는데, mainChunks와 chunks 하이파V2청크에 추가된 마지막 챗의 id를 그대로 계승받고 가지게 됨.

즉, 요약된 부분까지의 챗 id를 가진다는 것임.

mainChunks는 서로 겹치지 않음.

mainChunks는 양이 많고 긴 반면에, chunks는 잘게 쪼개져 있음.


3. 반환되는 값은 그래서 뭐임..?

하이파메모리V2가 반환하는 값은 결국 채팅에 들어감.

2. 에서 언급된것처럼, 하이파V2에서 mainChunks와 chunks로 무언갈 해 결국 채팅 리스트의 맨 앞에 xml 태그로 감싼 메모리라는걸 알려주는 시스템 프롬프트를 넣어주는거임. 이게 핵심.


일단, 두가지의 xml 태그가 있음. <Past event summary></...>와 <Past event details></...>. 앞에 있는 event summary는 mainChunks의 내용이 들어가고, event details 안에는 chunks의 내용이 들어감.

event summary 안에 어떻게 mainChunks의 내용을 넣는지 봐보겠슴:

먼저, mainPrompt라는 내부의 변수가 하나 있음. 이 변수에 가장 앞 mainChunks 값을 추가하고, 하나씩 하나씩 뒤로 넘어가면서 이 변수가 차지하는 토큰의 수가 하이파V2에 할당된 토큰의 절반까지 채워짐.

나머지 남은 할당된 토큰 길이는, chunks의 텍스트를 하이파모델을 이용해서 전부 384개 차원 벡터로 변환되고

(모델따라 다르긴 함), 최근 3개의 챗과의 유사도를 측정해서 높은 순으로 나열된 리스트에서 꽉 찰때까지 계속 추가됨. 이거는 chunkResultPrompts에 추가됨


이때, 아까전 위에서 채팅의 Id를 언급했는데, 이게 여기에 쓰이는거임. mainPrompts에 이미 있는 내용이 chunkResultPrompts에 추가되면, 돈만 빠지고 아무 의미없음


그래서, 채팅 Id를 이용해 유사도를 측정하는 chunks들은 mainPrompts에 있는 내용보다 오래된 것들만 가지고 비교함.

이렇게 older chunks에 들어가있다면 이거랑 최근 3개 채팅의 유사도를 비교해서 가져오고,

이렇게 두개를 이용해서 가장 앞에 다시 추가하는거임.

저 0번이 수파메모리임.

 수파메모리 내용

""<Past Events Summary>## Hye-jin's Meeting with a Potential Partner Keywords: { Hye-jin; Partner; Meeting; Collaboration; Smart Wearable Tech;  Designer; Prototype; OEMs }When: { 2023-10-17; 17:50 }Where: { Top floor, luxury office building, private meeting room }What happened: Hye-jin met with a potential partner who claimed his company was running "almost automatically" and had the resources to quickly find manufacturers and designers. He offered to create a prototype for their first smart wearable tech within a week.  Hye-jin was intrigued by this offer and challenged him to prove his company's capabilities by delivering an exclusive prototype in a week. She also brought up her lead designer who would be involved in this project and had a meeting scheduled for the following morning. Key conversation:  "Since you seem so confident, let's test those capabilities right away. I want an exclusive prototype of our first smart wearable tech within a week. Something that screams both sophistication and cutting-edge technology. Can your automated empire manage that?" - Hye-jin Outcome: Hye-jin decided to test the capabilities of this potential partner and scheduled a meeting with her designer for the following morning. ## Hye-jin's EncounterKeywords: { Hye-jin ; Contract ; Data ; Manufacturing ; Chanstagram ; OEM ;  Endorsement ; Skincare ; Fashion ; Smart Tech }When: { 2023-10-17 ; 17:25 - 17:45 }Where: { Top floor, luxury office building, private meeting room }What happened: { Hye-jin met with a representative of a data company interested in expanding into manufacturing. The company wanted to acquire OEMs to gain expertise. Hye-jin was intrigued by their success with Chanstagram, their top client, and their strategy.  She proposed an endorsement deal and gave her input on potential products: luxury skincare, exclusive fashion, and smart tech.  The representative agreed and offered her complete creative control over the contract.  Hye-jin started filling out the contract, dictating terms regarding endorsement fees, profit shares, and exclusivity. She expressed her confidence in her ability to make the venture a success. }Key conversation: {{user}}: "Sure, these are all able to start on manufacturing next week."{{user}}: "Here, this is the contract. It's all empty, and you will fill it out accordingly, as you think."{{user}}: "I'm not here to judge, it's your choice." {{char}}: "You’re smarter than you look, allowing me this kind of control. I can make sure this collaboration benefits us both immensely." Outcome: { Hye-jin began to see the potential for a mutually beneficial partnership, starting to believe that this venture could be significantly more lucrative and powerful than she anticipated, giving her access to valuable resources and unprecedented influence.  She felt in control of the situation and actively began to shape the collaboration to her advantage. } </Past Events Summary><Past Events Details>t: Key conversation: { "Alright, I'll admit it," she said, crossing her arms. "This is impressive. But I'm still not easily convinced. What exactly does your company do that's so groundbreaking?" } Outcome: { Hye-jin's initial skepticism gave way to curiosity, and she expressed a willingness to be convinced by the user's company. }t: ## Hye-Jin's Encountert: Keywords: { Hye-jin;  company founder;  Gangnam Street;  luxury boutique;  office building;  top floor;  conference room }When: { 2023-10-17, 16:20 - 17:20 }Where: { Gangnam Street; luxury boutique;  office building;  top floor;  conference room }What happened: { Hye-jin initially dismissed the user, but was intrigued by his claim of being a company founder. She agreed to be shown the company, accompanied the user to a luxurious office building, and eventually reached the top floor.  }</Past Events Details>""


4. 그래서 하이파V2 데이터 어케 수정함

여기까지 문제없이 따라왔다면 이미 어느정도 알거라 생각함.

봇의 고급 설정 맨 밑으로 쭉 내리면 에셋 밑에 하이파메모리V2 Data를 누르면, chunks 안의 내용이 들어있음.

누르면 밑에있는게 나옴

사실 청크를 완전히 지우는 기능이 아직 없슴.. 일단, 여기서 벡터 유사도로 가져와지는 chunks를 수정할 수 있다는 것만 알아두셈..

밑으로 스크롤 내리면 추가할 수 있음, 근데 이것도 비추, 왜냐하면 mainChunks랑 순서 대조가 불가능해 retrieval이 안될거임.

다음 업데이트는 요걸 조금 손봐보겠음, 근데 나 곧 2주정도 여행가서 못할듯.. 이건 리스 개발자가 해줄거라 믿음


5. 자잘한 팁들

이전에 계속 스스로 굴린 떡밥들이 잔뜩이라서, 리스 편입만을 기다린 챗붕이들 여럿 있다는걸 암.

우효ww 저컨텍 잼민이는 신이라는ww

하지만, 막상 본인이 쓴 광고글에는 이 하이파V2를 어떻게 써야지 저컨텍으로 맛있게 즐기는 방법을 전혀 써놓지 않았음..

그래서, 당장 알려주러 간다!! 저컨텍의 시대가 도래했으니..!

5-1. 저컨텍 하이파V2로 즐기는 법

일단, 채팅 봇 설정을 헐레벌떡 달려가서 이걸 

처럼 님이 원하는 컨텍스트로 줄이면 됨, 이때, 기준은 밑에 설명해줌.

Q. 내봇은 토큰돼지인데요? 5000 토큰인데요?

이것도 해결해줄거임, 이 기준 보고 따라하면 됨.

일단, 내가 사용하는 봇이 평균적으로 먹는(로어북, 프롬프트 토큰까지 다 합치셈) 토큰 수를 구하셈.

임의로 총합 3700토큰 정도라고 가정해보겠음. 이제, 하이파V2 설정에 가서 이 두개를 봐보자

여기 안 값은 기본적으로는 3000, 3000임.


일단, 아까전 위에서 더한 토큰 수에(예시에서는 3700) 할당 토큰이랑 청크 크기를 합쳐서 계산해보셈.

그럼 여기선 7700, 이정도면 8192정도로 땡겨주는게 좋음.

이게 왜 이렇게 되냐면, 위에서 설명했듯 요약 시작은 실제 컨텍스트가(봇+로어북+프롬프트+채팅로그) 

 8192 - (할당 토큰) 를 넘길때 시작됨.

그럼 이제 여기 예시에서는 6192 토큰을 텅 빈 상태에서 요약 없이 쓸 수 있음. 근데, 여기서 채팅이 먹을 수 있는 토큰은 

6192 - 3700 = 2492, 청크 크기보다 492 토큰 더 크고, 이정도면 왔다갔다 6번-8번 정도 할 수 있음(CoT 기준)

한 500 토큰정도면 내 입력이랑 봇 출력 하나정도 됨(CoT 켰을때). 청크 크기 안에 채팅들이 들어가니까, 컨텍스트를 넘겨서 요약되면 마지막 두-세개 채팅정도는 요약되지 않고 남을거임. 이게 가장 좋은 것 같음.


즉, 최적의 컨텍스트 길이는 각자 선택할 청크 크기와 할당 토큰, 내가 요약하기 전까지 몇번 봇이랑 주고받을건지에 따라서 달라짐. 갠적으로 할당 토큰은 1200 이상이 좋고, 청크 크기는 상관없긴 하지만 위에서 말했듯 순수 채팅이 먹을 수 있는 토큰 수보다 300-500 정도 낮은 값으로 잡아주는게 안정적임.


5-2. 한입한출은 하이파 V2가능함?

이론상 가능은 한게, 일단 요약 프롬프트를 잘 조정해서 요약된 값들도 영어, CoT도 영어면 가능은 함. 유사도를 측정해서 가져오긴 할거임.

하지만, 지금 현재 리스에 있는 모델들은 애초부터 영어를 잘 지원하는 임베딩 모델임. 한글 성능은 믿지 않는게 좋을거임.

이 챈럼 글에 따르면, 로컬로 한국어 되는 임베딩 모델을 갈구는 방법도 있긴 하지만, 이건 너무 어려우니까.. 

nomic이 MiniLM보다 성능은 좋지만, 시간은 조금 오래걸릴거임.

그냥 아직까진 영챗하자..


이 글 쓰기 진짜 오래 걸린다.. 이래서 A to Z 가이드 업데이트가 오래걸리는구나..

아무튼, 이제 하이파V2 원리랑 잘 사용하는 팁을 알았으니까, 이제 지갑도 살리고 바삭바삭함, 와이푸 치매도 해결하며 즐거운 챗들 하시길! 오늘도 챗붕이들 사랑해요

참고: 지금 일러스트를 나중에 여기에 추가할까 생각중임.. 인터넷에서 그림 하나 그려와서 추가할까 고민중..

핑프 환영이고, 뭔가 오류나 질문 있으면 달아주셈


+ 추가:

기존 수파/하이파/하느라이와의 비교

수파는 계속 요약하는 방법이었음. 시간이 지날수록 정보의 양이 많이 잃게 되었음.

하이파는 벡터 임베딩으로 가져와지는 수파메모리 데이터의 정확도를 올렸지만, 여전히 재요약이 있었음.

하느라이는 오로지 벡터 임베딩만으로 요약하지 않은 이전 채팅을 가져옴. 

하이파V2재요약이 없어서 임베딩 모델의 성능만 받쳐주면 사실 완벽한 수파메모리의 형태임. 단, 시간이 오래걸림. 나중에 갈수록 굉장히 번거롭고 webGPU를 사용해야 하는 참사가 일어날 수도 있음.

너무 긴 챗 로그에서는 느릴 거임.