AI 챗봇은 왜 틀렸을까? LLM의 뇌 속을 들여다보는 ‘LangSmith’ 완전 정복


지난 [실습 편]에서 우리는 Giskard라는 강력한 탐정으로 AI 챗봇의 ‘취약점’을 성공적으로 찾아냈습니다. “우리 챗봇은 특정 질문에 대해 편향적인 답변을 한다”는 명백한 ‘문제(What)’를 발견했죠.

하지만 베테랑 QA라면, 여기서 멈추지 않습니다. 우리는 질문해야 합니다.

“그래서, 왜(Why) 우리 챗봇은 그런 편향적인 답변을 했을까?”

“수많은 부품이 얽혀있는 AI 시스템의 어느 단계에서 문제가 발생한 걸까?”

이 ‘왜’라는 질문에 답을 주는 도구가 바로 오늘 우리가 함께 탐험할 LangSmith입니다. LangSmith는 복잡하게 얽힌 LLM 애플리케이션의 모든 동작을 속속들이 기록하는, 말 그대로 ‘LLM의 CCTV’입니다. 문제의 ‘현상’을 넘어 ‘근본 원인’을 찾아내는 여정, 지금 바로 시작하겠습니다.


1. 지난 시간, 우리는 ‘문제’를 발견했습니다. 이제 ‘원인’을 찾을 차례입니다.

Giskard가 훌륭한 ‘결과 리포트’를 보여준다면, LangSmith는 그 결과가 나오기까지의 ‘과정 전체’를 보여줍니다.

Giskard가 “환자가 열이 나요!”라는 진단서를 줬다면, LangSmith는 혈액 검사, CT 촬영, 문진 기록을 모두 보여주며 “신장의 염증 때문에 열이 나는 겁니다”라고 알려주는 주치의와 같습니다.

특히 요즘 챗봇들은 단순히 LLM 모델 하나만 사용하는 경우는 드뭅니다. 사용자의 질문을 더 잘 이해하기 위해 데이터를 검색하고(Retrieval), 그 결과를 바탕으로 답변을 생성하는 RAG(검색 증강 생성) 구조가 대부분입니다.

이 복잡한 과정 속에서 문제가 발생했을 때, LangSmith 없이 원인을 찾는 것은 사막에서 바늘 찾기와 같습니다. 이제 그 바늘을 10초 만에 찾아내는 마법을 배워보겠습니다.


2. 1단계: LangSmith 프로젝트 생성 및 API 키 설정하기

가장 먼저 우리 챗봇의 모든 활동을 기록할 ‘CCTV 관제실(프로젝트)’을 만들어야 합니다.

  1. LangSmith 공식 홈페이지에 접속하여 회원가입을 합니다. (구글 계정으로 간편하게 가입할 수 있습니다.)
  2. 로그인 후, 좌측 상단의 ‘Projects’ 탭에서 ‘+ New Project’ 버튼을 눌러 새로운 프로젝트를 생성합니다. (예: my-chatbot-qa)
  3. 프로젝트 생성이 완료되면, 좌측 하단의 API Keys 메뉴로 이동하여 새로운 API 키를 만듭니다. 이 키는 우리 챗봇과 LangSmith 관제실을 연결해주는 비밀 통신 암호입니다.
  4. 생성된 API 키를 안전한 곳에 복사해 둡니다.

이제 우리 챗봇 코드에 이 비밀 암호를 알려주어, 모든 활동을 LangSmith로 전송하도록 설정해야 합니다.

Python

import os

# LangSmith와 통신하기 위한 API 키를 환경변수에 설정합니다.
# "YOUR_API_KEY" 부분에 방금 복사한 실제 키를 붙여넣으세요.
os.environ["LANGCHAIN_API_KEY"] = "YOUR_API_KEY" 

# 어떤 프로젝트에 기록할지 프로젝트 이름을 설정합니다.
os.environ["LANGCHAIN_PROJECT"] = "my-chatbot-qa" 

# 추적 기능을 활성화합니다.
os.environ["LANGCHAIN_TRACING_V2"] = "true" 

print("✅ LangSmith 연동 준비 완료!")

보안 TIP!

실제 프로젝트에서는 코드에 API 키를 직접 노출하는 대신, .env 파일이나 시스템 환경변수를 사용하여 안전하게 관리하는 것이 좋습니다.


3. 2단계: 우리 챗봇 코드에 ‘추적 장치’ 심기

이제 LangSmith가 분석할 수 있도록, LangChain 라이브러리를 사용해 간단한 RAG 챗봇을 만들어보겠습니다. 코드가 조금 길어 보이지만, 각 부분이 어떤 역할을 하는지만 이해하면 충분합니다.

아래 코드는 “LangChain이라는 회사는 어떤 곳이야?” 라는 질문에 답하기 위해, 미리 준비된 정보를 바탕으로 답변을 생성하는 간단한 RAG 챗봇 예제입니다.

Python

# 필요한 라이브러리 설치
# pip install langchain langchain_openai langchain_community faiss-cpu

from langchain_community.vectorstores import FAISS
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import OpenAIEmbeddings, ChatOpenAI

# 1. RAG를 위한 정보(Context) 준비
# 챗봇이 답변을 생성할 때 참고할 문서입니다.
context_texts = ["LangChain은 LLM 기반 애플리케이션을 개발하는 회사입니다.",
                 "LangChain은 개발자들이 더 쉽게 AI 서비스를 만들도록 돕습니다."]

vectorstore = FAISS.from_texts(context_texts, embedding=OpenAIEmbeddings())
retriever = vectorstore.as_retriever()

# 2. 챗봇의 행동을 정의하는 프롬프트 템플릿
template = """당신은 친절한 Q&A 챗봇입니다. 
주어진 문맥(Context)을 바탕으로 사용자의 질문에 답변해주세요.

Context: {context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)

# 3. LLM 모델 정의 (OpenAI의 gpt-4o 사용)
model = ChatOpenAI(model="gpt-4o")

# 4. RAG 체인(Chain) 구성
# 사용자의 질문 -> 문서 검색(retriever) -> 프롬프트 조합 -> LLM 답변 생성
rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | model
)

# 5. 챗봇에게 질문하고 답변 받기
question = "LangChain은 어떤 회사야?"
response = rag_chain.invoke(question)

print(f"질문: {question}")
print(f"답변: {response.content}")

핵심 포인트!

위 코드를 실행하기 전에 OpenAI API 키도 설정해야 합니다. (os.environ[“OPENAI_API_KEY”] = “YOUR_OPENAI_KEY”)

놀랍게도, 우리는 LangSmith 연동을 위해 단 한 줄의 추가 코드도 작성하지 않았습니다. 맨 처음 API 키를 설정한 것만으로, LangChain은 이 rag_chain의 모든 실행 과정을 자동으로 LangSmith에 기록합니다.


4. 3단계: LangSmith 대시보드에서 ‘실행의 흐름’ 추적하고 분석하기

코드를 실행한 뒤, 아까 만들어 둔 LangSmith 프로젝트 페이지로 돌아가 보세요. 방금 실행한 기록이 ‘Trace(추적)’ 형태로 예쁘게 기록된 것을 볼 수 있습니다.

Trace를 클릭하면, 마침내 우리는 LLM의 뇌 속, 즉 실행의 흐름을 들여다볼 수 있게 됩니다.

[성공 케이스 분석]

(LangSmith 트레이스 화면 예시)

  1. 전체 흐름(Chain): 가장 바깥쪽에는 rag_chain 전체의 실행 시간과 입/출력이 기록됩니다.
  2. 문서 검색(Retriever): 체인 내부를 보면, 첫 단계로 FAISS가 실행된 것을 볼 수 있습니다. 이 단계를 클릭하면, “LangChain은 어떤 회사야?” 라는 질문에 대해 우리가 미리 준비해둔 context_texts 두 문장을 정확히 찾아온 것을 확인할 수 있습니다.
  3. LLM 호출(ChatOpenAI): 다음 단계에서는 Retriever가 찾아온 문맥과 사용자의 질문이 프롬프트 템플릿과 합쳐져, 최종적으로 LLM에 전달된 것을 볼 수 있습니다. 그리고 LLM이 생성한 최종 답변(“LangChain은 LLM 기반 애플리케이션을…”)까지 명확하게 기록됩니다.

[실패 케이스 분석: “Aha!” Moment]

만약 Giskard 테스트에서 “챗봇이 엉뚱한 답변을 한다”는 문제가 발견되었다고 가정해 봅시다. LangSmith Trace를 보면 그 원인을 즉시 알 수 있습니다.

예를 들어, Retriever 단계를 클릭했는데, 엉뚱한 문서를 가져왔거나 아무 문서도 가져오지 못한 것이 확인되었다면? 우리는 “아하! LLM 모델 자체가 아니라, 질문과 관련된 문서를 찾아오는 검색 기능에 문제가 있었구나!” 라고 정확한 원인을 특정할 수 있습니다.

이것이 바로 현상 너머의 원인을 밝혀내는 LangSmith의 진정한 힘입니다.


5. 보너스: ‘실패 사례’를 ‘황금 데이터셋’으로 만들기

LangSmith의 또 다른 강력한 기능은 QA의 업무를 한 단계 격상시켜 줍니다.

Trace 화면에서 문제가 된 케이스를 발견했다면, 우측 상단의 ‘Add to Dataset’ 버튼을 눌러보세요. 이 실패 사례를 ‘회귀 테스트용 데이터셋’ 이나 ‘모델 미세조정(Fine-tuning)용 데이터셋’으로 클릭 몇 번 만에 저장할 수 있습니다.

즉, QA가 발견한 하나의 버그가 단순히 수정되고 사라지는 것이 아니라, 미래에 더 똑똑한 AI를 만드는 소중한 ‘자산’으로 축적되는 것입니다.

결론: ‘왜’를 아는 QA가 진짜 전문가다

이제 우리는 문제 발견(Giskard)부터 원인 분석(LangSmith)까지, AI 챗봇의 내면을 속속들이 들여다보는 강력한 무기를 모두 갖게 되었습니다. 더 이상 “이거 왜 이러죠?” 라고 개발자에게 막연하게 묻는 대신, “LangSmith Trace를 보니 Retriever 단계에서 Context를 잘못 가져오고 있습니다. 이 부분의 로직 확인이 필요해 보입니다” 라고 명확하게 소통할 수 있게 된 것입니다.

‘왜’를 아는 QA는 단순한 테스터가 아닌, 제품의 품질을 함께 책임지는 핵심 파트너입니다.

하지만 실제 서비스 운영에서 이 모든 것을 안정적으로 제공하려면 가장 기본적이면서도 중요한 관문이 남아있습니다. 바로 안정적인 API 호출과 성능 관리입니다.

다음 [심화 편]에서는 우리에게 가장 친숙한 도구, Postman을 활용하여 AI 서비스 API를 A부터 Z까지 완벽하게 테스트하고 관리하는 모든 것을 파헤쳐 보겠습니다.

댓글 남기기