23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
OpenLLM 스터디 모임 경과를 정리하면서 현재까지 구현된 Advanced RAG 챗봇 내용을 함께 공유드립니다.
최초 모델은 EEVE-Korean-Instruct-10.8B-v1.0-GGUF 를 사용
임베딩 모델은 BAAI/bge-m3 사용
PDF 로딩에는 PyPDFLoader() 이 유연하다
post/pre retriever 를 사용하면 성능이 향상된다
방장을 포함한 멤버 7명 중 6명이 현업에서 사용할 수 있는 수준의 코드 구현 또는 설계 완료
지금 까지 Advanced RAG의 기법 중 post retrieval에 해당하는 BM25 , reranking을 사용해 봤는데요
이번은 pre retrieval 기법 중 하나인 multi-query 를 적용 해 보았습니다.
LLM에 query를 input으로 주어, 주어진 query와 유사한 n 개의 query를 생성.
이 n+1개의 query로 retrieval 하여 정확도를 높이는 방법 입니다.
사용하고 있는 llamaIndex는 multi query가 구현 되어 있지 않음
하기와 같이 multi query class를 구현하여 이를 처리 하였음
특이 사항은 LLM이 주는 답변을 parsing해야 하는 수고를 줄이기 위해
prompt에 json 형식으로 주기를 요청했고 prompt 말미에 하기와 같이 올바른
json 방식을 유도 하였음
[
{{ "문장":
class MultiQueriesRetriever:
def __init__(self, base_retriever, model, model_name):
self.base_retriever = base_retriever
self.model = model
self.model_name = model_name
def _get_top_n_unique(self,topks, n):
sorted_topks = sorted(topks, key=lambda x: x.score, reverse=True)
unique_nodes = []
seen_ids = set()
for node_with_score in sorted_topks:
if node_with_score.id_ not in seen_ids:
unique_nodes.append(node_with_score)
seen_ids.add(node_with_score.id_)
if len(unique_nodes) == n:
break
return unique_nodes
def _gen_queries(self, question) -> List[str]:
prompt = f"""주어진 문장에 대해 동일한 내용을 갖는 유사한 한글 문장 5개를 생성합니다. json 형태로 생성해 주세요. json 내용이외의 내용은 생성하지 마세요.
문장: {question}
[
{{ "문장": """
res = self.model.chat.completions.create(
model=self.model_name,
messages=[
{"role": "system", "content": "당신은 한글 생성 모델입니다. 요청한 내용에 맞게 문장을 생성해 주세요. "},
{
"role": "user",
"content": prompt
}
],
temperature=0.,
max_tokens=512,
top_p=1
)
questions=[question]
try:
responses=json.loads(res.choices[0].message.content)
for i,element in enumerate(responses):
questions.append(element['문장'])
except:
print(f'{res=} not proper response from llm')
return questions
def get_topk(self,question,n):
questions=self._gen_queries(question)
topks=[]
for i,q in enumerate(questions):
topks+=self.base_retriever.as_retriever(similarity_top_k=n).retrieve(q)
topks=self._get_top_n_unique(topks,n)
return topks첨부 중 multiquery.py 와 chatbot.py 만 기존 4차 구현 대비 수정 되었습니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.