app.py의 일부 코드
from langchain_google_genai import ChatGoogleGenerativeAI,GoogleGenerativeAIEmbeddings
load_dotenv()
def create_app():
app = Flask(__name__)
geminiLangchain = ChatGoogleGenerativeAI(
model="gemini-2.0-flash-exp",
google_api_key=os.getenv("GEMINI_API_KEY"),
temperature=0
)
app.config['geminiLangchain'] = geminiLangchain
# Flask 애플리케이션 실행
if __name__ == '__main__':
app = create_app()
app.run(debug=True)
1. temperature
Ai의 temperature에 대한 답변
temperature: 확률 분포 자체를 조정합니다
temperature를 낮추면 확률 분포가 더 뾰족해져서 확률이 높은 단어와 낮은 단어 간의 차이가 더 커집니다.
반대로 temperature를 높이면 확률 분포가 더 평평해져서 다양한 단어가 선택될 가능성이 높아집니다.
즉 정리해보면 , LLM 모델에 temperature의 값에 따라 응답받는 스타일이 달라진다. 1에 가까울 수록 더 다양하고 창의적인 출력을 하고 0에 가까울 수록 일관적인 출력을 한다.
temperature설정 안한경우 모델마다 기본 디폴트 temperature의 값이 다른데 gemini의 경우 0.9라 해서 예시로 비디오 캡셔닝의 경우엔 일관된 결과가 중요하니 temperature를 0으로 하는게 더 좋을듯하다.
(그러나 적용해보고 여러번 요청후 비교 해봤는데 1에 가까우나 0에 가까우나 결과는 비슷하다. 확실하지 않는데, 캡셔닝은 애초에 분석을 하는 작업이라 그럴수도 있는듯하다)
예시로 밑에 api 일부 코드인데 temperature를 0 으로 하고 보면 모두 같은 내용의 시를 적었다.
geminiLangchain = current_app.config['geminiLangchain']
human_message = HumanMessage(content="겨울에 대한 짧은 시를 30자 이내로 지으세요.")
chat_prompt = ChatPromptTemplate.from_messages([human_message])
output_parser = StrOutputParser()
chain = chat_prompt | geminiLangchain | output_parser
for _ in range(3):
response = chain.invoke({})
print("결과->",response)
==============print 출력문=======================
결과-> 차가운 바람이 불고,
눈이 내리는 겨울밤,
따뜻한 차 한 잔.
결과-> 차가운 바람이 불고,
눈이 내리는 겨울밤,
따뜻한 차 한 잔.
결과-> 차가운 바람이 불고,
눈이 내리는 겨울밤,
따뜻한 차 한 잔.
이번에는 temperature를 1로 하고 해보니 저렇게 다 다른 시를 적어 냈다.
geminiLangchain = ChatGoogleGenerativeAI(
model="gemini-2.0-flash-exp",
google_api_key=os.getenv("GEMINI_API_KEY"),
temperature=1
)
=======================이번에 1로 했을때 프린트 출력문=================
결과-> 차가운 바람에 눈송이 춤추고,
고요한 세상은 하얀 옷을 입네.
결과-> 차가운 바람이 속삭이네,
흰 눈 덮인 세상, 고요한 겨울.
따스한 온기를 찾아서.
결과-> 차가운 바람이 뼛속까지 스며들고
나뭇가지는 앙상해진 채,
고요함이 눈을 덮는다.
2. top_k, top_p
from langchain_google_genai import ChatGoogleGenerativeAI,GoogleGenerativeAIEmbeddings
load_dotenv()
def create_app():
app = Flask(__name__)
geminiLangchain = ChatGoogleGenerativeAI(
model="gemini-2.0-flash-exp",
google_api_key=os.getenv("GEMINI_API_KEY"),
top_k=1,
top_p=0,
)
app.config['geminiLangchain'] = geminiLangchain
# Flask 애플리케이션 실행
if __name__ == '__main__':
app = create_app()
app.run(debug=True)
top_k와 top_p는 LLM(Large Language Model)이 텍스트를 생성할 때 다음에 올 단어(토큰)를 선택하는 방식을 제어하는 매개변수이다.
AI의 top_k, top_p에 대한 답변
top_k
상위 k개: 다음 단어 후보를 확률이 높은 순서대로 k개만 골라, 그 안에서 무작위 선택.
k가 작을수록 선택 폭이 좁아져 일관성 증가, k가 크면 다양성 증가. (k=1이면 가장 높은 확률 단어 고정)
top_p
누적 확률 p: 다음 단어 후보를 누적 확률이 p값 이상이 될 때까지 모아, 그 안에서 무작위 선택.
p가 작을수록 선택 폭이 좁아져 일관성 증가, p가 크면 다양성 증가. (p=0이면 샘플링 끔)
예시:
top_k=10: 가장 확률 높은 상위 10개 단어 중 무작위 선택
top_p=0.9: 누적 확률 90%에 들어오는 단어들 중 무작위 선택
모델마다 다른데 ChatGoogleGenerativeAI의 경우 top_k의 기본 디폴트는 40이고(50으로 해보니 에러), top_p의 디폴트는 공식문서에 안나와있고 범위 설정 0~1 사이 실수이다.
즉,top_k=1,top_p=0 하면 일관적이고 , top_k=40,top_p=0.9 이렇게 하면 창의적이게 다양하게 답변받는다.
top_k=1,top_p=0 설정하고 아까 처럼 "겨울에 대한 짧은 시를 30자 이내로 지으세요." 요청해봤을시 완전히 같은건 아니나 거의 동일하게 나왔고
결과-> 차가운 바람이 불고,
눈이 내리는 겨울밤,
따뜻한 차 한 잔.
결과-> 차가운 바람이 뺨을 스치고,
눈꽃은 조용히 춤을 추네.
고요한 겨울밤.
결과-> 차가운 바람이 불고,
눈이 내리는 겨울밤,
따뜻한 차 한 잔.
top_k=40,top_p=0.9로 설정하고 해봤을시에는 이렇게 다양하게 나온다.
결과-> 차가운 바람이 쌩쌩 불고
눈꽃이 춤을 추네
겨울이 왔네.
결과-> 물든 겨울,
차가운 바람에
눈꽃이 피어나네.
결과-> 차가운 바람이
나뭇가지에 맴돌고,
흰 눈이 세상을 덮네.
그러면 temperature 설정 하는거랑 top_k,top_p 설정하는거랑 차이가 무엇인가??(Ai 답변)
1)top_k,top_p에 대한 더 쉽게 이해 위키 참고
2) 답변을 한번에 다 받는게 아닌 실시간으로 받는 형식으로 하고 싶을땐 설정에 스트리밍 위키 참고
3) 랭체인 아닌 gemini 자체 라이브러리로 json 형식 응답 받고 싶을때 공식문서 참고
'Langchain' 카테고리의 다른 글
Langchain은 무엇일까? (0) | 2025.01.06 |
---|