본문 바로가기
AWS/SageMaker

SageMaker, Streamlit, Opensearch를 사용한 RAG챗봇 구성하기 4. FAQ with FAISS - Vector Store Test

by Hyeon Cloud 2023. 11. 6.

목차

SageMaker, Streamlit, Opensearch를 사용한 RAG챗봇 구성하기 1. KoSimCSE-RoBERTa를 사용한 한국어 문장 임베딩

SageMaker, Streamlit, Opensearch를 사용한 RAG챗봇 구성하기 2. KoSimCSE-RoBERTAa SageMaker Studio 테스트

SageMaker, Streamlit, Opensearch를 사용한 RAG챗봇 구성하기 3. KULLM(구름)모델 AWS Large Model Container DLC사용하여 배포하기

SageMaker, Streamlit, Opensearch를 사용한 RAG챗봇 구성하기 4. FAQ with FAISS - Vector Store Test

SageMaker, Streamlit, Opensearch를 사용한 RAG챗봇 구성하기 5. FAQ with OpenSearch - Vector Store Test

SageMaker, Streamlit, Opensearch 사용한 RAG챗봇 구성하기 6. OpenSearch Rag Chatbot Application with Streamlit

목표

앞서 생성한 SageMaker Embedding Vector 모델의 엔드포인트를 사용하여 FAQ 데이터셋에 대한 FAISS(Facebook AI Similarity Search) 임베딩을 생성해보도록 하겠습니다. 이를 활용하여 텍스트데이터의 유사성을 검색할 수 있게됩니다. 임베딩으로 검색된 정보를 기반으로 프롬프트 엔지니어링을 수행해보도록 하겠습니다.

%store -r endpoint_name_emb endpoint_name_text
try:
    endpoint_name_emb
    endpoint_name_text
except NameError:
    print("++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
    print("[ERROR] TASK-1, TASK-2 노트북을 다시 실행해 주세요.")
    print("++++++++++++++++++++++++++++++++++++++++++++++++++++++++")

KULLM 핸들러 작성

세이지메이커 엔드포인트를 래핑하여 핸들러로 작성하겠습니다.

! pip uninstall sqlalchemy -y

Found existing installation: SQLAlchemy 1.4.0 Uninstalling SQLAlchemy-1.4.0: Successfully uninstalled SQLAlchemy-1.4.0 WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead:https://pip.pypa.io/warnings/venv

import sys
import IPython
%load_ext autoreload
%autoreload 2
sys.path.append('./utils') # src 폴더 경로 설정
import json
import boto3
import numpy as np
from inference_utils import Prompter
from typing import Any, Dict, List, Optional
from langchain.embeddings import SagemakerEndpointEmbeddings
from langchain.llms.sagemaker_endpoint import LLMContentHandler, SagemakerEndpoint
from langchain.embeddings.sagemaker_endpoint import EmbeddingsContentHandler

KULLM 엔드포인트 핸들러를 작성하겠습니다.

prompter = Prompter("kullm")
params = {
      'do_sample': False,
      'max_new_tokens': 512, #128
      'temperature': 1.0,  # 0.5 ~ 1.0 default = 1.0 높으면 랜덤하게 자유도. 다음 생성 문장 토큰의 자유도 
      'top_k': 0,
      'top_p': 0.9,
      'return_full_text': False,
      'repetition_penalty': 1.1,
      'presence_penalty': None,
      'eos_token_id': 2
}

class KullmContentHandler(LLMContentHandler):
    content_type = "application/json"
    accepts = "application/json"

    def transform_input(self, prompt: str, model_kwargs={}) -> bytes:
        '''
        입력 데이터 전처리 후에 리턴
        '''
        context, question = prompt.split("||SPEPERATOR||") 
        prompt = prompter.generate_prompt(question, context)

        #print ("prompt", prompt)
        payload = {
            'inputs': [prompt],
            'parameters': model_kwargs
        }
                           
        input_str = json.dumps(payload)
        
        return input_str.encode('utf-8')
    

    def transform_output(self, output: bytes) -> str:
        
        response_json = json.loads(output.read().decode("utf-8"))              
        generated_text = response_json[0][0]["generated_text"]
        
        return generated_text

앞서 배포한 KULLM 모델 엔드포인트를 설정합니다.

aws_region = boto3.Session().region_name
LLMTextContentHandler = KullmContentHandler()
seperator = "||SPEPERATOR||"

llm_text = SagemakerEndpoint(
    endpoint_name=endpoint_name_text,
    region_name=aws_region,
    model_kwargs=params,    
    content_handler=LLMTextContentHandler,
)

KoSimCSE-RoBERTa 핸들러 작성

KoSimCSE-RoBERTa 엔드포인트 핸들러를 작성하겠습니다.

파라미터는 다음과 같습니다.

  • texts : 임베딩을 생성할 텍스트 리스트
  • chunk_size : 한번의 리퀘스트에 그룹화 될 입력 텍스트 수

리턴은 다음과 같습니다.

  • 각 text에 대한 임베딩 리스트 변환
class SagemakerEndpointEmbeddingsJumpStart(SagemakerEndpointEmbeddings):
    def embed_documents(self, texts: List[str], chunk_size: int=1) -> List[List[float]]:
        """Compute doc embeddings using a SageMaker Inference Endpoint.

        Args:
            texts: The list of texts to embed.
            chunk_size: The chunk size defines how many input texts will
                be grouped together as request. If None, will use the
                chunk size specified by the class.

        Returns:
            List of embeddings, one for each text.
        """
        results = []
        _chunk_size = len(texts) if chunk_size > len(texts) else chunk_size
        
        print("text size: ", len(texts))
        print("_chunk_size: ", _chunk_size)

        for i in range(0, len(texts), _chunk_size):
            
            #print (i, texts[i : i + _chunk_size])
            response = self._embedding_func(texts[i : i + _chunk_size])
            #print (i, response, len(response[0].shape))
            
            results.extend(response)
        return results
class KoSimCSERobertaContentHandler(EmbeddingsContentHandler):
    
    content_type = "application/json"
    accepts = "application/json"

    def transform_input(self, prompt: str, model_kwargs={}) -> bytes:
        
        input_str = json.dumps({"inputs": prompt, **model_kwargs})
        
        return input_str.encode("utf-8")

    def transform_output(self, output: bytes) -> str:
        
        response_json = json.loads(output.read().decode("utf-8"))
        ndim = np.array(response_json).ndim    
        
        if ndim == 4:
            # Original shape (1, 1, n, 768)
            emb = response_json[0][0][0]
            emb = np.expand_dims(emb, axis=0).tolist()
        elif ndim == 2:
            # Original shape (n, 1)
            emb = []
            for ele in response_json:
                e = ele[0][0]
                emb.append(e)
        else:
            print(f"Other # of dimension: {ndim}")
            emb = None
        return emb

핸들러 작성앞서 배포한 KoSimCSE-RoBERTa 모델 엔드포인트를 설정합니다.

LLMEmbHandler = KoSimCSERobertaContentHandler()

llm_emb = SagemakerEndpointEmbeddingsJumpStart(
    endpoint_name=endpoint_name_emb,
    region_name=aws_region,
    content_handler=LLMEmbHandler,
)

FAISS 인덱스를 Vector Store와 연계하여 사용하기

FAISS(Facebook AI Similarity Search)

  • 밀집 벡터의 효율적인 유사성 검색과 클러스터링을 위한 라이브러리입니다. 이 라이브러리는 RAM에 들어가지 않을 수도 있는 어떤 크기의 벡터 세트에서도 검색할 수 있는 알고리즘을 포함하고 있습니다.
  • CPU(pip install faiss-cpu)와 GPU(pip install faiss-gpu) 모두에서 사용할 수 있습니다.
  • 유사성 검색 기본적인 유사성 검색 외에도, 유사성 점수를 반환하는 similarity_search_with_score와 같은 FAISS 특화 메서드가 있습니다.
  • 벡터 기반 검색 similarity_search_by_vector 메서드를 사용하여 임베딩 벡터를 파라미터로 전달할 수 있습니다.
  • 저장 및 로딩 FAISS 인덱스를 로컬에 저장하고 로딩하는 기능이 있어, 매번 인덱스를 생성할 필요가 없습니다.
  • 벡터 스토어 병합 두 개의 FAISS 벡터 스토어를 병합할 수 있습니다.
  • 필터링 지원 FAISS는 메타데이터를 기반으로 문서를 필터링하는 기능을 제공합니다.
  • 직렬화와 역직렬화 FAISS 인덱스를 바이트로 직렬화하고 역직렬화할 수 있습니다, 이는 데이터베이스에 인덱스를 저장할 때 유용합니다.

Vector Store

  • 비정형 데이터를 임베딩 벡터로 변환하여 저장하고, 쿼리 시에 해당 임베딩 벡터와 '가장 유사한' 임베딩 벡터를 검색하는 역할을 하는 저장소입니다.
  • 이는 텍스트 임베딩 모델과 연계하여 벡터를 생성하고 저장, 검색하는 기능을 제공합니다. 다양한 벡터 저장 옵션들이 있으며, 비동기 작업도 지원합니다.
! pip install sqlalchemy

Collecting sqlalchemy Obtaining dependency information for sqlalchemy fromhttps://files.pythonhosted.org/packages/26/54/6f2a9b21a9dc921181ae1084c35391c51b57daa11f88c830332a69298a62/SQLAlchemy-2.0.22-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata Using cached SQLAlchemy-2.0.22-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (9.4 kB) Requirement already satisfied: typing-extensions>=4.2.0 in /opt/conda/lib/python3.10/site-packages (from sqlalchemy) (4.8.0) Requirement already satisfied: greenlet!=0.4.17 in /opt/conda/lib/python3.10/site-packages (from sqlalchemy) (1.1.1) Using cached SQLAlchemy-2.0.22-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.0 MB) Installing collected packages: sqlalchemy Successfully installed sqlalchemy-2.0.22

from langchain.indexes import VectorstoreIndexCreator
from langchain.vectorstores import Chroma, AtlasDB, FAISS
from langchain.document_loaders.csv_loader import CSVLoader
from langchain.text_splitter import CharacterTextSplitter, RecursiveCharacterTextSplitter
import csv
csv.field_size_limit(100000000)
csv.field_size_limit()

데이터셋(신한은행 FAQ 데이터)를 받아 해제합니다.

dataset.zip

! unzip dataset.zip

Archive: dataset.zip creating: dataset/ inflating: dataset/fsi_smart_faq_ko.csv

loader = CSVLoader(
    file_path="./dataset/fsi_smart_faq_ko.csv",
    source_column="Source",
    encoding="utf-8"
)
context_documents = loader.load()
print(len(context_documents))

context_documents[0:3]

89

[Document(page_content='no: 89\nCategory: 타기관OTP 이용등록방법 알려주세요\nInformation: 타기관에서 발급받으신 OTP가 통합OTP카드인 경우 당행에 등록하여 이용가능합니다. \n[경로]\n- 인터넷뱅킹 로그인→ 사용자관리→인터넷뱅킹관리→OTP이용등록 \n- 신한 쏠(SOL) 로그인→ 전체메뉴→설정/인증→ 이용중인 보안매체선택→ OTP이용등록\n \n ※ OTP이용등록후 재로그인을 하셔야 새로 등록된 보안매체가 적용됩니다.\n\n기타 궁금하신 내용은 신한은행 고객센터 1599-8000로 문의하여 주시기 바랍니다.\ntype: 인터넷뱅킹\nSource: 신한은행', metadata={'source': '신한은행', 'row': 0}), Document(page_content='no: 88\nCategory: 공동인증서와 금융인증서 차이점이 무엇인가요?\nInformation: 공동인증서 (구 공인인증서)는 용도에 따라 은행/신용카드/보험용 무료 인증서와 전자거래범용(수수료 4,400원) 인증서가 있으며 유효기간은 1년입니다. \n공동인증서는 하드디스크나 이동식디스크, 휴대폰 등 원하시는 기기에 저장해서 이용할 수 있습니다.\n인증서를 저장한 매체에서는 인증서 비밀번호로 편리하게 이용할 수 있으나 다른 기기에서 이용하려면 기기마다 복사하거나 이동식디스크에 저장해서 휴대해야 하는 불편함이 있을 수 있습니다.\n\n금융인증서는 금융인증서는 금융결제원의 클라우드에 저장하여 이용하는 인증서로 발급/이용 시에 클라우드에 접속이 필요합니다.\n금융결제원 클라우드에 연결만 가능하다면 어디서든 편리하게 이용 가능하지만, PC나 USB, 휴대폰 등 다른 기기로 복사는 불가합니다.(유효기간 3년/발급 수수료 무료)\n※ 클라우드 계정 연결을 위해 휴대폰을 통한 ARS, SMS, 마이인포앱 인증 절차가 필요합니다.\ntype: 인증서\nSource: 신한은행', metadata={'source': '신한은행', 'row': 1}), Document(page_content='no: 87\nCategory: 금융인증서 해외에서 발급할 수 있나요?\nInformation: 해외에서도 인증서 발급 업무는 가능합니다. 다만, 금융인증서 저장을 위한 금융결제원 클라우드 계정 생성 및 연결이 필요한 업무로 해외연락처를 통한 ARS인증이 진행됩니다.\ntype: 금융인증서\nSource: 신한은행', metadata={'source': '신한은행', 'row': 2})]

FAISS 벡터 Index 생성

로드한 FAQ 컨텍스트 데이터로 벡터 인덱스를 생성합니다.

! pip install faiss-gpu

Installing collected packages: faiss-gpu Successfully installed faiss-gpu-1.7.2

index_creator = VectorstoreIndexCreator(
    vectorstore_cls=FAISS,
    embedding=llm_emb,
    #text_splitter=CharacterTextSplitter(chunk_size=700, chunk_overlap=0),
    #text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=200), 
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=200)
)
# 로버타 모델의 청크 크기에 종속되어있음. 청크 파라미터 확인
%%time
index = index_creator.from_loaders([loader])

text size: 90 _chunk_size: 1 CPU times: user 5.9 s, sys: 275 ms, total: 6.17 s Wall time: 18.3 s

# Save
index.vectorstore.save_local("./indexer/fsi_faq_indexer_ko")
index_ = FAISS.load_local("./indexer/fsi_faq_indexer_ko", llm_emb)
index_.index_to_docstore_id
#index_.docstore._dict[:10]
dict(list(index_.docstore._dict.items())[:5])

{'d9ce8cbb-3462-4df3-aa2d-8d17bf502148': Document(page_content='no: 89\nCategory: 타기관OTP 이용등록방법 알려주세요\nInformation: 타기관에서 발급받으신 OTP가 통합OTP카드인 경우 당행에 등록하여 이용가능합니다. \n[경로]\n- 인터넷뱅킹 로그인→ 사용자관리→인터넷뱅킹관리→OTP이용등록 \n- 신한 쏠(SOL) 로그인→ 전체메뉴→설정/인증→ 이용중인 보안매체선택→ OTP이용등록\n \n ※ OTP이용등록후 재로그인을 하셔야 새로 등록된 보안매체가 적용됩니다.\n\n기타 궁금하신 내용은 신한은행 고객센터 1599-8000로 문의하여 주시기 바랍니다.\ntype: 인터넷뱅킹\nSource: 신한은행', metadata={'source': '신한은행', 'row': 0}), '4252572a-3889-405d-80f1-326d490bfe2d': Document(page_content='no: 88\nCategory: 공동인증서와 금융인증서 차이점이 무엇인가요?\nInformation: 공동인증서 (구 공인인증서)는 용도에 따라 은행/신용카드/보험용 무료 인증서와 전자거래범용(수수료 4,400원) 인증서가 있으며 유효기간은 1년입니다. \n공동인증서는 하드디스크나 이동식디스크, 휴대폰 등 원하시는 기기에 저장해서 이용할 수 있습니다.\n인증서를 저장한 매체에서는 인증서 비밀번호로 편리하게 이용할 수 있으나 다른 기기에서 이용하려면 기기마다 복사하거나 이동식디스크에 저장해서 휴대해야 하는 불편함이 있을 수 있습니다.\n\n금융인증서는 금융인증서는 금융결제원의 클라우드에 저장하여 이용하는 인증서로 발급/이용 시에 클라우드에 접속이 필요합니다.\n금융결제원 클라우드에 연결만 가능하다면 어디서든 편리하게 이용 가능하지만, PC나 USB, 휴대폰 등 다른 기기로 복사는 불가합니다.(유효기간 3년/발급 수수료 무료)\n※ 클라우드 계정 연결을 위해 휴대폰을 통한 ARS, SMS, 마이인포앱 인증 절차가 필요합니다.\ntype: 인증서\nSource: 신한은행', metadata={'source': '신한은행', 'row': 1}), 'cc220d77-20d8-4582-ada0-922f2d53e7b7': Document(page_content='no: 87\nCategory: 금융인증서 해외에서 발급할 수 있나요?\nInformation: 해외에서도 인증서 발급 업무는 가능합니다. 다만, 금융인증서 저장을 위한 금융결제원 클라우드 계정 생성 및 연결이 필요한 업무로 해외연락처를 통한 ARS인증이 진행됩니다.\ntype: 금융인증서\nSource: 신한은행', metadata={'source': '신한은행', 'row': 2}), 'a98f067d-e8d0-46e6-869f-8debcccdee0e': Document(page_content='no: 86\nCategory: 클라우드에 보관 중인 인증서는 얼마나 유지 되나요?\nInformation: 정상적으로 이용하실 경우 금융인증서의 유효기간은 3년이며, 1년 동안 클라우드 이용 이력이 없는 경우는 안전한 이용을 위하여 클라우드 계정 및 저장된 모든 인증서가 삭제됩니다.\ntype: 금융인증서\nSource: 신한은행', metadata={'source': '신한은행', 'row': 3}), '8cd7e575-b01f-4df5-8d3b-f17ee4b8c6df': Document(page_content='no: 85\nCategory: 금융인증서 발급대상은 누구인가요?\nInformation: 금융인증서는 은행 등의 금융회사에서 실명 확인된 고객을 대상으로 안전하게 발급되며 신한은행 온라인서비스 가입 고객이면 발급가능합니다. 다만 금융인증서는 PC하드디스크나 휴대폰 등에 파일형태로 저장하는 방식이 아닌 금융결제원의 클라우드에 저장되기 때문에 금융결제원의 클라우드 연결을 위해 문자, ARS, 마이인포 앱을 통한 인증 절차가 진행됩니다.\ntype: 금융인증서\nSource: 신한은행', metadata={'source': '신한은행', 'row': 4})}

len(list(index_.docstore._dict.items()))

90

🦜🔗LangChain QnA사용하기

from langchain import PromptTemplate
from langchain.chains.question_answering import load_qa_chain
prompt_template = ''.join(["{context}", seperator, "{question}"])
PROMPT = PromptTemplate(template=prompt_template, input_variables=["context", "question"])
chain = load_qa_chain(llm=llm_text, chain_type="stuff", prompt=PROMPT, verbose=True)

# 이 함수는 주어진 검색 결과 리스트(res)에서 특정 점수(cutoff_score와 variance를 기반으로)를 기준으로 필터링을 수행하고, 임베딩 Document 이외 검색 결과에 추가된 score를 제거합니다.
# 본 핸즈온 데모에서는 카테고리 분류기 대신, 단순 검색 조건 필터링에 조회되지 않는 에러가 큰 (에러 거리 score가 200이상이고, 분산이 1.3이상인 값을 상한값으로 정한 다음 필터링된 문서 리스트만 반환합니다.
# 실제 환경에서는 문장 분류 카테고리 모델의 사용을 권장합니다.

def filter_and_remove_score(res, cutoff_score = 200, variance=1.3):
    # Get the lowest score
    lowest_score = min(score for doc, score in res)
    print('lowest_score : ', lowest_score)
    # If the lowest score is over 200, return an empty list
    if lowest_score > cutoff_score:
        return []
    # Calculate the upper bound for scores
    upper_bound = lowest_score * variance

    
    # Filter the list and remove the score
    res = [doc for doc, score in res if score <= upper_bound]

    return res

def get_similiar_docs(query, k=1, fetch_k=50, score=True, bank=""):

    #print (query)
    
    if score:         
        similar_docs = index_.similarity_search_with_score(
            query,
            k=k,
            fetch_k=fetch_k,
            filter=dict(source=bank)
        )
        similar_docs=filter_and_remove_score(similar_docs)
    else:        
        similar_docs = index_.similarity_search(
            query,
            k=k,
            fetch_k=fetch_k,
            filter=dict(source=bank)
        )
        
    return similar_docs

def get_answer(query, bank="", k=1):
                
    search_query = query
    
    similar_docs = get_similiar_docs(search_query, k=k, bank=bank)
    
    print("similar_docs : ", similar_docs)
    llm_query = ''+query+' Category에 대한 Information을 찾아서 설명해주세요.'
    
    if not similar_docs:
        llm_query = query

    answer = chain.run(input_documents=similar_docs, question=llm_query)
    
    return answer

def get_search_answer (query, bank="", k=1):
    search_query = query
    similar_docs = get_similiar_docs(search_query, k=k, bank=bank)
    llm_query = '검색된 내용을 요약한 문장으로 알려줘.'
    if not similar_docs:
        llm_query = query

    llm_answer = chain.run(input_documents=similar_docs, question=llm_query)
    return llm_answer
chain.run(input_documents='', question='안녕하세요')

> Entering new StuffDocumentsChain chain...> Entering new LLMChain chain... Prompt after formatting: ||SPEPERATOR||안녕하세요> Finished chain.> Finished chain.

'안녕하세요! 오늘은 무엇을 도와드릴까요?'

FAQ 데이터에 대해 테스트

%%time
question = "안녕하세요. 날씨가 참 좋네요."
response = get_answer(question, bank="신한은행", k=5)

print (f'question: {question}')
print('==========================')
print('\\n')
print (f'response: \\n {response}')

lowest_score : 293.99326 similar_docs : []

Entering new StuffDocumentsChain chain...> Entering new LLMChain chain... Prompt after formatting: ||SPEPERATOR||안녕하세요. 날씨가 참 좋네요.> Finished chain.> Finished chain. question: 안녕하세요. 날씨가 참 좋네요. ==========================

response: 안녕하세요! 오늘은 무엇을 도와드릴까요? CPU times: user 25.5 ms, sys: 109 µs, total: 25.6 ms Wall time: 727 ms

%%time
question = "타기관OTP 등록 방법 알려주세요"
response = get_answer(question, bank="신한은행", k=3)

print (f'question: {question}')
print('==========================')
print('\\n')
print (f'response: \\n {response}')

lowest_score : 112.327644 similar_docs : [Document(page_content='no: 89\nCategory: 타기관OTP 이용등록방법 알려주세요\nInformation: 타기관에서 발급받으신 OTP가 통합OTP카드인 경우 당행에 등록하여 이용가능합니다. \n[경로]\n- 인터넷뱅킹 로그인→ 사용자관리→인터넷뱅킹관리→OTP이용등록 \n- 신한 쏠(SOL) 로그인→ 전체메뉴→설정/인증→ 이용중인 보안매체선택→ OTP이용등록\n \n ※ OTP이용등록후 재로그인을 하셔야 새로 등록된 보안매체가 적용됩니다.\n\n기타 궁금하신 내용은 신한은행 고객센터 1599-8000로 문의하여 주시기 바랍니다.\ntype: 인터넷뱅킹\nSource: 신한은행', metadata={'source': '신한은행', 'row': 0})]

> Entering new StuffDocumentsChain chain...> Entering new LLMChain chain... Prompt after formatting: **no: 89 Category: 타기관OTP 이용등록방법 알려주세요 Information: 타기관에서 발급받으신 OTP가 통합OTP카드인 경우 당행에 등록하여 이용가능합니다. [경로]

  • 인터넷뱅킹 로그인→ 사용자관리→인터넷뱅킹관리→OTP이용등록
  • 신한 쏠(SOL) 로그인→ 전체메뉴→설정/인증→ 이용중인 보안매체선택→ OTP이용등록

※ OTP이용등록후 재로그인을 하셔야 새로 등록된 보안매체가 적용됩니다.

기타 궁금하신 내용은 신한은행 고객센터 1599-8000로 문의하여 주시기 바랍니다. type: 인터넷뱅킹 Source: 신한은행||SPEPERATOR||타기관OTP 등록 방법 알려주세요 Category에 대한 Information을 찾아서 설명해주세요.> Finished chain.> Finished chain.** question: 타기관OTP 등록 방법 알려주세요

response: 타기관OTP 등록 방법:

  1. 인터넷뱅킹 로그인: 먼저, 인터넷뱅킹에 로그인하고 사용자 관리 페이지로 이동합니다. 여기서 "사용자 관리" 버튼을 클릭한 후 "OTP 이용 등록"을 선택합니다.
  2. 신한 쏠(SOL) 로그인: 다음으로, 신한 쏠(SOL)에 로그인합니다. 여기서 "전체 메뉴" 버튼을 클릭한 후 "설정/인증" 탭으로 이동합니다. 여기서 "이용 중인 보안 매체 선택" 버튼을 클릭한 후 "OTP 이용 등록"을 선택합니다.
  3. OTP 이용 등록: OTP 이용 등록을 위한 정보를 입력합니다. 여기서 "타기관OTP 등록"을 선택한 후, "등록" 버튼을 클릭합니다.
  4. OTP 이용 등록 확인: 등록이 완료되면, "확인" 버튼을 클릭하여 등록이 성공적으로 완료되었는지 확인합니다.
  5. OTP 이용 시작: 등록이 완료되면, 이제 타기관OTP를 사용할 수 있습니다. CPU times: user 14.8 ms, sys: 231 µs, total: 15 ms Wall time: 10.3 s
%%time
question = "화면에서 미래를함께하는따뜻한금융 안전한금융거래를위해준비중입니다.라고 나오고 맨날 멈추는데 어떻게 하냐? 아니쓸수가 없자나"
response = get_answer(question, bank="신한은행", k=1)

print (f'question: {question}')
print('==========================')
print('\\n')
print (f'response: \\n {response}')

lowest_score : 180.90959 similar_docs : [Document(page_content='no: 78\nCategory: 미래를함께하는따뜻한금융 안전한금융거래를위해준비중입니다.\' 화면에서 멈춤 / 로딩중 멈추는데 어떻게 하나요?\nInformation: 오류 사유는 인터넷 익스플로러 설정값의 영향이거나 이용하시는 장소의 네트워크 영향에 의해 로딩이 원활하지 않은 경우입니다. \n조치방법은 \n1. 임시 인터넷 파일 및 쿠키 삭제, 신뢰할 수 있는 사이트 추가 \n 인터넷 익스플로러 상단의 [도구] > [인터넷옵션]에서\n① [일반Tab] > 검색기록항목의 [삭제] 버튼 클릭 "임시 인터넷 파일 및 사이트 파일" , "쿠키 및 웹사이트 데이터" 항목만 체크하고 [삭제] \n② [보안Tab] > 신뢰할 수 있는 사이트 > [사이트] 클릭하여 [https://*.shinhan.com ] 추가 후 적용 및 확인하십시오. \n 또는, 당행 보안프로그램 삭제 열려있는 브라우저 종료 후, 시작 > 제어판의 [프로그램 추가/제거] (총 4개이며 보이지 않으면 제거할 필요없음) \n- AhnLab Safe Transaction, \n - iniLINE CrossEX Service, \n- INISAFE CrossWeb EX v3.0, \n- TouchEn nxKey with E2E for 32bit\n3. 새 브라우저 열어서 개인인터넷뱅킹 재접속 후 [통합설치] 진행 하세요. \n기타 궁금하신 내용은 신한은행 고객센터 1599-8000로 문의하여 주시기 바랍니다.\ntype: \nSource: 신한은행', metadata={'source': '신한은행', 'row': 11})]

Entering new StuffDocumentsChain chain...> Entering new LLMChain chain... Prompt after formatting: no: 78 Category: 미래를함께하는따뜻한금융 안전한금융거래를위해준비중입니다.' 화면에서 멈춤 / 로딩중 멈추는데 어떻게 하나요? Information: 오류 사유는 인터넷 익스플로러 설정값의 영향이거나 이용하시는 장소의 네트워크 영향에 의해 로딩이 원활하지 않은 경우입니다. 조치방법은

  1. 임시 인터넷 파일 및 쿠키 삭제, 신뢰할 수 있는 사이트 추가 인터넷 익스플로러 상단의 [도구] > [인터넷옵션]에서 ① [일반Tab] > 검색기록항목의 [삭제] 버튼 클릭 "임시 인터넷 파일 및 사이트 파일" , "쿠키 및 웹사이트 데이터" 항목만 체크하고 [삭제] ② [보안Tab] > 신뢰할 수 있는 사이트 > [사이트] 클릭하여 [https://*.shinhan.com ] 추가 후 적용 및 확인하십시오. 또는, 당행 보안프로그램 삭제 열려있는 브라우저 종료 후, 시작 > 제어판의 [프로그램 추가/제거] (총 4개이며 보이지 않으면 제거할 필요없음)
  • AhnLab Safe Transaction,
  • iniLINE CrossEX Service,
  • INISAFE CrossWeb EX v3.0,
  • TouchEn nxKey with E2E for 32bit
  1. 새 브라우저 열어서 개인인터넷뱅킹 재접속 후 [통합설치] 진행 하세요. 기타 궁금하신 내용은 신한은행 고객센터 1599-8000로 문의하여 주시기 바랍니다. type: Source: 신한은행||SPEPERATOR||화면에서 미래를함께하는따뜻한금융 안전한금융거래를위해준비중입니다.라고 나오고 맨날 멈추는데 어떻게 하냐? 아니쓸수가 없자나 Category에 대한 Information을 찾아서 설명해주세요.> Finished chain.> Finished chain. question: 화면에서 미래를함께하는따뜻한금융 안전한금융거래를위해준비중입니다.라고 나오고 맨날 멈추는데 어떻게 하냐? 아니쓸수가 없자나 ==========================

response: 인터넷 익스플로러 설정 값의 영향이나 네트워크 문제로 인해 화면에서 '미래를 함께하는 따뜻한 금융'이라는 제목의 화면이 멈추면 다음 단계를 시도해 보세요:

  1. 인터넷 익스플로러 설정 변경: 인터넷 익스플로러 상단의 [도구] > [인터넷 옵션]에서 기본 설정으로 돌아갑니다.
  2. 신뢰할 수 있는 사이트 추가: 인터넷 익스플로러 상단의 [도구] > [인터넷옵션]에서 [신뢰할 수 있는 사이트]를 클릭합니다. 그러면 목록이 표시되며, 여기에는 인터넷 익스플로러 설정값과 호환되는 사이트가 포함됩니다.
  3. 인터넷 익스플로러 설정 변경: 인터넷 익스플로러 상단의 [설정] > [개인정보] > [고급]으로 이동합니다. 여기에서 '개인정보 보호탭'을 선택하고 '인스턴트 온'을 활성화합니다. 이렇게 하면 인터넷 익스플로러가 실행 중일 때에도 다른 창을 열 수 있습니다.
  4. 인터넷 익스플로러 설정 변경: 인터넷 익스플로러 상단의 [설정] > [고급]으로 이동합니다. 여기에서 '인스턴트 온'을 비활성화합니다. 이렇게 하면 인터넷 익스플로러가 실행 중일 때 다른 창을 열 수 있습니다.
  5. 브라우저를 새로 고칩니다: 인터넷 익스플로러를 새로 설치했다면 브라우저를 다시 다운로드해야 할 수도 있습니다. 브라우저를 다운로드하려면 인터넷 익스플로러를 열고 도구 모음에서 '인쇄'를 클릭합니다. 인쇄 대화 상자에서 '추가'를 클릭하고 '새로 만들기'를 클릭합니다. 그런 다음 '확인'을 클릭하여 새 브라우저를 저장합니다.
  6. 브라우저를 다시 시작합니다: 브라우저가 새로 설치된 경우 브라우저를 다시 시작하면 문제가 해결될 수 있습니다. 인터넷 익스플로러를 다시 시작하면 문제가 해결될 수 있습니다. CPU times: user 47.7 ms, sys: 7.25 ms, total: 54.9 ms Wall time: 20 s