지난번에는 어느정도 구체적인 구조를 가진 문서를 로드하여 테스트해 보았고 문서에 없는 내용 질문 시에 정보가 없다는 대답을 하기도 했다.
사실 정확한 대답을 얻기 위해서는 정확한 질문이 중요한데, 이번에는 질문을 튜닝하고, langchain 에 적용해 보도록 한다.
제9조(홈페이지 등 공개용 웹 서버 관리) 의 내용을 묻는 질문을 한다.
"(홈페이지 등 공개용 웹 서버 관리)" 는 빼고 해보자.
query = "제9조 내용은?"
from pprint import pprint
retriever = pinecone_database.as_retriever(search_kwargs={"k":4})
result = retriever.invoke(query)
pprint(result)
일단 아래와 같이 쿼리 결과 후보군이 나오긴 했다...
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(
llm,
retriever=retriever,
chain_type_kwargs={"prompt": prompt}
)
ai_message = qa_chain({"query": query})
ai_message
이 뭔 개소리야(?)... 전혀 엉뚱한 답변을 주는 llama3.2:3b...
분명 원본 내용은 이러한데... 아예 검색이 안된듯 하다.
제9조(홈페이지 등 공개용 웹 서버 관리)
① 시스템관리자는 홈페이지 등 공개용 웹 서버는 방화벽 등 침입차단시스템을 설치하여 내부망의 전산자원을 보호하여야 한다.
② 시스템관리자는 서버에 접근할 수 있는 사용자계정을 제한하며 불필요한 계정들은 삭제한다.
③ 시스템관리자는 홈페이지 구축·운영 시 자체 보안성 검토를 거쳐 내용을 구성하며 이후 개인정보와 같은 중요 자료가 공개되지 않도록 한다.
④ 시스템관리자는 보안사고에 대비하여 서버에 저장된 자료의 철저한 백업체계를 구축한다.
# As-is
# query = "제9조 내용은?"
# 원문과 똑같이 만들어 보자.
query = "제9조(홈페이지 등 공개용 웹 서버 관리) 내용은?"
...
...
...
# 결과는 아래와 같다.
{'query': '제9조(홈페이지 등 공개용 웹 서버 관리) 내용은?',
'result': '제9조에 설명된 내용은 웹 서버 관리의 책임 및 보안 measures를 포함한 시스템 관리자의義務와 시스템 사용자들의 권리와義務를 규정합니다. 특히, 시스템 관리자는 정보통신시스템을 이용하기 위한 사용자 계정을 발급하고 비인가자에게 불필요한 서비스를 허용하지 않도록 보안 기능을 설정해야 합니다.'}
내용을 대충 보면 이런데... 뭔가 아주 정확하지는 않지만 맥락을 이해하고 나름 정성스럽게(?) 써준 흔적이 보인다.
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
# "제9조" 를 "제9조(홈페이지 등 공개용 웹 서버 관리)" 로 바꿔주는 과정
dictionary = ["목차를 나타내는 표현 -> (홈페이지 등 공개용 웹 서버 관리) 추가"]
# prompt 다시 만들기.
prompt = ChatPromptTemplate.from_template(f"""
사용자의 질문을 보고, 우리의 사전을 참고해서 질문을 변경해 주세요.
만약 변경할 필요가 없다고 판단된다면, 사용자의 질문을 변경하지 않아도 됩니다.
사전 : {dictionary}
질문 : {{question}}
""")
# prompt 로 받은 llm 을 파싱해라...
dictionary_chain = prompt | llm | StrOutputParser()
# 질문을 확인
new_question_test = dictionary_chain.invoke({"question":query})
new_question_test
# 결과
'제9조(홈 页面 등 공개용 웹 서버 관리) 내용을 참고해 보겠습니다.\n\nHOME PAGE를 관리하는 방법은 다음과 같습니다.\n\n1. **HOME PAGE의 콘텐츠 관리** * HOME_PAGE에 포함된 모든 콘텐츠가 관리될 수 있도록 필요한 파일 및 디렉터리를 생성합니다. * 콘텐츠를 관리할 수 있는 파일 형식을 사용하도록 합니다.\n2. **HOME PAGE의 URL 관리** * HOME_PAGE에 대한 URL이 정상적으로 작동하는지 확인합니다. * URL이 정상적으로 작동하지 않는 경우, URL을 수정하거나 URL을 추가하는 방법을 파악하고, URL을 수정하거나 추가할 수 있는 권한을 부여합니다.\n3. **HOME PAGE의 접근성 관리** * HOME_PAGE에 대한 접근성이 보장되는지 확인합니다. * HOME_PAGE에 대한 접근성이 보장되지 않는 경우, HOME_PAGE에 대한 접근성을 보장하기 위한 방법을 파악하고, HOME PAGE에 대한 접근성을 보장할 수 있는 권한을 부여합니다.\n\nHOME PAGE를 관리하는 방법은 위의 방법으로 확인할 수 있습니다.'
제9조 뒤에 문자열이 붙긴 했는데 뭔가 이상하다. 중국어도 보이고... 횡설수설하고 있다... 질문 뒤에 엉뚱한 말까지 붙고 아주 그냥 난리가 났다...
이건 llama3.2:3b 가 내가 요청한 질문 바꾸기 작업을 제대로 수행하지 못한 탓이다... 이래서 테스트가 참 어렵다...
# LCEL 로 dictionary_chain 과 기존 qa_chain 묶기
new_qa_chain = {query : dictionary_chain} | qa_chain
ai_message = new_qa_chain.invoke({"question" : query})
# 결과
{'query': "제9조에 관한 내용은 다음과 같습니다.\n\n제9조(홈一页 등 공개용 웹 서버 관리)\n\n* homepage, public server management과 관련된 내용을 포함하는 제9조는 '목차를 나타내는 표현 -> (홈페이지 등 공개용 웹 서버 관리) 추가'로 변형되었습니다.",
'result': '제9조에 관한 내용은 스팸 메일 차단 시스템 운영 및 정보 유출 방지를 포함하여 개인용 컴퓨터 및 비문서 자료의 보안 관리를 위한 규칙과 절차를 detailing합니다.'}
횡설수설 하는건 여전하고 불필요하다고 느끼는 문구도 많이 포함되어 있다.
그래도 질문 변경 이전의 결과보다는 나름(?) 만족스러운 결과물을 얻을 수 있었다.
질문을 조작하는 일도 llm 의 영역이라 결국 llm의 성능이나 정확도에 따라서 결과가 달라질 것이다. 이건 그냥 단순히 구동 확인 정도의 레벨이라 어느정도 예측하고 넘기겠지만 실제 프로덕션 레벨에서는 llm 의 역할이 중요해질 듯...