본문 바로가기


프로젝트 하면서

LangChain 실습(1)

by worldforest 2025. 12. 26.
chain = prompt_template | llm

chain.invoke("광주")
wsl
conda create --name agent python=3.12

 

conda activate agent

Proceed ([y]/n) ?
# To activate this environment, use
#
#     $ conda activate agent
#
# To deactivate an active environment, use
#
#     $ conda deactivate

requirements.txt
0.00MB

pip install -r requirements.txt
python -m ipykernel install --user --name agent --display-name agent

루트 경로에 .env 만들고 OpenAI API Key 환경변수 설정

OPENAI_API_KEY=sk-proj- ...

환경변수 가져오기

from dotenv import load_dotenv
from langchain_openai import ChatOpenAI

load_dotenv()

 

모델 설정

model = "gpt-5-mini-2025-08-07"


llm = ChatOpenAI(
    temperature=0,
    model_name= model
)

llm.invoke("안녕")

 

프롬프트 템플릿 생성

from langchain_core.prompts import PromptTemplate


template = "{city}의 특산물은 무엇인가?"


prompt_template = PromptTemplate.from_template(template)


prompt_template.format(city='대구')

 

 

yaml 파일로 생성

_type: "prompt"
template: |
  {dish} 요리의 레시피를 다음 형식에 맞게 상세하게 설명하세요.
  한국어로 200자 내외로 작성해주세요


  [레시피 형식]
  1. 주요 재료
  2. 조리 시간
  3. 조리 방법
  4. 팁
  #Answer:
input_variables: ["dish"]
recipe_prompt =  load_prompt('recipe.yaml')

recipe_chain = recipe_prompt | llm

recipe_chain.invoke("고향만두")

 

 


사용할 더미 data 

data = [
    {
        "question" : "A가 좋아하는 음식",
        "answer"   : "닭갈비, 일식카레, 오므라이스, 김치볶음밥, 초밥"
    },
    {
        "question" : "B가 좋아하는 음식",
        "answer"   : "초밥, 스파게티, 포케, 삼계탕, 돈가스"
    },
    {
        "question" : "C가 좋아하는 음식",
        "answer"   : "짜장면, 떡볶이, 미역국, 피자, 수육"
    }
]

 

Question에 해당하는 answer가 담긴 더미 data를 example prompt로 생성

from langchain_core.prompts.few_shot import FewShotPromptTemplate
example_prompt = PromptTemplate(
    input_variables=["question", "answer"],
    template="문장: {question}\n정답: {answer}"
)

 

LangChain에서 Few-Shot Prompting 구현할 때

템플릿 설정하는 단계

few_shot_prompt = FewShotPromptTemplate(
    examples=data,
    example_prompt=example_prompt,
    suffix="Question:\n{question}\nAnswer",
    input_variables=["input"])
examples=data 학습시킬 데이터셋(질문-답변)  
example_prompt=example_prompt 예시 data를 문장 구조로 변환해 AI에 전  
suffix 사용자 질문이들어갈 자리   
input_variables 사용자가 입력할 변수명  
from langchain_core.output_parsers import StrOutputParser

few_chain = few_shot_prompt | llm | StrOutputParser()

few_chain.invoke("A하고 B하고 점메추")

 


from langchain_core.prompts import ChatPromptTemplate

chat_template = ChatPromptTemplate.from_messages(
    [
        ("system", "당신은 강원 출신 사투리를 사용하는 쉐프입니다.  당신의 이름 {name}입니다. "),
        ('human', "안녕하세요"),
        ('ai', "무슨 요리를 도와드릴까?"),
        ('human' , "{user_input}"),
    ]
)

messages = chat_template.format_messages(name='백종원', user_input="고향만두에 들어가는 재료는 어떤게 필요한가요?")

llm.invoke(messages)

chain = chat_template | llm | StrOutputParser()

chain.invoke({'name' : '백종원', 'user_input' : '순대국 만드는 법을 알려주세요'})

 

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

chat_prompt2 = ChatPromptTemplate.from_messages(
    [
        ("system", "당신은 아재 개그를 전문으로 하는 AI 어시스턴트입니다. 사용자 요청한 내용을 맞게 유머를 이야기하세요"),
        MessagesPlaceholder(variable_name='conversation'),
        ('human', '현재까지 대화 내용을 바탕으로 {humor} 이야기 해주세요')
    ]
)

chain2 = chat_prompt2 | llm | StrOutputParser()

chain2.invoke({'humor':  '아재개그',
               'conversation' : [
                   ('human', "사람들에게 말해줄 아재개그좀 알려주세요"),
                   ('ai', "넋이 나가 있는 벌레는?  해벌레"),
                   ('human', "또 다른 아재 개그도 말해주세요"),
                    ('ai', "오리가 얼면?  언덕"),
               ]
               })
from langchain_community.document_loaders import WebBaseLoader

url = "https://www.doctorsnews.co.kr/"

article = WebBaseLoader(url).load()[0].page_content

template = "아래 뉴스 기사를 요약해서 할것 \n\n{article}"

prompt = PromptTemplate.from_template(template)

result = llm.invoke(prompt.format(article=article))

print(result.content)
반응형

댓글