주:

Oracle Digital Assistant, OCI Data Science, LangChain 및 Oracle Database 23ai로 엔터프라이즈 챗봇 구축

소개

오늘날의 디지털 환경에서 챗봇은 보다 지능적이고 반응적이며 복잡한 상호 작용을 처리할 수 있도록 진화하고 있습니다. 이 사용지침서에서는 AI Quick Actions 및 Model Deployment, Mistral-7B-Instruct-v0.2, Oracle Database 23ai, LangChain, Oracle Digital Assistant와 같은 Oracle Cloud Infrastructure(OCI) Data Science 기능의 성능을 활용하여 차세대 챗봇을 만드는 방법을 살펴봅니다. 이러한 각 기술은 테이블에 고유한 강점을 제공하므로 사용자 쿼리를 정확하게 이해하고 응답할 뿐만 아니라 원활하고 매력적인 대화형 경험을 제공하는 챗봇을 구축할 수 있습니다.

Oracle Database 23ai의 주요 기능 중 하나는 고급 벡터 검색 기능입니다. 이 기술을 통해 텍스트를 고차원 벡터로 변환하여 정보를 효율적으로 검색할 수 있습니다. 이러한 벡터는 관련성을 위해 비교됩니다. 검색 증강 생성(RAG) 파이프라인에 통합된 Oracle Database 23ai의 벡터 검색 기능은 챗봇이 방대한 데이터세트를 통해 가장 관련성 높은 정보를 액세스하고 제공할 수 있게 해 줍니다. 이렇게 하면 생성된 응답이 상황별로 정확할 뿐만 아니라 유저의 query와도 관련성이 높아집니다.

Oracle Digital Assistant는 대화형 AI 솔루션을 구축, 배포 및 관리하기 위한 강력한 플랫폼을 제공하여 챗봇의 기능을 더욱 향상시킵니다. 사전 구축된 커넥터, 자연어 이해(NLU) 및 대화 관리를 제공하여 개발 프로세스를 간소화하고 원활한 사용자 경험을 보장합니다. Oracle Digital Assistant와 RAG 파이프라인을 함께 사용하면 챗봇이 복잡한 상호 작용을 처리하고 자연스러운 대화 흐름을 유지하여 사용자 참여와 만족도를 높일 수 있습니다.

개발자는 RAG 파이프라인 내에서 Oracle Database 23ai와 Oracle Digital Assistant의 시너지 효과를 활용하여 검색 정확도와 대화 유동성을 모두 뛰어넘는 챗봇을 만들 수 있습니다. 이 통합 접근 방식은 정교한 챗봇을 구축하는 데 필요한 시간과 노력을 줄여줄 뿐만 아니라 확장 가능하고 효율적이며 우수한 사용자 경험을 제공할 수 있는 솔루션을 제공합니다. 개발자, 기술 애호가 또는 고객 참여를 강화하려는 비즈니스 리더이든 이 자습서는 붐비는 디지털 분야에서 눈에 띄는 고급 챗봇을 구축할 수 있는 지식과 도구를 제공합니다.

프로세스의 단계별 안내는 AI 샘플 GitHub 저장소를 참조하십시오.

사용 사례

다음은 유용한 몇 가지 예제 사용 사례입니다.

Oracle AI Vector Search의 이점

Oracle Database는 운영 및 엔터프라이즈 데이터의 선도적인 리포지토리입니다. 엔터프라이즈 애플리케이션은 일반적으로 비즈니스 데이터와 비구조적 데이터의 조합을 검색해야 합니다. 예를 들어 소매유통 웹사이트는 가격, 매장 위치, 제조업체, 현재 가용성과 같은 다른 필터와 함께 자연어 제품 설명 및 대상 제품 이미지를 기반으로 한 검색을 제공할 수 있습니다. 이 검색에서는 구조화되지 않은 카탈로그 데이터(제품 설명 및 이미지), 구조화된 카탈로그 데이터(가격, 매장 위치 및 제조업체) 및 실시간 트랜잭션 데이터(예: 현재 재고)를 동시에 검색해야 합니다.

고급 아키텍처 솔루션 개요

이미지

그림: RAG 파이프라인의 고급 아키텍처

다음 다이어그램은 Mistral-7B-Instruct-v0.2, Oracle Database 23ai, RAG, LangChain, Oracle Digital Assistant를 사용하여 고급 챗봇을 구축하는 아키텍처 및 워크플로우를 보여줍니다. 다음은 다음 아키텍처와 관련된 자세한 단계입니다.

  1. 사용자 상호 작용: 사용자가 Oracle Digital Assistant 인터페이스를 통해 챗봇에 요청을 전송합니다.

  2. 요청 처리: Oracle Digital Assistant가 요청을 수신하여 OCI Data Science 인프라로 전달합니다.

  3. 질의 처리: 2단계가 포함됩니다.

    • OCI Data Science 내에서 요청은 LangChain로 경로 지정됩니다. 이 경로는 다양한 모델 배치 간의 상호 작용을 관리하기 위한 조정자 역할을 합니다.
    • LangChain는 요청을 처리하고 외부 문서 및 엔터프라이즈 데이터에서 정보를 검색해야 할 필요성을 식별합니다.
  4. 벡터화: 이 단계에는 다음과 같은 하위 프로세스가 포함됩니다.

    • 요청이 임베딩 모델 배치로 전송되어 질의를 고차원 벡터 표현으로 변환합니다.
    • 그런 다음 벡터화된 이 query는 벡터 검색을 위해 Oracle Database 23ai로 전송됩니다.
  5. 데이터 검색: 이 단계에는 다음 하위 프로세스가 포함됩니다.

    • Oracle Database 23ai는 PDF 및 HTML 형식의 문서 형태로 구조화되지 않은 데이터에 대해 유사성 검색을 수행하고 해당 검색을 데이터베이스의 다른 비즈니스 데이터에 대한 일반 검색과 결합합니다.
    • 관련 문서 또는 조각이 검색되고 추가 처리를 위해 다음 단계로 전송됩니다.
  6. 등급 재지정:

    • 생성된 응답은 순위 재지정된 모델 배치에 의해 추가로 구체화될 수 있습니다.
    • 순위 재지정 모델은 가장 관련성이 높고 정확한 응답을 선택하도록 응답을 평가하고 등급을 지정합니다.
  7. 외부 모델 질의: 이 단계에서는 데이터가 검색되고 응답이 생성됩니다.

    • 검색된 정보는 OCI Data Science의 AI 빠른 작업 기능을 사용하여 프로비전된 Mistral-7B-Instruct-v0.2 모델 배치에 대한 질의를 생성하는 데 사용됩니다.
    • Mistral-7B-Instruct-v0.2 모델은 query를 처리하고 해당 교육 및 검색된 컨텍스트를 기반으로 응답을 생성합니다.
  8. 응답 생성: 세분화된 응답이 최종 출력을 통합하는 LangChain로 다시 전송됩니다.

  9. 사용자에게 응답 반환:

    • 최종 응답은 디지털 어시스턴트로 반환됩니다.
    • 그런 다음 Oracle Digital Assistant가 사용자에게 응답을 전달합니다.

목표

필요 조건

OCI Data Science Service에서 분산된 미세 조정 프로세스를 계속 실행하려면 먼저 설정해야 하는 주요 필요 조건입니다.

작업 1: 필요한 모델 배치

작업 1.1: Mistral-7B-Instruct-v0.2 모델 배치

몇 번의 클릭만으로 AI 빠른 작업 모델 배포 기능을 활용하여 Mistral-7B-Instruct-v0.2를 배포할 예정입니다. AI Quick Actions 모델 배포는 사용자가 몇 번의 클릭만으로 Mistral-7B-Instruct-v0.2를 배포하고 사용자에게 엔드포인트를 제공할 수 있도록 지원합니다.

이미지

이미지

작업 1.2: Jina 포함 모델 배치

  1. Notebook의 https://huggingface.co/jinaai/jina-embeddings-v2-base-en/tree/main에서 Jine Embedding 모델 파일을 ads_embedding_model_dir 디렉토리로 복사합니다.

  2. score.py 파일을 현재 디렉토리(예: /home/datascience/)에 업로드합니다.

  3. 다음 코드를 실행합니다.

    import tempfile
    import ads
    from ads.model.generic_model import GenericModel
    from config import CONDA_PACK_PATH, LOG_GROUP_ID, EMBEDDING_MODEL_ACCESS_LOG_LOG_ID, EMBEDDING_MODEL_PREDICT_LOG_LOG_ID
    ads.set_auth("resource_principal")
    embedding_model = GenericModel( model_file_name="model-w-mean-pooling.onnx" ,artifact_dir="ads_embedding_model_dir",estimator=None, serialize=False)
    embedding_model.summary_status()
    
    embedding_model.prepare(
            inference_conda_env=CONDA_PACK_PATH,
            inference_python_version = "3.9",
            model_file_name="model.onnx",
            score_py_uri= "score.py",
            force_overwrite=True
        )
    op=embedding_model.verify(['Can you please give some overview on Oracle Database 23.4'])
    print(op['embeddings']);
    
    embedding_model.save(display_name="jina-embedding")
    embedding_md = embedding_model.deploy(
        display_name = "Jina Embedding Model Deployment",
        deployment_log_group_id = LOG_GROUP_ID,
        deployment_access_log_id = EMBEDDING_MODEL_ACCESS_LOG_LOG_ID,
        deployment_predict_log_id = EMBEDDING_MODEL_PREDICT_LOG_LOG_ID,
    )
    output = embedding_md.predict(['Can you please give some overview on Oracle Database 23.4'])
    print(output['embeddings']);
    

태스크 1.3: Bge-Reranker 모델 배치

다음 코드를 실행합니다.

import ads
from FlagEmbedding import FlagReranker
from ads.model.generic_model import GenericModel
from ads.model.model_metadata import MetadataCustomCategory
from config import CONDA_PACK_PATH, LOG_GROUP_ID, RERANKER_MODEL_ACCESS_LOG_LOG_ID, RERANKER_MODEL_PREDICT_LOG_LOG_ID

#
# This custom class wrap the reranker model
#
class Reranker:
    def __init__(self, model_id):
        self.model_id = model_id
        self.reranker = FlagReranker(self.model_id, use_fp16=True)

    def predict(self, x):
        # x is expected as a list of list of str
        # [["x1", "x2"]] -> y = [score12]
        scores = self.reranker.compute_score(x)

        return scores
reranker_model = Reranker(model_id="BAAI/bge-reranker-large")
reranker_payload = [
    ["what is panda?", "It is an animal living in China. In the future model input will be serialized by.In the future model input will be serialized by.In the future model input will be serialized by"],
    ["what is panda?", "The giant panda is a bear species endemic to China.In the future model input will be serialized by.In the future model input will be serialized by.In the future model input will be serialized by.In the future model input will be serialized by"],
]
reranker_model.predict(reranker_payload)

reranker_generic_model = GenericModel(estimator=reranker_model, artifact_dir="./reranker_dir")
reranker_generic_model.summary_status()
reranker_generic_model.prepare(
    reload=False,
    inference_conda_env=CONDA_PACK_PATH,
    inference_python_version="3.9",
    model_file_name="reranker.pkl",
    force_overwrite=True
)

reranker_generic_model.save(
    display_name="reranker2-baai-large",
    bucket_uri="oci://reranker_bucket@bigdatadatasciencelarge/reranker/",
    ignore_introspection=True
)

reranker_md = reranker_generic_model.deploy(
    display_name = "reranker2-baai-large",
    deployment_log_group_id = LOG_GROUP_ID,
    deployment_access_log_id = RERANKER_MODEL_ACCESS_LOG_LOG_ID,
    deployment_predict_log_id = RERANKER_MODEL_PREDICT_LOG_LOG_ID,
    deployment_instance_shape="VM.Standard2.4",
)

작업 2: Oracle Database 23ai 설정

사용 사례에 Oracle Database 23ai의 최신 기능, 특히 Oracle AI Vector Search를 활용할 예정입니다. 이 시나리오에서는 데이터 집합에서 생성된 임베딩을 Oracle Database 23ai로 임포트합니다. 사용자가 RAG를 사용하여 쿼리하는 경우 LLM에 추가 컨텍스트를 제공하여 응답이 향상됩니다. 다음 다이어그램은 Oracle Database 23ai를 사용할 때의 몇 가지 이점을 보여줍니다.

이미지

그림: Oracle Database 23ai Search Feature(소스) 그림

이를 통해 지식을 강화하여 고객의 문의에 더 정확하고 적합한 응답을 얻을 수 있습니다. Oracle Database 23ai를 설정하려면 다음 옵션을 따르십시오.

Oracle Database 23ai의 호스팅된 인스턴스를 사용하여 Oracle AI Vector Search의 강력한 기능을 시연할 예정입니다.

작업 3: Oracle Database 23ai에 구문 분석, 조각화 및 저장 포함

다음 코드 조각에서는 문서가 구문 분석되는 방식, 문서가 조각으로 변환되는 방식 및 포함이 Oracle Database 23ai에 저장되는 방식에 대해 간략하게 설명합니다. 자세한 내용은 oda-oci-data-science-oracledb-23ai-llm을 참조하십시오.

Oracle Database 23ai 초기화

def load_documents(embedding_model):
    # connect to db
    # Configure logging
    logging.basicConfig(
        level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
    )
    logging.info("Connecting to Oracle DB...")

    DSN = f"{DB_HOST_IP}/{DB_SERVICE}"

    with oracledb.connect(user=DB_USER, password=DB_PWD, dsn=DSN) as connection:
        logging.info("Successfully connected to Oracle Database...")

        num_pages = []
        for book in INPUT_FILES:
            logging.info(f"Processing book: {book}...")

            if ENABLE_CHUNKING is False:
                # chunks are pages
                logging.info("Chunks are pages of the book...")
                nodes_text, nodes_id, pages_num = read_and_split_in_pages([book])
                num_pages.append(len(nodes_text))
            else:
                logging.info(f"Enabled chunking, chunck_size: {MAX_CHUNK_SIZE}...")
                nodes_text, nodes_id, pages_num = read_and_split_in_chunks([book])

                # create embeddings
                # process in batch (max 96 for batch, chosen BATCH_SIZE, see above)
                logging.info("Computing embeddings...")
                embeddings = compute_embeddings(embedding_model, nodes_text)

                # determine book_id and save in table BOOKS
                logging.info("Registering document...")
                book_id = register_document(book, connection)

                # store embeddings
                # here we save in DB
                save_embeddings_in_db(embeddings, nodes_id, connection)

                # store text chunks (pages for now)
                save_chunks_in_db(nodes_text, nodes_id, pages_num, book_id, connection)

                # a txn is a book
                connection.commit()

작업 4: Mistral-7B-Instruct-v0.2 AI 빠른 작업 LLM에 연결

AI Quick Actions로 모델 배치를 생성하고 여기서 모델 배치 끝점을 가져옵니다. 다음 코드를 실행하여 LLM에 연결합니다.

import ads
ads.set_auth("resource_principal")

command_md = OCIModelDeploymentVLLM(
    endpoint="https://modeldeployment.eu-frankfurt-1.oci.customer-oci.com/ocid1.datasciencemodeldeployment.oc1.<ocid>/predict",
    model="odsc-llm"
)

태스크 5: RAG 설정

다음 RAG 아키텍처는 다음 단계로 구성됩니다.

작업 5.1: 23ai 벡터 데이터베이스에 업로드

class CustomRetriever(BaseRetriever):
    def _get_relevant_documents(
        self, query: str, *, run_manager: CallbackManagerForRetrieverRun
    ) -> List[Document]:
        matching_documents = []

        #Embedding model
        rps = oci.auth.signers.get_resource_principals_signer()
        prediction = requests.post(EMBEDDING_MD_ENDPOINT, data=f'["{query}"]', auth=rps)

        #Search in DB
        q_result = test_oracle_query(prediction.json()['embeddings'][0], TOP_K, True, False)
        text_list = []
        for n, id, sim in zip(q_result.nodes, q_result.ids, q_result.similarities):
            text_list.append(n.text)
        paired_list = [[query, text] for text in text_list]

        print(f'Reranker payload: {paired_list}')

        #ReRanker model
        reranker_results = requests.post(RERANKER_MD_ENDPOINT, data=json.dumps(paired_list), auth=rps)  # make a prediction request
        max_value = max(reranker_results.json()['prediction'])
        if max_value < -3:
            return matching_documents;
        # Find the index of the maximum value
        max_index = reranker_results.json()['prediction'].index(max_value)
        print(f"The maximum value is: {max_value}")
        print(f"The index of the maximum value is: {max_index}")
        doc =  Document(page_content=paired_list[max_index][1], metadata={"source": "local"})
        matching_documents.append(doc)
        return matching_documents

customRetriever = CustomRetriever()
chain = RetrievalQA.from_chain_type(
    llm=command_md,
    retriever=customRetriever
)

prompt = "Can you please give some overview on Oracle Database 23.4?"
res = chain(prompt)
print('Output::')
print(res['result'])

우리는 챗봇을 만들기 위해 Langchain에서 제공하는 프롬프트 템플릿과 QA 체인을 사용합니다. 이것은 컨텍스트와 질문을 LLM에 직접 전달하는 데 도움이됩니다.

작업 5.2: LangChain 모델 배치

import tempfile
import ads
from ads.model.generic_model import GenericModel
from config import CONDA_PACK_PATH, LOG_GROUP_ID, LANGCHAIN_MODEL_ACCESS_LOG_LOG_ID, LANGCHAIN_MODEL_PREDICT_LOG_LOG_ID

ads.set_auth("resource_principal")

langchain_model = GenericModel( artifact_dir="langchain_model",estimator=None, serialize=False)
langchain_model.summary_status()
#Copy required python scripts to artifact dir
langchain_model.prepare(
        inference_conda_env=CONDA_PACK_PATH,
        inference_python_version = "3.9",
        model_file_name="test",
        score_py_uri= "score_langchain_final.py",
        force_overwrite=True
    )
op=langchain_model.verify('Can you please give some overview on Oracle Database 23.4?')
model_id = langchain_model.save(display_name="langchain-model")
deploy = langchain_model.deploy(
    display_name="Langchain Model Deployment",
    deployment_log_group_id = LOG_GROUP_ID,
    deployment_access_log_id = LANGCHAIN_MODEL_ACCESS_LOG_LOG_ID,
    deployment_predict_log_id = LANGCHAIN_MODEL_PREDICT_LOG_LOG_ID,
    environment_variables={"CRYPTOGRAPHY_OPENSSL_NO_LEGACY":"1"},
    deployment_instance_shape="VM.Standard2.4",
)
deploy.predict('Can you please give some overview on Oracle Database 23.4?')

작업 6: RAG를 호스트하는 챗봇 애플리케이션용 Oracle Digital Assistant를 사용하여 디지털 도우미 생성

작업 6.1: 모델 배치 끝점 가져오기 및 정책 추가

모델의 제공자를 호출하는 인스턴스에 REST 서비스를 추가합니다. Oracle 모델 배포를 예로 사용하지만 모든 LLM에 REST 서비스를 사용할 수 있습니다.

이미지

Oracle Digital Assistant가 모델 배치 예측 끝점에 액세스할 수 있도록 정책을 추가합니다. Identity & Security(ID 및 보안) Policies(정책)로 이동하고 Create Policy(정책 생성)를 누릅니다.

이미지

동적 그룹에 대한 정책

Allow any-user to {DATA_SCIENCE_MODEL_DEPLOYMENT_PREDICT} in compartment Demo where request.principal.id='ocid1.odainstance.oc1.iad.<ocid>'

정책이 생성되면 Oracle Digital Assistant를 실행하여 브라우저에서 열 수 있습니다.

작업 6.2: LLM 제공자 REST 서비스 생성

  1. Oracle Digital Assistant로 이동하여 설정, API 서비스, LLM 서비스로 이동하고 +Add LLM 서비스를 누릅니다.

  2. LLM 서비스 생성 페이지에서 다음 정보를 입력하여 제공자의 끝점에 대한 게시 작업을 생성하고 생성을 누릅니다.

    • 이름: 쉽게 식별할 수 있는 서비스 이름을 입력합니다. 나중에 이 이름을 참조하게 됩니다.
    • 끝점: 모델 배치 끝점을 복사하여 붙여넣습니다.
    • 메소드: POST를 선택합니다.

    이미지

  3. API 키와 요청 및 응답 페이로드 샘플을 추가하여 서비스를 완료합니다.

    • 인증 유형: OCI 리소스 주체를 선택합니다.

    • 콘텐츠 유형: application/json을 선택합니다.

    • 본문: 요청으로 전송된 페이로드를 추가합니다. 예:

      {
          "query": "Can you please give some overview on Oracle Database 23.4?"
      }
      

    이미지

  4. 테스트 요청을 눌러 200 응답을 확인합니다.

    이미지

태스크 6.3: 스킬 생성

LLM 제공자 REST 서비스가 인스턴스에 추가되었으므로 이제 이 서비스를 호출할 수 있는 기술을 생성하고 대화상자의 플로우 정의를 통해 사용자를 연결할 수 있어야 합니다. 이 스킬을 생성하려면 다음과 같이 하십시오.

  1. Oracle Digital Assistant로 이동하여 Development+Skills로 이동합니다.

  2. + 새 기술을 누릅니다.

  3. 스킬 생성 페이지에서 다음 정보를 입력하고 생성을 누릅니다.

    • 표시 이름: 이름을 추가합니다.
    • 대화상자 모드: 시각적을 선택합니다.
    • 다른 필드의 경우 기본값을 그대로 사용합니다.

    이미지

작업 6.4: 모델에 스킬 연결

이제 REST 페이로드를 LLM 제공자와 Oracle Digital Assistant에서 수락하는 형식으로 변환하는 이벤트 처리기로 사용자정의 구성요소를 생성하여 LLM REST 서비스에 접근하는 기술을 사용으로 설정할 것입니다.

  1. 왼쪽 탐색 모음에서 구성 요소 아이콘을 누르고 서비스 추가를 누릅니다.

    왼쪽 탐색 모음의 구성 요소 아이콘

  2. 서비스 생성 페이지에서 다음 정보를 입력하고 생성을 누릅니다.

    • 이름: 서비스를 설명하는 이름을 입력합니다.
    • 서비스 유형: 기본 설정을 그대로 적용하고 내장 컨테이너를 선택합니다.
    • 구성 요소 서비스 패키지 생성 유형: 새 구성 요소를 선택합니다.
    • 구성 요소 유형: LLM 변환을 선택합니다.
    • 구성 요소 이름: 구체적인 이름을 입력합니다.
    • 템플리트: 사용자정의(기타 아래에 있음)를 선택합니다.

    이미지

  3. 완료된 구성 요소가 구성 요소 페이지에 표시됩니다.

    이미지

  4. 구성 요소 페이지에서 구성 요소를 선택하여 해당 배치 상태를 확인합니다. 준비가 표시되면 다음 단계로 이동할 수 있습니다.

    이미지

    Service Enabled(기본 설정)가 사용으로 설정되었는지 확인합니다.

    이미지

작업 6.5: LLM 서비스 제공자 및 Oracle Digital Assistant 요청 및 응답 매핑

모델의 서비스 제공자에 대한 스킬의 요청은 CLMI(Common LLM Interface)라고 하는 Oracle Digital Assistant에서 사용하는 인터페이스에서 서비스 제공자가 수락하는 형식으로 변환되어야 합니다. 마찬가지로 서비스 공급자로부터 반환된 결과도 CLMI로 변환해야 합니다. 이 매핑을 사용으로 설정하려면 다음 REST 서비스 이벤트 처리기 메소드에 제공자별 코드가 있어야 합니다.

이벤트 처리기 코드 편집기를 열고 변환 코드를 업데이트하려면(이 경우 Azure OpenAI의 경우) 다음 단계를 수행합니다.

  1. 서비스를 확장하고 이벤트 처리기를 선택합니다.

    이미지

  2. 편집 아이콘을 눌러 편집기를 엽니다.

    이미지

    이미지

  3. transformRequestPayload 처리기 이벤트 메소드 코드(약 24-26행)를 다음 코드로 바꿉니다.

    • transformRequestPayload:

      transformRequestPayload: async (event, context) => {
          return { "query": event.payload.messages[event.payload.messages.length - 1].content };
          },
      

      모든 요청은 LLM 프롬프트에 마지막 사용자 입력을 전달하기만 하면 됩니다.

  4. transformResponsePayload 처리기 이벤트 메소드 코드(약 35-37행)를 다음 코드로 바꿉니다.

    • transformRequestPayload:

      transformResponsePayload: async (event, context) => {
          return { candidates: [ { "content": event.payload.prediction || "" }]};
      },
      
  5. transformErrorResponsePayload 처리기 이벤트 메소드 코드(약 47-49행)를 다음 코드로 바꿉니다.

    • transformRequestPayload:

      transformErrorResponsePayload: async (event, context) => {
          let errorCode = 'unknown';
          if (event.payload.error) {
              if ( 'context_length_exceeded' === event.payload.error.code) {
                  errorCode = 'modelLengthExceeded'; }
              else if ('content_filter' === event.payload.error.code) {
                  errorCode = 'flagged';
              }
              return {"errorCode" : errorCode, "errorMessage": event.payload.error.message};
          }
          return {"errorCode" : errorCode, "errorMessage": JSON.stringify(event.payload)};
      }
      
  6. 검증을 눌러 코드 구문을 검사합니다. 수정할 수 없는 구문 오류가 발생하는 경우 이 함수를 사용하여 편집기의 코드를 바꿉니다.

    이미지

  7. 저장, 닫기를 차례로 누릅니다. 배포가 완료될 때까지 기다립니다. 준비가 표시되면 다음 단계로 이동할 수 있습니다.

작업 6.6: 스킬에 대한 LLM 서비스 정의

대화 플로우를 통해 사용자를 모델에 연결하는 기술을 사용으로 설정하려면 모델을 호출하는 인스턴스 전체 LLM 서비스를 변환 이벤트 처리기(이 경우 Oracle 모델 배치용)와 결합하는 LLM 서비스를 생성해야 합니다.

  1. 왼쪽 탐색 모음에서 설정 아이콘을 누릅니다.

    왼쪽 탐색 모음

  2. 구성을 누릅니다.

    Settings의 Configuration 탭

  3. 대형 언어 모델 서비스 페이지에서 +New LLM 서비스를 누릅니다.

    Configuration 페이지의 Large Language Model 섹션입니다.

  4. 다음 정보 입력

    • 이름: LLM 서비스에 대해 쉽게 식별할 수 있는 이름을 입력합니다. 다음 단계에서 대화상자 흐름을 작성할 때 이 이름을 참조합니다.

    • LLM 서비스: 작업 1: 모델에 대한 REST 서비스 생성에서 생성한 인스턴스 전체 LLM 서비스의 이름을 선택합니다.

    • 변환 처리기: 작업 3: 모델에 기술 연결에서 REST 서비스의 일부로 생성한 이벤트 처리기 구성요소의 이름을 선택합니다.

    • 나머지 등록 정보는 기본 설정에 그대로 둡니다. 이 자습서에 대해 지금까지 생성한 유일한 서비스인 경우 기본값이 사용으로 설정됩니다.

      이미지

  5. 저장을 누릅니다.

    서비스 저장 아이콘

  6. 스위치에서 피드백 및 기타 기본값의 선택을 해제합니다.

    이미지

작업 6.7: 서비스 통합

이제 기술이 LLM에 연결되었으므로 모델을 호출하고 수행할 작업을 알려주는 대화상자 흐름 구성요소를 생성하여 스킬의 사용자를 모델에 연결합니다. 구성요소는 사람이 읽을 수 있는 텍스트 블록인 프롬프트를 사용하여 이러한 지침을 전달합니다. 이 작업에서는 사용자 피드백을 긍정 또는 부정 또는 중립으로 평가하도록 모델에 지시하는 이 프롬프트를 제공합니다.

  1. 왼쪽 탐색 모음에서 플로우 아이콘을 누릅니다.

    왼쪽 탐색 모음의 흐름 아이콘

  2. unresolvedIntent을 선택합니다.

    미해결 플로우

  3. unresolvedMessage 상태에서 줄임표(...) 아이콘을 누르고 메뉴에서 상태 추가를 선택합니다.

    상태 추가 옵션

  4. 서비스 통합대형 언어 모델 호출을 선택합니다.

  5. 감정 분석과 같은 설명을 입력하고 삽입을 누릅니다.

    이미지

    이제 대화 플로우에 unresolvedMessage(메시지 전송) 상태, invokeLLM 상태 및 showLLMError 상태가 포함됩니다.

    대화상자 흐름에서 showError 상태의 invokeLLM 상태

  6. unresolvedMessage 상태에서 ellipsis(...) 아이콘을 누르고 UnresolvedIntent에 대한 오류 메시지를 표시하지 않으려는 경우 메뉴에서 삭제를 선택합니다.

    이미지

    이제 대화 흐름에 invokeLLM 상태와 showLLMError 상태만 포함됩니다.

    이미지

  7. invokeLLM 상태를 엽니다. 구성 요소 페이지에서 작업 6.6에서 만든 LLM 서비스를 선택합니다.

    LLM 서비스 필드

  8. 프롬프트에 다음을 붙여넣어 LLM 서비스에 지침을 보내는 프롬프트를 추가합니다. 모든 사용자 대화가 프롬프트 입력으로 전달되어야 합니다.

    이미지

  9. PROMPT_INPUT 변수를 생성합니다. 프롬프트 매개변수 +를 눌러 새 매개변수와 해당 값을 추가합니다.

    이미지

  10. 메시지가 증분적으로 전달되지 않고 전체적으로 전달되도록 스트리밍 사용False로 설정합니다.

    이미지

  11. 프롬프트 작성기를 사용하여 프롬프트를 테스트하고 빌드 프롬프트를 누릅니다.

    이미지

  12. 프롬프트 매개변수 모의 값을 추가하고 출력 생성을 누릅니다. 이렇게 하면 LLM 통합을 검증할 수 있습니다.

    이미지

작업 6.8: 기술 테스터로 프롬프트 테스트

  1. 기술 테스터를 열려면 미리보기를 누릅니다.

    Preview 버튼

  2. 다음 요청을 입력합니다. Oracle Database 23.4에 대한 몇 가지 개요를 제공해 주시겠습니까?

    다음과 같이 출력됩니다.

    이미지

  3. LLM에 대한 다음 질의 요청: 최신 오라클 데이터베이스.

    다음과 같이 출력됩니다.

    이미지

작업 6.9: Oracle 웹 사용자 채널 설정

Oracle 웹 클라이언트가 기술에 액세스할 수 있도록 하는 Oracle Digital Assistant 사용자 채널을 생성합니다. 웹 클라이언트만 이 채널을 사용할 수 있도록 클라이언트 인증이 필요하도록 구성합니다.

  1. Oracle Digital Assistant를 열고 개발, 채널로 이동한 다음 +Add 채널을 누릅니다.

  2. 채널 생성에서 다음 정보를 입력하여 제공자의 끝점에 대한 POST 작업을 생성하고 생성을 누릅니다.

    • 이름: 문자로 시작하고 문자, 숫자, 마침표 및 밑줄만 포함하는 고유한 이름입니다. 예: OCI_MD_LLM.
    • 설명(선택 사항): 채널이 사용되는 용도입니다.
    • 채널 유형: Oracle 웹을 선택합니다.
    • 허용된 도메인: *를 입력합니다.
    • 클라이언트 인증 사용: 선택을 해제합니다.

    이미지

  3. 아직 사용 안함으로 설정되지 않은 경우 Client Authentication Enabled(클라이언트 인증 사용)의 선택을 해제합니다.

  4. 경로에서 사용할 스킬을 선택합니다. LLM-MD-Skill인 현재 기술을 선택했습니다.

  5. Channel Enabled(채널 사용)를 사용으로 설정합니다.

  6. 이 채널에 대해 표시되는 https 없이 Channel IdODA Domain URI를 확인합니다.

웹 앱 및 토큰 생성기의 라우팅 구성에서 이러한 값을 사용합니다.

작업 6.10: SDK 설치

zip을 다운로드하여 로컬 시스템에 압축을 풉니다. 이 zip에는 SDK의 클래스를 설명하는 사용자 가이드와 많은 기능을 보여주는 샘플 앱이 포함되어 있습니다.

  1. Oracle Digital Assistant(ODA) 및 Oracle Mobile Cloud(OMC) 다운로드Oracle Native Client SDK(OCI Native Environment용) Web SDK 섹션으로 이동합니다.

  2. ODA Web SDK 24.06을 다운로드합니다.

  3. 플랫폼에서 일반을 선택합니다.

  4. oda-native-client-sdk-js-24_06 for (GENERIC (All Platforms)인 최신 ODA Js SDK를 다운로드하려면 클릭하십시오.

    이미지

  5. 다운로드한 zip 파일을 추출합니다.

작업 6.11: Oracle Web App 테스트

  1. 다운로드한 Oracle Web SDK의 추출된 zip 폴더로 이동합니다.

  2. samples/web/settings.js 파일을 열고 <URI><channelId>를 실제 값으로 바꿉니다.

    예:

    • URI: oda-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-dax.data.digitalassistant.oci.oraclecloud.com
    • ChannelId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.
  3. 또한 isClientAuthEnabled가 false인지 확인합니다.

    let isClientAuthEnabled = false;
    
  4. 브라우저에서 samples/web/index.html 파일을 실행합니다.

  5. 인덱스 파일 내용을 무시합니다. 채팅 아이콘을 누르면 Oracle Assistant CONNECTED 상태가 표시됩니다.

    이미지

  6. 이것은 우리의 웹 사이트가 오른쪽 하단 모서리에 채팅 아이콘으로 보이는 방법입니다. 우리는 이전에 스킬 테스터와 함께했던 것처럼 대화를 시작할 수 있습니다.

    이미지

    이미지

작업 6.12: OCI 컴퓨트 인스턴스에서 릴리스

  1. OCI 컴퓨트 인스턴스를 생성합니다. 자세한 내용은 인스턴스 생성을 참조하십시오.

  2. 다음 수신 규칙이 있는지 확인하십시오.

    이미지

  3. 모든 웹 폴더를 새로 생성된 인스턴스로 복사합니다.

  4. NGINX를 설치합니다. 자세한 내용은 Install the NGINX Web Server and Proxy on Oracle Linux를 참조하십시오.

  5. 브라우저를 열고 http://<IP_address>/로 이동합니다. 자체 서명된 인증서가 있는 경우 https://<IP_address>/로 이동할 수 있습니다.

결과

LLM에 직접 문의하는 결과와 LLM에 RAG를 사용하는 결과를 비교해 보겠습니다.

다음 단계

Oracle Database 23ai, RAG, LangChain, Mistral-7B-Instruct-v0.2 및 Oracle Digital Assistant를 사용하여 고급 챗봇을 구축하면 최첨단 기술을 통합하여 응답성이 높고 지능적인 대화 에이전트를 생성할 수 있습니다. 요청 처리에서 응답 생성에 이르는 상세한 워크플로우는 챗봇이 방대한 양의 정보를 효율적으로 검색 및 처리하여 사용자에게 정확하고 상황에 맞는 답변을 제공할 수 있도록 합니다. 개발자는 Oracle Database 23ai의 벡터 검색 기능과 Oracle Digital Assistant에서 제공하는 강력한 플랫폼을 활용하여 챗봇의 성능과 사용자 참여를 크게 향상시킬 수 있습니다. 이 통합 접근 방식은 개발 프로세스를 간소화할 뿐만 아니라 디지털 어시스턴트의 경쟁 구도에서 눈에 띄는 확장 가능하고 효율적이며 매우 효과적인 AI 솔루션을 제공합니다. 이 고급 챗봇 아키텍처는 고객 서비스, 정보 검색, 대화형 지원 등 모든 측면에서 모던 사용자의 요구를 충족하는 정교한 대화형 환경을 조성할 수 있는 방법을 제공합니다.

AI Quick Actions 사용 방법에 대한 자세한 내용은 Oracle Cloud Infrastructure Data Science YouTube 재생 목록에서 AI Quick Actions의 데모 비디오를 확인하시고, 기술 문서를 확인하시고, 팁과 예제가 포함된 Github 저장소를 확인하세요.

AI Quick Actions에 추가할 특정 모델을 제안하거나 질문이 있으면 OCI Data Science 그룹(ask-oci-data-science_grp@oracle.com)으로 이메일을 보내주십시오.

확인

추가 학습 자원

docs.oracle.com/learn에서 다른 실습을 탐색하거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하세요. 또한 Oracle Learning Explorer가 되려면 education.oracle.com/learning-explorer을 방문하십시오.

제품 설명서는 Oracle Help Center를 참조하십시오.