Building Agentic RAG with LlamaIndex - 2. Tool Calling

jihyelee·2024년 6월 1일
0

Tool (도구)

에이전트가 활용할 수 있는 일종의 인터페이스

  • 위키피디아를 검색할 수 있는 WikipediaTool
  • 아카이브를 검색할 수 있는 ArxivTool
  • 주어진 문서를 인덱싱해 이를 바탕으로 쿼리를 처리하도록 도와주는 QueryEngineTool
from llama_index.core import SummaryIndex
from llama_index.core.tools import QueryEngineTool

summary_index = SummaryIndex(nodes)
summary_query_engine = summary_index.as_query_engine(
          					response_mode="tree_summarize",
          					use_async=True,
      					)
summary_tool = QueryEngineTool.from_defaults( # Query Engine을 Tool처럼 사용
          			name="summary_tool",
          			query_engine=summary_query_engine,
          			description=("Useful if you want to get a summary of MetaGPT"),
      			)
  • 사용자가 정의한 함수를 도구처럼 사용할 수 있도록 도와주는 FunctionTool
from llama_index.core.tools import FunctionTool
 
def add(x: int, y: int) -> int:
	"""Adds two integers together.""" # LLM의 프롬프트로 사용됨
	return x + y

def mystery(x: int, y: int) -> int:
	"""Mystery function that operates on top of two numbers."""
	return (x + y) * (x + y)

add_tool = FunctionTool.from_defaults(fn=add)
mystery_tool = FunctionTool.from_defaults(fn=mystery)

Tool Calling

  • 일반적인 RAG에서 LLM은 답변을 생성(synthesis)하는 데에만 사용됨
  • Agentic RAG에서 LLM은 의사 결정 또한 진행
    • e.g. 실행할 함수를 선택
      • 일례로, WikipediaTool은 페이지를 로드하는 load_data와 페이지를 검색하는 search_data 함수를 제공
    • e.g. 함수에 사용될 적절한 인자(argument)를 추론
  • 다양한 도구 인터페이스를 활용해 LLM은 외부 환경과 상호작용할 수 있음
  • Tool Calling은 사용자의 복잡한 질문을 잘 이해하고 더욱 정확한 결과를 생성할 수 있게 도와줌
from llama_index.llms.openai import OpenAI
 
llm = OpenAI(model="gpt-3.5-turbo")
response = llm.predict_and_call(
    [add_tool, mystery_tool], # 사용할 도구
    "Tell me the output of the mystery function on 2 and 9", # 프롬프트 혹은 일련의 ChatMessage
    verbose=True
)

Metadata filters

  • LLM으로 하여금 벡터 검색을 선택하도록 할 뿐만 아니라, 메타데이터를 활용하도록 할 수 있음
  • 메타데이터란, 구조화된 일련의 태그 정보
    • 더욱 정확한 결과를 생성할 수 있도록 함
    • 사용자 정의 가능
from llama_index.core import SimpleDirectoryReader
documents = SimpleDirectoryReader(input_files=["metagpt.pdf"]).load_data() # 문서 로드
 
from llama_index.core.node_parser import SentenceSplitter
splitter = SentenceSplitter(chunk_size=1024)
nodes = splitter.get_nodes_from_documents(documents) # 문서를 노드로 분할
 
print(nodes[0].get_content(metadata_mode="all")) # 첫 번째 노드의 정보를 출력 (메타데이터 포함)
# page_label: 1
# file_name: metagpt.pdf
# file_path: metagpt.pdf
# file_type: application/pdf
# file_size: 16911937
# creation_date: 2024-05-13
# last_modified_date: 2024-04-23 ...

from llama_index.core import VectorStoreIndex
from llama_index.core.vector_stores import MetadataFilters
 
vector_index = VectorStoreIndex(nodes)
query_engine = vector_index.as_query_engine(
    similarity_top_k=2,
    filters=MetadataFilters.from_dicts(
        [
            {"key": "page_label", "value": "2"} # page_label 메타데이터 정보를 활용해 필터링
        ]
    )
)
 
response = query_engine.query(
    "What are some high-level results of MetaGPT?",
)
profile
Graduate student at Seoul National University, majoring in Artificial Intelligence (NLP). Currently AI Researcher at LG CNS AI Lab

0개의 댓글