[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. 처리 단계
- 함수 호출로 각 필드 입력
- 입력값을 조합하여 검색 쿼리 생성
- 벡터DB(Chroma)로 검색 수행
- 검색 결과를 기반으로 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 스키마 관리 필요 |
함수 시그니처 관리 |
입력 자유도 높지만 오류 가능성 존재 |
명시적 타입, 필수 입력 강제 가능 |