[AI]4단계_LangChain_기반_멀티스텝_AI_구현_검토_성향기반_장소추천 - 100-hours-a-week/12-marong-Wiki GitHub Wiki

LangChain Retrieval 기반 추론 흐름 설계

1. 개요

  • 함수 인자(argument) 로 직접 요청 데이터를 받아 처리하는 구조
  • LangChain RetrievalQA, ConversationalRetrievalChain 활용
  • JSON이나 자연어 없이, 명시적 파라미터로 검색 쿼리 생성

2. 함수 호출 예시

search_place(
    user_id="user123",
    mbti_vector=[0.5, 0.5, 0.5, 0.5],
    preferred_foods=["치킨", "마라탕"],
    hobbies=["운동", "게임"],
    latitude=37.4011,
    longitude=127.1062,
    max_distance=2000,
    category="식당"
)
  • user_id: 사용자 식별자
  • mbti_vector: MBTI 임베딩 벡터
  • preferred_foods: 선호 음식 리스트
  • hobbies: 취미 리스트
  • latitude, longitude: 위치 정보
  • max_distance: 검색 반경 (미터)
  • category: 장소 카테고리

3. 처리 단계

  1. 함수 호출로 각 필드 입력
  2. 입력값을 조합하여 검색 쿼리 생성
  3. 벡터DB(Chroma)로 검색 수행
  4. 검색 결과를 기반으로 LLM이 최종 응답 생성

4. 실제 구현 예시

from langchain.chains import RetrievalQA
from langchain.vectorstores import Chroma
from langchain.embeddings import SentenceTransformerEmbeddings
from langchain.llms import OpenAI

def search_place(user_id, mbti_vector, preferred_foods, hobbies, latitude, longitude, max_distance, category):
    embedding_model = SentenceTransformerEmbeddings(model_name="snunlp/KR-SBERT-V40K-klueNLI-aug")
    vectordb = Chroma(persist_directory="./chroma_db", embedding_function=embedding_model)
    llm = OpenAI(temperature=0)

    qa_chain = RetrievalQA.from_chain_type(
        llm=llm,
        retriever=vectordb.as_retriever(),
        chain_type="stuff"
    )

    query = f"{category} 추천. 선호 음식: {', '.join(preferred_foods)}. 위치: ({latitude}, {longitude}). 반경 {max_distance}m 이내."

    response = qa_chain.run(query)
    return response

# 예시 호출
result = search_place(
    user_id="user123",
    mbti_vector=[0.5, 0.5, 0.5, 0.5],
    preferred_foods=["치킨", "마라탕"],
    hobbies=["운동", "게임"],
    latitude=37.4011,
    longitude=127.1062,
    max_distance=2000,
    category="식당"
)

print(result)

5. 기대 효과

  • 복잡한 JSON 파싱 없이 함수 인자로 명확하게 데이터 입력
  • API 통신이 필요 없는 내부 호출 최적화 가능
  • 요청 포맷이 명확하여 디버깅 및 유지보수 용이

6. 확장 전략

  • 추가 파라미터 (예: 별점, 혼잡도, 가격대) 쉽게 추가 가능
  • 인자 유효성 검사(validation) 및 기본값 설정 가능
  • 다양한 입력 조합에 따른 검색 전략 최적화 가능

7. 핵심 변화 요약

기존 (자연어/JSON 입력) 변경 (함수 파라미터 입력)
자연어 파싱 필요 명확한 인자 입력
JSON 스키마 관리 필요 함수 시그니처 관리
입력 자유도 높지만 오류 가능성 존재 명시적 타입, 필수 입력 강제 가능