주:
- 이 사용지침서에서는 Oracle Cloud에 액세스해야 합니다. 무료 계정에 등록하려면 Oracle Cloud Infrastructure Free Tier 시작하기를 참조하십시오.
- Oracle Cloud Infrastructure 인증서, 테넌시 및 구획에 예제 값을 사용합니다. 실습을 완료할 때 이러한 값을 클라우드 환경과 관련된 값으로 대체하십시오.
송장 해결을 위한 다중 에이전트 통신 프로토콜 서버를 사용하여 AI 에이전트 빌드
소개
유통 업체, 산업 및 소매 체인과 같은 대량의 제품을 다루는 회사는 부정확하거나 불완전하거나 다양한 텍스트 설명을 기반으로 제품을 식별하는 데 어려움을 겪는 경우가 많습니다. 데이터를 수동으로 입력하는 환경에서는 ERP(Enterprise Resource Planning), CRM(Customer Relationship Management) 및 전자 상거래 플랫폼과 같은 시스템에서 항목을 올바르게 식별하기 어려울 수 있습니다.
이 시나리오에서는 다음과 같은 툴이 일반적으로 필요합니다.
-
사용자가 제공한 비공식 또는 잘못된 설명을 해석합니다.
-
의미 유사성을 기반으로 가장 유사한 제품을 제안합니다.
-
의미 검색에서 관련 결과를 찾을 수 없는 경우 기존 알고리즘(예: 퍼지 일치)으로 폴백을 보장합니다.
-
API 및 지능형 에이전트의 자동화된 흐름과 통합합니다.
이 자습서에서는 고객 반품 송장의 불일치를 해결하는 데 특화된 AI 에이전트를 생성하는 방법을 알아봅니다. 에이전트는 벡터 검색 및 송장 검색 도구를 제공하는 MCP 서버와 상호 작용할 수 있으므로 에이전트는 고객이 제공한 정보를 기반으로 회사의 원래 A/R 송장을 자동으로 찾을 수 있습니다.
MCP 서버(모델 컨텍스트 프로토콜)는 표준화된 메시지 및 도구 프로토콜을 통해 지능형 에이전트와 외부 서비스 간의 통신을 조정하는 소프트웨어 구성 요소입니다. 언어 모델(LLM)과 기존 API 간의 다리 역할을 하므로 AI 에이전트가 재작성하거나 직접 조정할 필요 없이 레거시 시스템의 특정 기능에 액세스할 수 있습니다.
어떻게 작동하나요?
MCP 서버:
- 작업 또는 서비스 에이전트가 호출할 수 있는 명명된 도구 세트를 표시합니다.
- 각 도구는 데이터베이스 기능, REST API, 레거시 시스템 또는 프로그래밍 가능한 작업에 연결할 수 있습니다.
- 에이전트 명령(JSON 형식)을 수신하고, 해당 서비스를 실행하고, 표준화된 응답을 반환합니다.
레거시 애플리케이션 사용
레거시 애플리케이션은 이미 데이터베이스, 파일 또는 내부 API를 통해 기능을 제공하는 경우가 많습니다. MCP 서버를 사용하여 다음을 수행할 수 있습니다.
-
REST 서비스, 내장 프로시저 또는 SQL 질의에 대한 호출을 캡슐화합니다.
-
통합 통신 인터페이스를 통해 에이전트가 이러한 서비스에 액세스할 수 있도록 합니다.
-
대화형 AI 및 RAG를 기반으로 구형 시스템을 모던 아키텍처와 통합합니다.
장점
-
기존 비즈니스 논리를 재사용합니다.
-
레거시 시스템을 리팩토링할 필요가 없습니다.
-
LLM 에이전트가 안전하고 제어된 방식으로 외부 시스템과 상호 작용할 수 있도록 지원합니다.
-
AI와 백엔드 서비스 간의 통합에서 테스트, 버전 지정 및 모듈성을 지원합니다.
이 에이전트는 Oracle Cloud Infrastructure(OCI) Generative AI 언어 모델을 기반으로 하며 MCP 서버에서 관리하는 동적으로 선언된 도구와 통합됩니다.
이 두 가지 구성요소 통합을 통해 시스템은 Oracle LLM 기반의 에이전트를 지원합니다.
- MCP를 사용하여 원격으로 호스팅된 도구를 사용합니다.
- 제품 및 EAN에 대한 지능형 검색을 수행합니다.
- 해당 AR 송장을 찾습니다.
- 피닉스 및 OpenTelemetry를 사용하여 관찰 가능성에 모든 것을 기록합니다.
이 모듈식 설계를 통해 청구서가 아닌 도메인으로 시스템을 재사용하고 쉽게 전환할 수 있습니다.
목표
-
구조화된 프롬프트에서 작동하도록 LangGraph 및 LangChain로 AI 에이전트를 구성합니다.
-
stdio
프로토콜을 사용하여 이 에이전트를 MCP 서버와 통합합니다. -
서버에 등록된 원격 도구를 사용하여 다음을 수행합니다.
- 제품 설명에서 벡터 검색을 수행합니다.
- 품목에 대해 가장 가능성이 높은 EAN 코드를 식별합니다.
- 고객, 시/도 및 가격과 같은 기준에 따라 최초 송장을 검색합니다.
-
Phoenix 및 OpenTelemetry를 사용하여 에이전트 실행을 실시간으로 모니터링합니다.
-
다음과 같은 JSON 입력을 기반으로 실제 문제 해결을 시뮬레이션합니다.
{ "customer": "Customer 43", "description": "Harry Potter", "price": 139.55, "location": "RJ" }
필수 조건
-
클라우드 리소스를 관리하기 위한 OCI 테넌시에 액세스합니다.
oracle.com/cloud/free
에서 무료로 등록할 수 있습니다. -
Python
version 3.12
이상을 설치합니다. -
OCI Generative AI 서비스가 사용으로 설정된 OCI 계정에 대한 액세스입니다.
-
Python
Langchain
라이브러리 설치 및 구성. -
OCI Generative AI를 사용하여
cohere.command-r-08-2024
모델에 액세스합니다. -
보조 라이브러리를 설치합니다.
oracledb
sentence_transformers
numpy
mcp-server-fastmcp
asyncio
langchain_core
langchain_community
mcp
langgraph
langchain_mcp_adapters
phoenix
(OpenTelemetry의 관찰성용)opentelemetry-sdk
,opentelemetry-exporter-otlp
-
도구가 있는 기능적 MCP 서버:
resolve_ean
search_vectorized_product
search_invoices_by_criteria
-
ERP를 시뮬레이션하는 MCP 서버로 실행되도록
server_invoice_items.py
파일을 구성합니다. -
pip install -r requirements.txt
명령을 사용하여requirements.txt
파일을 다운로드하고 설치합니다.
작업 1: Oracle Database 23ai 생성(항상 무료)
이 작업에서는 항상 무료 모드로 Oracle Database 23ai를 프로비전하는 방법에 대해 알아봅니다. 이 버전은 추가 비용 없이 개발, 테스트 및 학습에 이상적인 완전 관리형 환경을 제공합니다.
-
OCI 콘솔에 로그인하고 Oracle Database, Autonomous Database로 이동한 다음 Autonomous Database 인스턴스 생성을 누릅니다.
-
다음 정보를 입력합니다.
- 데이터베이스 이름: 인스턴스에 대한 식별 이름을 입력합니다.
- 작업 로드 유형: 필요에 따라 데이터 웨어하우스 또는 트랜잭션 처리를 선택합니다.
- 컴파트먼트: 리소스를 구성할 적절한 컴파트먼트를 선택합니다.
-
인스턴스가 무료로 프로비전되도록 하려면 항상 무료를 선택합니다.
-
ADMIN
유저에 대해 데이터베이스 액세스에 사용할 보안 암호를 생성합니다. -
설정을 검토한 후 Autonomous Database 생성을 누릅니다. 인스턴스가 프로비전되어 사용할 수 있을 때까지 몇 분 정도 기다립니다.
작업 2: Autonomous Database 테이블 생성 스크립트 실행
사용 사례에 맞게 데이터베이스를 준비합니다. AI 에이전트와 송장을 조정하는 시나리오에 대한 세 가지 필수 테이블(PRODUCTS
, INVOICE
및 ITEM_INVOICE
)을 생성하는 script.sql
에서 SQL 스크립트를 다운로드하여 실행합니다.
-
OCI 콘솔로 이동하여 Oracle Database, Autonomous Database로 이동하고 새로 생성된 인스턴스의 이름을 누릅니다.
-
Database Actions 및 SQL을 눌러 브라우저에서 SQL 콘솔을 엽니다.
-
script.sql
파일을 다운로드하여 로컬로 열고 모든 내용을 SQL 콘솔 편집기에 붙여 넣습니다. -
Run을 누르거나 Ctrl + Enter를 누릅니다. 명령이 성공적으로 실행되었는지 확인할 때까지 기다립니다.
-
다음 명령을 실행하여 테이블이 생성되었는지 확인합니다.
SELECT table_name FROM user_tables;
작업 3: 테이블에 예제 데이터 삽입
AI 에이전트 적용을 위한 실제 시나리오를 시뮬레이션할 더미 데이터를 삽입합니다. 다음 두 가지 SQL 스크립트를 사용합니다.
insert_products_books.sql
: 각 EAN 및 설명과 함께 장부 목록을 제품으로 삽입합니다.invoice_data_insert.sql
: 고객, 제품 및 가격과 연계된 모의 A/R 송장 레코드를 삽입합니다.
이 데이터는 AI 상담원이 반품 송장의 불일치를 해결하는 데 사용됩니다.
-
OCI 콘솔로 이동하여 Oracle Database, Autonomous Database로 이동하고 새로 생성된 인스턴스의 이름을 누릅니다.
-
Database Actions 및 SQL을 눌러 브라우저에서 SQL 콘솔을 엽니다.
-
insert_products_books.sql
파일 콘텐츠(insert_products_books.sql
)를 다운로드하여 SQL 편집기에 붙여 넣습니다. -
Run을 누르거나 Ctrl + Enter를 누릅니다.
-
이제
invoice_data_insert.sql
파일 콘텐츠(invoice_data_insert.sql
파일)를 여기에서 다운로드하여 편집기에 붙여 넣습니다. -
Run을 누르거나 Ctrl + Enter를 누릅니다.
-
데이터를 확인하려면 다음 명령을 실행합니다.
SELECT * FROM PRODUCTS; SELECT * FROM INVOICE; SELECT * FROM ITEM_INVOICE;
작업 4: 데이터베이스에서 고급 검색 함수 생성 및 컴파일
제품 설명에서 키워드를 지능적으로 검색하는 fn_advanced_search
이라는 PL/SQL 함수를 생성합니다. 이 기능은 AI 에이전트가 resolve_ean
도구의 일부로 사용하므로 고객이 반품 노트에 제공한 설명을 기반으로 가장 가까운 EAN 코드를 찾을 수 있습니다.
함수는 무엇을 수행합니까?
-
입력 용어의 토큰화(예:
harry poter stone
는 [harry
,poter
,stone
]이 됨) -
점수부여가 있는 검색 기법:
-
직접 검색 - 설명
(LIKE '%term%')
→ +3점 -
SOUNDEX
→ +2 점을 사용하는 음성 검색 -
UTL_MATCH.EDIT_DISTANCE <= 2
→ +1 점을 사용하는 유사 철자 검색
-
-
점수부여 논리:
- 각 제품의 포인트를 합산합니다.
- 총 점수가 0보다 큰 제품만 반환합니다.
-
반환 포맷:
제품은 다음을 포함하는
result_product
유형 객체로 반환됩니다.code
(EAN)description
(제품 설명).similarity
(계산된 검색 점수).
단계를 수행합니다:
-
전체
similarity_search.sql
스크립트를 복사하여 자율운영 데이터베이스 SQL 콘솔에 붙여 넣습니다.여기에는 다음이 포함됩니다.
products
테이블을 생성합니다(아직 생성하지 않은 경우).- 텍스트 인덱스를 생성합니다.
product_result
및product_result_tab
를 입력합니다.fn_advanced_search
함수입니다.- 선택적 테스트
-
전체 스크립트를 실행합니다. 결과는
Function created
및Type created
여야 합니다. -
다음 query를 실행하여 시뮬레이트된 설명을 사용하여 함수를 테스트합니다.
SELECT * FROM TABLE(fn_advanced_search('harry poter askaban')) ORDER BY similarity DESC;
작업 5: AI를 사용한 의미 검색용 제품 벡터화
이 작업에서는 의미 벡터를 기반으로 하는 새로운 접근 방식으로 고급 SQL 기반 검색을 보완합니다. 이 기능은 임베딩(구문의 숫자 표현)을 사용하여 제품 설명 간의 유사성을 비교하는 AI 에이전트에 특히 유용합니다. 이는 단어 또는 음성 검색보다 유연하고 지능적입니다.
이를 위해 Oracle 데이터베이스에 연결하고, PRODUCTS
테이블에서 제품을 추출하고, 해당 설명을 벡터(임베딩)로 변환하고, Oracle 데이터베이스 자체를 사용하여 벡터 인덱스를 작성하는 Python 스크립트(process_vector_products.py
)를 사용합니다.
스크립트는 무엇을 수행합니까?
oracledb
를 사용하여products
테이블에서 제품을 읽습니다.sentence-transformers
패키지에서all-MiniLM-L6-v2
모델을 사용하여 임베딩을 생성합니다.- 벡터를 Oracle에 직접 저장할
embeddings_products
테이블을 생성합니다. - 레코드를 삽입 또는 갱신하고 벡터를 바이너리 BLOB(직렬화된
float32
형식)으로 저장합니다.
주: 임베딩은 BLOB로 저장되도록
np.float32.tobytes()
를 사용하여 바이트로 변환됩니다. 벡터를 검색하려면np.frombuffer(blob, dtype=np.float32)
를 사용합니다.
이 형식을 사용하면 SQL을 사용하여 직접 또는 np.dot
, cosine_similarity
또는 LLM과의 통합을 위해 데이터베이스에서 벡터를 로드하여 추후 유사성 검색을 수행할 수 있습니다.
이 스크립트는 제품에 대한 의미 임베딩을 생성하고 이러한 벡터를 Oracle Database 23ai에 기록합니다. 주요 사항은 다음과 같습니다.
-
전자 지갑을 사용하여 Oracle에 대한 접속 구성.
이 코드는 thin 모드에서
oracledb
라이브러리를 사용하고 Oracle Wallet을 사용하여 보안 액세스를 구성합니다.os.environ["TNS_ADMIN"] = WALLET_PATH connection = oracledb.connect( user=USERNAME, password=PASSWORD, dsn=DB_ALIAS, ... )
-
제품 표 상담.
products
테이블에는 원래 데이터(ID, 코드 및 설명)가 포함됩니다. 이러한 설명은 의미 벡터 생성의 기초로 사용됩니다.cursor.execute("SELECT id, code, description FROM products")
-
sentence-transformers
로 임베딩 생성all-MiniLM-L6-v2
모델은 제품 설명을 고차원 숫자 벡터로 변환하는 데 사용됩니다.model = SentenceTransformer('all-MiniLM-L6-v2') embeddings = model.encode(descriptions, convert_to_numpy=True)
-
임베딩 테이블이 없는 경우 생성
embeddings_products
테이블은 다음 필드와 함께 동적으로 생성됩니다.id
: 제품 식별자(기본 키)입니다.code
: 제품 코드.description
: 원래 설명입니다.vector
:float32
에서 직렬화된 벡터를 포함하는 BLOB입니다.
CREATE TABLE embeddings_products ( id NUMBER PRIMARY KEY, code VARCHAR2(100), description VARCHAR2(4000), BLOB vector )
주: 생성 시
BEGIN...EXCEPTION
내에EXECUTE IMMEDIATE
를 사용하여 테이블이 존재하는 경우 오류가 발생하지 않도록 합니다. -
MERGE
를 사용하여 삽입 또는 업데이트.각 제품에 대해 벡터는 바이트(
float32
)로 변환되고MERGE INTO
를 사용하여embeddings_products
테이블에 삽입되거나 갱신됩니다.vector_bytes = vector.astype(np.float32).tobytes()
MERGE INTO embeddings_products ...
다음 스크립트를 실행합니다.
주: Oracle Wallet을 다운로드하여 구성해야 합니다.
터미널에서 실행합니다.
python process_vector_products.py
완료! 데이터베이스의 제품이 벡터화되었습니다.
이 내용이 중요한 이유는 무엇입니까?
벡터 검색은 설명이 주관적이거나 정확하지 않거나 자연어일 때도 제품을 찾는 데 매우 효과적입니다.
코드 이해: MCP 서버가 있는 LLM 에이전트
이 프로젝트는 세 가지 주요 구성 요소로 구성됩니다.
- ReAct LangGraph 및 OCI LLM이 포함된 에이전트(
main.py
). - 송장 확인 도구가 포함된 MCP 서버(
server_invoice_items.py
). - OCI Generative AI 및 FAISS로 유사한 제품 검색하기(
product_search.py
).
각 구성 요소의 기능을 이해하고 상세하게 코드의 가장 중요한 부분을 강조 표시합니다.
-
ReAct OCI에서 LangGraph 및 LLM을 사용하는 에이전트:
이 구성요소는 사용자가 Oracle Cloud의 LLM(대형 언어 모델)을 기반으로 에이전트와 상호 작용하는 기본 애플리케이션을 실행합니다.
stdio
프로토콜을 사용하여 MCP 서버와 통신합니다.주요 특징:
-
피닉스와 OpenTelemetry를 사용한 원격 측정 구성.
px.launch_app() ... trace.set_tracer_provider(provider)
-
ChatOCIGenAI
를 사용하여 LLM 모델을 생성합니다.llm = ChatOCIGenAI( model_id="cohere.command-r-08-2024", ... )
-
송장 대사에 대한 태스크 중심 프롬프트의 정의
prompt = ChatPromptTemplate.from_messages([ ("system", """You are an agent responsible for resolving inconsistencies in invoices...""), ("placeholder", "{messages}") ])
-
stdio
를 사용하여 로컬 MCP 서버 실행.# Run the client with the MCP server async def main(): async with MultiServerMCPClient( { "InvoiceItemResolver": { "command": "python", "args": ["server_invoice_items.py"], "transport": "stdio", }, } ) as client:
-
기본 사용자 상호 작용 루프.
while True: query = input("You: ") ... result = await agent_executor.ainvoke({"messages": memory_state.messages})
-
MCP 서버에서 노출된 도구와 통합.
agent_executor = create_react_agent( model=llm, tools=tools, prompt=prompt, )
-
Multiples MCP Servers(다중 MCP 서버)
여러 MCP 서버를 사용하려는 경우 여기에 서버를 포함하십시오.
# Run the client with the MCP server async def main(): async with MultiServerMCPClient( { "InvoiceItemResolver": { "command": "python", "args": ["server_invoice_items.py"], "transport": "stdio", }, "InvoiceItemResolver": { "command": "python", "args": ["another_mcp_server.py"], "transport": "stdio", }, ... } ) as client: tools = client.get_tools() if not tools: print("❌ No MCP tools were loaded. Please check if the server is running.") return
프롬프트:
프롬프트는 AI 에이전트에 대한 프로세스 및 운영 규칙을 설정하는 데 필수적입니다.
-
-
해결 도구가 있는 MCP 서버:
이 서버는 제품 및 송장 정보와 함께 Oracle Database에 액세스하는 도구를 제공하여 에이전트 호출에 응답합니다.
주요 특징:
-
이름이
InvoiceItemResolver
인 MCP 서버 초기화.mcp = FastMCP("InvoiceItemResolver")
-
Oracle Wallet을 사용한 Oracle Database 연결.
connection = oracledb.connect( user=USERNAME, password=PASSWORD, dsn=DB_ALIAS, wallet_location=WALLET_PATH, ... )
-
MCP 도구 구현.
-
search_vectorized_product
:임베딩과 유사한 제품을 검색합니다.
@mcp.tool() def search_vectorized_product(description: str) -> dict: """ Searches for a product by description using embeddings. """ return sercher.search_similar_products(description)
-
resolve_ean
:설명 유사성에 따라 EAN을 해결합니다.
@mcp.tool() def resolve_ean(description: str) -> dict: result = execute_search_ean(description) ... return {"ean": result[0]["code"], ...}
-
search_invoices_by_criteria
:다중 필터를 기반으로 AR 송장을 검색합니다.
@mcp.tool() def search_invoices_by_criteria(customer: str = None, state: str = None, price: float = None, ean: str = None, margin: float = 0.05) -> list: """ Searches for outbound invoices based on customer, state, EAN, and approximate price. Allows one or more fields to be omitted. As long as an EAN has not been established, it is not useful to use this service. """ query = """ SELECT nf.no_invoice, nf.name_customer, nf.state, nf.date_print, inf.no_item, inf.code_ean, inf.description_product, inf.value_unitary FROM invoice nf JOIN item_invoice inf ON nf.no_invoice = inf.no_invoice WHERE 1=1 """ params = {} #if customer: query += " AND LOWER(nf.name_customer) LIKE LOWER(:customer)" params["customer"] = f"%{customer}%" #if state: query += " AND LOWER(nf.state) = LOWER(:state)" params["state"] = state #if ean: query += " AND inf.code_ean = :ean" params["ean"] = ean if price is not None: query += " AND inf.value_unitary BETWEEN :price_min AND :price_max" params["price_min"] = price * (1 - margin) params["price_max"] = price * (1 + margin) result = execute_query(query, params) return [ dict(zip( ["no_invoice", "name_customer", "state", "date_print", "no_item", "code_ean", "description_product", "value_unitary"], row )) for row in result ]
-
-
stdio
모드에서 서버를 실행합니다.if __name__ == "__main__": mcp.run(transport="stdio")
-
-
OCI Generative AI 및 Vector Database로 유사한 제품 검색하기:
이 모듈
product_search.py
은 다음을 사용하여 텍스트 설명에서 의미상 유사한 제품을 검색할 수 있는 Python 클래스를 구현합니다.- OCI Generative AI의 임베딩.
- Oracle Database 23ai를 사용한 벡터 인덱스.
- RapidFuzz와 폴백으로 퍼지 비교
작업 6: MCP 에이전트에서 모델 및 포함 구성
OCI Generative AI 서비스를 사용하여 MCP 프로토콜을 기반으로 대화 에이전트가 사용하는 언어 모델 및 임베딩을 구성해 보겠습니다.
-
언어 모델(LLM)을 구성합니다.
언어 모델은 메시지를 해석하고, 응답을 생성하고, 에이전트의 주요 두뇌 역할을 담당합니다.
-
main.py
파일에서 구성합니다.from langchain_community.chat_models.oci_generative_ai import ChatOCIGenAI llm = ChatOCIGenAI( model_id="cohere.command-r-08-2024", service_endpoint="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com", compartment_id="ocid1.compartment.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", auth_profile="DEFAULT", model_kwargs={"temperature": 0.1, "top_p": 0.75, "max_tokens": 2000} )
매개변수 설명 model_id
생성형 AI 모델 ID(예: cohere.command-r-08-2024
)service_endpoint
생성형 AI 서비스 지역 엔드포인트 compartment_id
OCI 컴파트먼트의 OCID auth_profile
~/.oci/config
파일에 구성된 프로파일의 이름입니다.model_kwargs
온도, top-p 및 응답 크기 -
사용 가능한 모델을 나열합니다.
-
OCI CLI 사용:
oci generative-ai model list --compartment-id <seu_compartment_id>
-
Python SDK 사용:
from oci.generative_ai import GenerativeAiClient from oci.config import from_file config = from_file(profile_name="DEFAULT") client = GenerativeAiClient(config) models = client.list_models(compartment_id=config["compartment_id"]) for model in models.data: print(model.display_name, model.model_id)
-
-
-
의미 검색에 대한 임베딩을 구성합니다.
유사한 제품 또는 상황별 정보 검색은 벡터 임베딩에 따라 달라집니다.
에이전트의 사용 예:
@mcp.tool() def search_vectorized_product(description: str) -> dict: """ Searches for a product by description using embeddings. """ return sercher.search_similar_products(description)
아래와 같이 매개변수(
product_search.py
)를 변경합니다.class SimilarProductSearch: def __init__( self, top_k=5, minimum_distance=1.0, model_id="cohere.embed-english-light-v3.0", service_endpoint="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com", compartment_id="ocid1.compartment.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", auth_profile="DEFAULT", wallet_path="/WALLET_PATH/Wallet_oradb23ai", db_alias="oradb23ai_high", username="USER", password="Password" ):
매개변수 설명 top_k
반환된 제안 수입니다. minimum_distance
관련 결과를 고려할 최대 거리입니다. model_id
OCI 내 임베딩 모델의 ID입니다(예: cohere.embed-english-light-v3.0
).service_endpoint
OCI Generative AI 지역 엔드포인트. compartment_id
컴파트먼트 OCID입니다. auth_profile
~/.oci/config
파일의 프로파일 이름입니다.wallet_path
Oracle Database 23ai 전자 지갑 경로입니다. db_alias
데이터베이스 별칭입니다. username
데이터베이스 사용자. password
데이터베이스 암호입니다. MCP 서버 구성:
process_vector_products.py
코드를 실행할 때와 마찬가지로 Oracle Database 23ai 데이터베이스에 대해 Oracle Wallet을 구성해야 합니다.설정에 따라 매개변수를 수정합니다.
import os # Oracle Wallet settings WALLET_PATH = "/path/to/Wallet" DB_ALIAS = "oradb23ai_high" USERNAME = "admin" PASSWORD = "..." # Define the environment variable required for the Oracle client os.environ["TNS_ADMIN"] = WALLET_PATH
그런 다음
process_vector_products.py
를 실행하여 제품을 Oracle Database 23ai로 벡터화합니다.python process_vector_products.py
이를 통해 LLM 모델 및 임베딩은 MCP 에이전트에서 LangGraph 및 LangChain와 함께 사용할 준비가 되었습니다.
작업 7: 제품 및 송장 설명 검색 테스트
-
다음 명령을 사용하여
main.py
파일을 실행합니다.python main.py
-
You: 프롬프트가 나타나면 다음 명령문을 입력합니다.
{ "customer": "Customer 108", "description": "Harry Poter askaban", "price": 82.26, "location": "SP"}
주: Harry Potter 및 Azkaban 장부의 이름은 철자가 잘못되었지만 엔진은 문제 없이 찾을 수 있습니다.
서비스가 실행되었음을 알 수 있습니다.
fetch_vectorized_product resolve_ean search_invoices_by_criteria
-
이제 다음 명령문을 입력하십시오.
{ "customer": "Customer 108", "description": "Harry Poter askaban", "price": 82.26}
송장 레코드를 찾을 수 없습니다. 그 이유는 위치가 송장 찾기의 핵심이기 때문입니다.
-
이제 다음 명령문을 입력하십시오.
{ "customer": "Customer 108", "description": "Harry Poter", "location": "SP"}
이번에는 위치를 입력하지만 단가는 생략합니다.
그러나 송장이 발견되었습니다. 이는 가격이 근본적이지는 않지만 격차를 좁혀 더 확실하게 만드는 데 도움이되기 때문입니다.
테스트의 몇 가지 예는 다음과 같습니다.
{ "customer": "Customer 108", "description": "Harry Poter askaban", "price": 82.26, "location": "SP"} { "customer": "Customer 108", "description": "Harry Poter askaban", "price": 82.26} { "customer": "Customer 108", "description": "Harry Poter askaban", "location": "SP"} { "customer": "Customer 108", "description": "Harry Poter askaban", "price": 82.26, "location": "RJ"} { "customer": "Customer 125", "description": "Harry Potter Chamber", "price": 79.16, "location": "SP"} { "customer": "Customer 125", "description": "Harry Potter Chamber", "price": 79.15, "location": "SP"}
작업 8: 피닉스로 관찰 가능성 보기
브라우저에 http://localhost:6006/
를 입력하여 Phoenix의 관찰 가능성을 확인합니다.
관련 링크
승인
- 작성자 - 크리스티아노 호시카와(Oracle LAD A-팀 솔루션 엔지니어)
추가 학습 자원
docs.oracle.com/learn에서 다른 랩을 탐색하거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하세요. 또한 education.oracle.com/learning-explorer를 방문하여 Oracle Learning Explorer가 되십시오.
제품 설명서는 Oracle Help Center를 참조하십시오.
Build an AI Agent with Multi-Agent Communication Protocol Server for Invoice Resolution
G35145-06
Copyright ©2025, Oracle and/or its affiliates.