Post

Langchain Study | 3-2. Agents 2 - Agent + Retrievers

✏️ Edit
Langchain Study | 3-2. Agents 2 - Agent + Retrievers

언어 모델이 모르는 정보에 대해 대답하게 하는 기법인 RAG도 Agent에 적용해볼 수 있습니다.

바로 Retrievers를 Tool로 변환하여 간단하게 적용해줄 수 있습니다.

이번 글에서는 Retreivers를 Tool로 변환하여 Agent에서 사용해보도록 하겠습니다!


WikipediaRetriever를 Agent의 Tool로 적용해보기

Langchain에서는 위키피디아 정보를 정보원으로 활용할 수 있는 retriver인 WikipediaRetriever를 제공하고 있습니다. 이 retriever를 이용해서 위키백과에서 입력된 토픽에 대해 찾아볼 수 있습니다.

우리는 agent과의 결합을 통해 위키피디아에 키워드에 대해 물어보고, 답변을 한국어로 변환해서 로컬에 텍스트파일로 저장해주는 코드를 구현해봅시다.

그러면 우선 위 과정을 위해서는 두 가지 툴이 필요합니다.

  • 위키피디아에 키워드 검색

  • 파일 저장

여기서 우리는 위키피디아에 키워드 검색 툴을 WikipediaRetriever를 가지고 구현해볼 예정입니다.

agent_rag.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from langchain.agents import AgentType, Tool, initialize_agent
from langchain.agents.agent_toolkits import create_retriever_tool  #← create_retriever_tool을 가져오기
from langchain.chat_models import ChatOpenAI
from langchain.retrievers import WikipediaRetriever #←WikipediaRetriever를 가져오기
from langchain.tools import WriteFileTool

chat = ChatOpenAI(
    temperature=0,
    model="gpt-3.5-turbo"
)

tools = []

tools.append(WriteFileTool(
    root_dir="./"
))

retriever = WikipediaRetriever( #←WikipediaRetriever를 초기화
    lang="ko", #←언어를 한국어로 설정
    doc_content_chars_max=500,  #←글의 최대 글자 수를 500자로 설정
    top_k_results=1 #←검색 결과 중 상위 1건을 가져옴
)

tools.append(
    create_retriever_tool(  #←Retrievers를 사용하는 Tool을 생성
        name="WikipediaRetriever",  #←Tool 이름
        description="입력된 단어에 대한 Wikipedia 기사를 검색할 수 있다",  #←Tool 설명
        retriever=retriever,  #←Retrievers를 지정
    )
)

agent = initialize_agent(
    tools,
    chat,
    agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)

result = agent.run("판나코타에 대해 Wikipedia에서 찾아보고 그 개요를 한국어로 result.txt 파일에 저장하세요.")

print(f"실행 결과: {result}")

create_retriever_tool을 이용해서 Retrievers를 사용하는 Tool을 생성합니다. 기존에 Tool을 생성했던 것과 마찬가지로 namedescription을 기재합니다. 직전에 직접 툴을 생성할 때는 func 파라미터를 통해 처리할 액션을 함수로 지정해주었는데요, 이번에는 retriever에 Tool화할 Retrievers를 지정해주도록 합니다. 우리는 위에서 선언한 WikipediaRetriever를 지정해주었습니다.

initialize_agent를 통해 tools와 chat을 지정해주고, 여러가지 툴을 이용하기 때문에 STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION 방식을 선언해줍니다.

코드를 수행하면 WikipediaRetriever를 통해 위키피디아에서 판나코다에 대해 검색하고, 검색한 결과를 result.txt로 저장해줍니다.


✏️ Wrap up!

이번 예제에서는 Retriever를 Tool로 변환하여 Agent에서 활용할 수 있는 예제를 만들어보았습니다.

이번엔 이미 존재하는 retriever인 WikipediaRetriever을 통해 구현해보았지만, 저희가 직접 임베딩하여 저장해둔 벡터 DB을 retriever로 변환하여 같은 방법으로 구현해볼 수 있습니다.

PDF기반 챗봇만들기 (실습)에서 생성해둔 vector databse retriever를 통해 비행기자동차의 최고 속도에 대한 정보를 영어로 번역해서 text 파일로 로컬에 저장해주는 코드를 한 번 구현해보시는 것도 재밌는 경험이 되실 거예요 :)

힌트를 드리자면 벡터 DB을 as_retriever()를 통해 retriever로 변환할 수 있답니다!

다음은 Memory 모듈을 Agent에 결합하여, 문맥에 맞게 답변하는 에이전트를 만들어보겠습니다!