AI/LLM

[LLM] LangChain 의 유용한 기능들

죵욜이 2025. 2. 28. 22:50

Streaming

LangChain의 Streaming 기능은 대형 언어 모델(LLM)이 생성하는 응답을 한 번에 모두 출력하는 것이 아니라, 부분적으로 실시간 출력하는 기능을 의미합니다.
즉, 사용자가 기다리지 않고, 모델이 생성하는 즉시 응답을 스트리밍(흐름) 방식으로 받아볼 수 있도록 합니다

from langchain_openai import ChatOpenAI

chat = ChatOpenAI(model_name="gpt-4o-mini")

#chat.invoke("고양이에 대한 시를 써줘.") # 평소에 완성된 대답을 받던 함수 (invoke)

for chunk in chat.stream("고양이에 대한 시를 써줘.") :
  print(chunk.content, end="", flush=True)

 

더보기
import json
from channels.generic.websocket import AsyncWebsocketConsumer
from langchain_openai import ChatOpenAI

class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        """ WebSocket 연결 수락 """
        await self.accept()

    async def disconnect(self, close_code):
        """ WebSocket 연결 종료 """
        pass

    async def receive(self, text_data):
        """ 클라이언트 메시지를 받아 LangChain 스트리밍 응답을 WebSocket으로 전송 """
        data = json.loads(text_data)
        user_message = data["message"]

        chat = ChatOpenAI(model_name="gpt-4o-mini")

        async for chunk in chat.astream(user_message):  # LangChain의 스트리밍 방식 사용
            if chunk.content:
                await self.send(text_data=json.dumps({"message": chunk.content}))

        await self.send(text_data=json.dumps({"message": "[END]"}))  # 스트리밍 종료 표시
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>LangChain AI Chat</title>
</head>
<body>
    <h2>LangChain 기반 AI 채팅</h2>
    <div id="chat-box"></div>
    <input type="text" id="message-input" placeholder="메시지를 입력하세요..." />
    <button onclick="sendMessage()">보내기</button>

    <script>
        const chatBox = document.getElementById("chat-box");
        const messageInput = document.getElementById("message-input");

        const socket = new WebSocket("ws://localhost:8000/ws/chat/");

        socket.onmessage = function(event) {
            const data = JSON.parse(event.data);
            const message = data.message;
            chatBox.innerHTML += "<p>" + message + "</p>";
        };

        function sendMessage() {
            const message = messageInput.value;
            socket.send(JSON.stringify({ "message": message }));
            messageInput.value = "";
        }
    </script>
</body>
</html>

Caching

실제 LLM 챗봇을 운영할때, 가장 중요한 것은 답변 속도입니다.

그런데 답변 속도는 모델의 크기나, 하드웨어의 성능 등 다소 고정된 환경에 의해 좌우됩니다.

따라서 주어진 환경에서 LLM의 답변 속도를 빠르게 만들기란 쉽지 않습니다.

하지만!! 실행하기 쉬우면서도 효과가 명확한 방법이 있는데 이는 응답을 캐싱해두기 입니다.

from langchain.globals import set_llm_cache
from langchain.cache import InMemoryCache

chat = ChatOpenAI(model_name="gpt-4o-mini")
set_llm_cache(InMemoryCache()) # 캐시 메모리 설정
chat.invoke("일반 상대성 이론을 한마디로 설명해줘.") #첫번째로 물어봄 -> 응답시간이 길게 걸림
chat.invoke("일반 상대성 이론을 한마디로 설명해줘.") #동일한 질문을 두번째로 물어봄 -> 응답시간이 훨씬 짧아짐

Multi-turn 대화

 

ChatGPT를 사용하면 이전 대화를 계속 기억해 나가면서 대화를 이어나가는 것을 알 수 있습니다. 이렇게 전체 대화의 맥락을 읽고 대화를 주고 받는 것을 멀티턴 (Multi-turn) 이라고 합니다.

이와 다르게 바로 직전의 질문에만 답하는 것은 싱글턴 (single-turn) 이라고 합니다.

from langchain_core.prompts import ChatPromptTemplate

chat_template = ChatPromptTemplate.from_messages([
    ("system", "너의 이름은 햄식이이고, 아주 귀여운 햄스터야. 모든 말을 햄으로 끝내."),
    ("human", "햄식아 나 어제 수능쳤어 대박이지"), # 사람의 질문 (history)
    ("ai","진짜햄? 고생 많았햄!! "), # ai의 대답 (history)
    ("human", "{user_input}"), # 사람의 질문 (history)
    ]
)
# 이 messages에는 multi-turn 대화 기록(history)이 저장되어있다.
messages = chat_template.format_messages(user_input="햄식아 내가 어제 뭐했게!")


model = ChatOpenAI(model_name="gpt-4o-mini")
model.invoke(messages)

 

 

 

 

 

 

 

 

 

 

 

 

'AI > LLM' 카테고리의 다른 글

[LangGraph] LangGraph 란 무엇인가?  (0) 2025.03.19
[LLM] RAG  (0) 2025.02.27
[LLM] LangChain (prompttemplate 과 LCEL)  (0) 2025.02.19