랭체인

Ch.4 LangChain 주요 파라미터, 기본 llm 생성 코드, LogProb, Streaming, Langsmith 추적

유방울 2025. 1. 17. 12:06

파라미터

temperature

0~2 사이

0에 가까울수록 창의성이 낮음

광고문구 생성 : 좀 더 창의적이어야 함 0.8, 1로 올리기

max_tokens 4069 디폴트

채팅완성에서 생성할 모델 리스트

 

inovke 

출력할 때 항상 사용

알아두면 좋은 것 

way 1

우클릭 - go to definition

way 2

새로운 셀에 ChapOpenAI ?

-> 이거를 닥스트링이라고 부름

설정할 수 있는 옵션값이 많은데 필요에 따라서 쓰면 됨

미리 실행해서 결과 받았는데

from langchain_openai import ChatOpenAI

# 마이스 호버를 가져다 되면 파라미터 종류가 나옴
# 객체 생성 llm 옵션
llm = ChatOpenAI(
    temperature=0.1,  # 창의성 (0.0 ~ 2.0)
    model_name="gpt-4o-mini",  # 모델명
)

# 질의내용
question = "대한민국의 수도는 어디인가요?"

#  질의
print(f"[답변]: {llm.invoke(question)}")

[답변]: content='대한민국의 수도는 서울입니다.' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 9, 'prompt_tokens': 16, 'total_tokens': 25, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-mini-2024-07-18', 'system_fingerprint': 'fp_bd83329f63', 'finish_reason': 'stop', 'logprobs': None} id='run-d5d41526-a50d-439d-a794-f46cd0756e05-0' usage_metadata={'input_tokens': 16, 'output_tokens': 9, 'total_tokens': 25, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}

temperature 쓰고

답변을 받기 까지의 추가적인 부분이 같이 출력됨

 

답변의 형식 (AI Message)

# 질의내용
question = "대한민국의 수도는 어디인가요?"

# 질의
response = llm.invoke(question)

 

# AIMessage 객체 안에 content가 있는 것을 볼 수 있음
# content라는 key가 있고 그 안에 답변이 들어가 있음
response

AIMessage(content='대한민국의 수도는 서울입니다.', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 9, 'prompt_tokens': 16, 'total_tokens': 25, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-mini-2024-07-18', 'system_fingerprint': 'fp_bd83329f63', 'finish_reason': 'stop', 'logprobs': None}, id='run-c8efb1f4-c46c-46e0-9dcc-7f16544f6444-0', usage_metadata={'input_tokens': 16, 'output_tokens': 9, 'total_tokens': 25, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})

# content만 출력
response.content

LogProb 활성화


주어진 텍스트에 대한 모델의 **토큰 확률의 로그 값** 을 의미합니다. 토큰이란 문장을 구성하는 개별 단어나 문자 등의 요소를 의미하고, 확률은 **모델이 그 토큰을 예측할 확률**을 나타냅니다.

많이 쓰지는 않지만 무튼 할 수 있음

 

 

Streaming 스트리밍 출력

스트리밍 옵션은 질의에 대한 답변을 실시간으로 받을 때 유용합니다.

기다렸다가 답변 주는 게 아니라

따따다ㄸ다 답변을 함

 

코드예시

 

# 스트림 방식으로 질의
# answer 에 스트리밍 답변의 결과를 받습니다.
answer = llm.stream("대한민국의 아름다운 관광지 10곳과 주소를 알려주세요!")

1. 기본

# 스트리밍 방식으로 각 토큰을 출력합니다. (실시간 출력)
# 이 토큰을 나열만 한거지 저장이 안됨... 저장을 하려면 다른 추가 코드가 필요함
for token in answer:
    print(token.content, end="", flush=True) # 토큰 하나하나는 이어서 붙인 것임
    
    대한민국에는 아름다운 관광지가 많이 있습니다. 아래는 추천하는 10곳과 그 주소입니다.

1. **경복궁**
   - 주소: 서울특별시 종로구 사직로 161

2. **제주도**
   - 주소: 제주특별자치도 제주시

3. **부산 해운대 해수욕장**
   - 주소: 부산광역시 해운대구 해운대해변로 264

4. **경주 불국사**
   - 주소: 경상북도 경주시 불국로 385

5. **남이섬**
   - 주소: 강원도 춘천시 남이섬길 1

6. **전주 한옥마을**
   - 주소: 전라북도 전주시 완산구 기린대로 99

7. **설악산 국립공원**
   - 주소: 강원도 속초시 설악산로 173

8. **안동 하회마을**
   - 주소: 경상북도 안동시 풍천면 하회리

9. **서울 남산타워 (N서울타워)**
   - 주소: 서울특별시 용산구 남산공원길 105

10. **광주 무등산**
    - 주소: 광주광역시 동구 무등산로 100

이 외에도 많은 아름다운 장소가 있으니, 여행 계획에 참고하시기 바랍니다!

2. 직접 구현하는 코드

answer = llm.stream("대한민국의 아름다운 관광지 10곳과 주소를 알려주세요!")

# final_anwer 빈 열 변수 지정
# 어려운 코드는 아니나 이거 번거로우니까 teddynot가 만든 패키지에서 간단하게 사용할 수 있음
final_anwser = ""
for token in answer:
    print(token.content, end="", flush=True)
    final_anwser += token.content

3. 테디가 만든 패키지에서 코드

from langchain_teddynote.messages import stream_response

# 스트림 방식으로 질의
# answer 에 스트리밍 답변의 결과를 받습니다.
answer = llm.stream("대한민국의 아름다운 관광지 10곳과 주소를 알려주세요!")
stream_response(answer)

4. 테디가 만든 패키지에서 final_answer2 변수 넣어서 재사용 가능한 코드 

# 최종 답변을 받아서 새로운 셀에서 또 출력하는 코드
from langchain_teddynote.messages import stream_response

answer = llm.stream("대한민국의 아름다운 관광지 10곳과 주소를 알려주세요!")
final_anwer2 = stream_response(answer, return_output=True)

print(final_anwer2)

주의할 점(오류난 부분)

한 퀘스쳔에 한 앤서를 받음

-> 앤서를 받은 퀘스쳔은 다시 앤서를 받을 수 없음

 

스트리밍 질문을 앞에서 본 기본 답변 형식에 적용한다면?

# 질의내용
question = "대한민국의 아름다운 관광지 10곳과 주소를 알려주세요?"

# 질의
response = llm.invoke(question)
response

AIMessage(content='대한민국에는 아름다운 관광지가 많이 있습니다. 아래는 그 중 10곳과 해당 주소입니다.\n\n1. **경복궁**\n   - 주소: 서울특별시 종로구 사직로 161\n\n2. **부산 해운대 해수욕장**\n   - 주소: 부산광역시 해운대구 우동\n\n3. **제주 성산일출봉**\n   - 주소: 제주특별자치도 서귀포시 성산읍 성산리 1\n\n4. **경주 불국사**\n   - 주소: 경상북도 경주시 불국로 385\n\n5. **설악산 국립공원**\n   - 주소: 강원도 속초시 설악산로 833\n\n6. **남이섬**\n   - 주소: 강원도 춘천시 남산면 남이섬길 1\n\n7. **전주 한옥마을**\n   - 주소: 전라북도 전주시 완산구 기린대로 99\n\n8. **안동 하회마을**\n   - 주소: 경상북도 안동시 풍천면 하회종가길 40\n\n9. **서울 남산타워 (N서울타워)**\n   - 주소: 서울특별시 용산구 남산공원길 105\n\n10. **순천만 국가정원**\n    - 주소: 전라남도 순천시 국가정원1호길 47\n\n이 관광지들은 각기 다른 매력을 가지고 있어 다양한 경험을 제공할 것입니다. 방문 계획을 세우실 때 참고하시기 바랍니다.', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 348, 'prompt_tokens': 23, 'total_tokens': 371, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-2024-08-06', 'system_fingerprint': 'fp_4691090a87', 'finish_reason': 'stop', 'logprobs': None}, id='run-8f65fabf-32d6-4179-bc7b-d9ad2d4b9adf-0', usage_metadata={'input_tokens': 23, 'output_tokens': 348, 'total_tokens': 371, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})

 

 


Langsmith 

개발에서 오류났으면

langsmith를 보면 어디서 오류났는지 유추하기 편함

이거를 활성화하기 위해서는 추적

 

근데 추적을 원하지 않으면 set_enable=False

원하면 True -> 디폴트 값이 True임

# LangSmith 추적을 설정합니다. https://smith.langchain.com
# .env 파일에 LANGCHAIN_API_KEY를 입력합니다.
# !pip install -qU langchain-teddynote
from langchain_teddynote import logging

# 프로젝트 이름을 입력합니다.
# 원하지 않을시
# logging.langsmith("CH01-Basic", set_enable=False)

logging.langsmith("CH01-Basic")

LangSmith 추적을 시작합니다.
[프로젝트명]
CH01-Basic