4. Custom Agent Implementation & Testing
(1) 구글을 크롤해 링크드인에서 사용자 url을 찾는 함수 작성
from langchain import PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.agents import initialize_agent, Tool, AgentType
def lookup(name: str) -> str:
llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo")
template = """given the full name {name_of_person} I want you to get it me a link to their Linkedin profile page.
Your answer should contain only a URL"""
tools_for_agent = [Tool(name="Crawl Google 4 linkedin profile page", func={구글 검색 API 호출 함수}, # 의무
description="useful for when you need get the Linkedin Page URL")] # 선택(이나 써주면 당연히 생성에 큰 도움)
agent = initialize_agent(tools=tools_for_agent,
llm = llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True)
prompt_templete = PromptTemplate(template=template, input_variable=["name_of_person"])
linkedin_profile_url = agent.run(prompt_templete.format_prompt(name_of_person=name))
return linkedin_profile_url
(2) 구글 검색 API 호출 함수 작성
1. serpapi 사용 -> 회원 가입 및 API key -> .env 파일에 추가하여 저장
Google Search API - SerpApi
Scrape Google and other search engines from our fast, easy, and complete API.
serpapi.com
2. API를 호출하는 함수 작성 (tools/tools.py 작성)
from langchain.serpapi import SerpAPIWrapper
def get_profile_url(text:str) -> str:
search = SerpAPIWrapper()
res = search.run(f'{text}')
return res
- 답변이 나올 때, "링크" 주소만 받기 위한 동작을 빠르게 구현하기 위해 소스코드를 조작.
(해당 방식 보다 자신이 새롭게 클래스를 정의해서 사용하는 것이 더욱 바람직하다고 함.)
# serpapi.py
for organic_result in res.get("organic_results", []):
if "snippet" in organic_result.keys():
snippets.append(organic_result["link"]) # snippets->links로 수정
(3) 메인 실행 파일에 코드 추가
from third_parties.linkedin import scrape_linkedin_profile
from agents.linkedin_lookup_agent import lookup as linkedin_lookup_agent
# ...
if __name__ == "__main__":
linkedin_profile_url = linkedin_lookup_agent(name="Eden Marco") # 이름에 힌트를 추가하면 조금 더 잘나온다~
information = scrape_linkedin_profile(linkedin_profile_url)
print(summary_by_llm_dosent(information))
5. Output Parsers
- Json 형태로 변환하는 코드 작성 (프론트엔드로 보내기 위한 준비)
- PydanticOutputParser 사용 : https://python.langchain.com/docs/modules/model_io/output_parsers/types/pydantic
Pydantic parser | 🦜️🔗 Langchain
This output parser allows users to specify an arbitrary Pydantic Model
python.langchain.com
# output_parser.py
from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
from typing import List
class PersonIntel(BaseModel):
summary: str = Field(description="Summary of the person")
facts: List[str] = Field(description="Interesting facts about the person")
topics_of_interest: List[str] = Field(
description="Topics that may interest the person"
)
ice_breakers: List[str] = Field(
description="Create ice breakers to open a conversation with the person"
)
def to_dict(self):
return {
"summary": self.summary,
"facts": self.facts,
"topics_of_interest": self.topics_of_interest,
"ice_breakers": self.ice_breakers,
}
person_intel_parser = PydanticOutputParser(pydantic_object=PersonIntel)
6. FullsStack App : 나머지 완성
(프론트엔드 코드는 그냥 가져옴)
- Flask 사용해서 API 작성 (app.py)
from flask import Flask, render_template, request, jsonify
from ice_breaker import summary_ice_breaker
app = Flask(__name__)
@app.route("/")
def index():
return render_template("index.html")
@app.route("/process", methods=["POST"])
def process():
name = request.form["name"]
person_info, profile_pic_url = summary_ice_breaker(name=name)
return jsonify(
{
"summary": person_info.summary,
"interests": person_info.topics_of_interest,
"facts": person_info.facts,
"ice_breakers": person_info.ice_breakers,
"picture_url": profile_pic_url,
}
)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000, debug=True)
[이슈 목록]
- mac 5000번 포트 안열림 문제 ... 포트 번호 변경으로 해결 (https://algoroot.tistory.com/44#google_vignette)
Ice breaker 앱 만들기 끝! https://github.com/annmunju/cource-langchain/tree/main/ice_breaker
'데이터 어쩌구 > 기술 써보기' 카테고리의 다른 글
[4주차] ReAct Agent 만들기 (1) | 2024.04.02 |
---|---|
이미지 생성 모델 (2024. 02) (0) | 2024.02.27 |
[2주차] Ice Breaker app 만들기 (1) (2) | 2024.01.02 |
[1주차] 강의 시작 : "Hello World" chain (0) | 2023.12.26 |
TensorFlow Lite를 이용한 기기 내 대규모 언어모델 탑재 실습 (0) | 2023.09.03 |