본문 바로가기
강의록~스터디/LangChain

[3주차] Ice Breaker app 만들기 (2)

by annmunju 2024. 1. 8.

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

 

728x90