제목: LangChain으로 데이터베이스 기반 Q&A 로봇 구축 (4): 프록시를 통한 외부 도구 사용

이전 튜토리얼에서 매우 강력한 행동 패턴인 ReAct 시스템을 소개했는데, LLM에게 어떻게 생각하고 행동해야 하는지 알려주기 위해 많은 예제를 작성해야 하고, 이 패턴을 따르기 위해서는 텍스트를 분석 및 생성하고, 함수를 호출하고, 프롬프트를 연결하는 등의 작업은 매우 번거롭고 시간이 많이 걸립니다. LangChain은 이러한 단계를 숨기고 이러한 일련의 작업을 "에이전트"로 캡슐화합니다. 사용할 수 있는 도구와 이러한 도구의 기능만 제공하면 LLM이 이러한 작업을 자동으로 완료할 수 있습니다. 이러한 방식으로 우리의 코드는 간결하고 읽기 쉬우며 더 높은 유연성을 갖게 됩니다.

대리인

소위 프록시는 사용할 수 있는 일련의 동작과 도구를 캡슐화하여 이러한 작업이 어떻게 완료되는지 신경 쓰지 않고 간단한 인터페이스를 통해 이러한 작업을 호출할 수 있도록 합니다. 이렇게 하면 코드가 더 간결하고 읽기 쉽고 더 높은 유연성을 가질 수 있습니다. 다음으로 ReAct와 벡터 데이터베이스를 결합하여 에이전트 사용을 소개합니다.

준비

이전과 마찬가지로 환경 변수를 설정하는 것으로 시작합니다.

# set the environment variables needed for openai package to know to reach out to azure
import os

os.environ["OPENAI_API_TYPE"] = "azure"
os.environ["OPENAI_API_BASE"] = "https://<your-endpoint.openai.azure.com/"
os.environ["OPENAI_API_KEY"] = "your AzureOpenAI key"
os.environ["OPENAI_API_VERSION"] = "2023-03-15-preview"

다음으로 먼저 llm 클래스를 생성해 보겠습니다.

from langchain.chat_models import AzureChatOpenAI
from langchain.embeddings import OpenAIEmbeddin Whether to return only outputs in the
                response. If True, only new keys generated by this chain will be
                returned. If False, both input keys and new keys generated by this
                chain will be returned. Defaults to False.gs

llm = AzureChatOpenAI(deployment_name="gpt-35-turbo", temperature=0)
embeddings = OpenAIEmbeddings(deployment="text-embedding-ada-002", chunk_size=1)

벡터 데이터베이스는 이전 자습서에서 이미 생성되었으므로 from_existing_index데이터베이스에 직접 연결하는 데 사용합니다. 다음은 index_name이전에 데이터베이스를 만들 때 지정한 이름입니다. 또한 서로 다른 데이터베이스에서 사용하는 연결 방법이 다를 수 있으므로 자세한 내용은 각 데이터베이스의 문서를 참조하십시오 .

from langchain.vectorstores.redis import Redis

rds = Redis.from_existing_index(
    embeddings, redis_url="redis://localhost:6379", index_name="link"
)
retriever = rds.as_retriever()

빌드 도구

프록시를 사용하면 llm이 외부 도구를 사용할 수 있지만 먼저 도구를 만들고 도구에 대한 설명을 작성합니다. 우리의 목적은 llm이 질문을 기반으로 데이터베이스에서 답변을 검색할 수 있도록 하는 것이므로 우리가 만드는 도구는 이와 관련되어야 합니다. 리트리버의 검색 기능을 함수로 랩핑하여 도구로 사용할 수도 있지만 이전 튜토리얼에서 소개한 체인을 사용할 수도 있고 그 출력은 RetrievalQA문자열이고 관련 정보가 먼저 정리되어 있는데 이는 당연하다. 리트리버보다 효율적입니다.

from langchain.chains import RetrievalQA

qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever)

그런 다음 Tool위에서 만든 체인을 . 그 중 func매개변수는 에이전트 시스템에게 호출할 함수를 알려주는 것으로 description이 도구에 대한 설명이다. 우리는 패키지 도구를 목록에 넣어 그가 사용할 수 있는 도구를 시스템에 알려줍니다.

from langchain.agents import Tool

tools = [
    Tool(
        name="Contract QA System",
        func=qa.run,
        description="useful for when you need to answer questions about contracts."
    )
]

프록시 생성

initialize_agent함수를 사용하여 프록시를 생성합니다. 여기서 매개변수 agent는 생성하려는 에이전트 유형을 시스템에 알리는 것입니다. 여기에서 생성하는 것은 채팅 모델을 사용하고 있기 때문에 CHAT_ZERO_SHOT_REACT_DESCRIPTION이름에 있는 CHAT가 채팅 에이전트임을 나타냅니다. 프롬프트는 ZERO_SHOT에이전트가 아님을 나타냅니다. 예를 작성하되 설명을 통해서만 llm의 동작을 부팅합니다.

agent_chain = initialize_agent(
    tools, llm, agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)

그런 다음 run메소드를 사용하여 에이전트를 실행하십시오.

agent_chain.run("在什么情况下可以单方面解除合同?")
> Entering new  chain...
Thought: This question is asking about the circumstances under which a contract can be unilaterally terminated.

Action:
\```
{
  "action": "Contract QA System",
  "action_input": "在什么情况下可以单方面解除合同?"
}
\```


Observation: 根据文本,可以单方面解除合同的情况包括:

- 在承担国家重大科研项目期间;
- 掌握重大科技成果关键技术和资料,未脱离保密期;
- 被审查期间或因经济问题未作结案处理之前;
- 合同订立时所依据的客观情况发生重大变化,致使合同无法履行,经甲乙双方协商不能就变更合同达成协议的;
- 甲方提出解除本合同,乙方同意解除的;
- 乙方患病或者非因工负伤,医疗期满后,不能从事原工作也不能从事由甲方安排的其他工作,甲方单方面解除本合同的;
- 乙方年度考核或者聘期考核不合格,又不同意甲方调整其工作岗位的;
- 在试用期内被证明不符合本岗位要求;
- 连续旷工超过 10 个工作日或者 1 年内累计旷工超过 20 个工作日的;
...

Final Answer: 根据文本,可以单方面解除合同的情况有很多种,包括在承担国家重大科研项目期间、合同订立时所依据的客观情况发生重大变化、甲方提出解除本合同且乙方同意解除等。此外,乙方在试用期内、考入普通高等院校、被录用或者选调为公务员、依法服兵役的情况下也可以随时单方面解除合同。如果乙方提出解除合同未能与甲方协商一致,乙方应当坚持正常工作,继续履行合同;6个月后再次提出解除合同仍未能与甲方协商一致的,即可单方面解除合同。

> Finished chain.

'根据文本,可以单方面解除合同的情况有很多种,包括在承担国家重大科研项目期间、合同订立时所依据的客观情况发生重大变化、甲方提出解除本合同且乙方同意解除等。此外,乙方在试用期内、考入普通高等院校、被录用或者选调为公务员、依法服兵役的情况下也可以随时单方面解除合同。如果乙方提出解除合同未能与甲方协商一致,乙方应当坚持正常工作,继续履行合同;6个月后再次提出解除合同仍未能与甲方协商一致的,即可单方面解除合同。'

이런 식으로 ReAct 프로세스를 쉽게 완료할 수 있으며 실제로 소스에서 답변을 검색할 수 있습니다. LangChain을 사용하면 간결한 코드를 사용하여 이러한 복잡한 작업을 완료할 수 있고 프롬프트를 작성할 필요가 없으므로 비즈니스 논리에 더 집중할 수 있습니다.

추천

출처blog.csdn.net/chenjambo/article/details/131908114