캐싱 전 구동 → 인메모리/Redis
InMemoryCache로 같은 질문 반복 시 0s → 첫 실행은 오래걸림RedisCache로 LLM 응답 캐싱도 동작!프롬프트 템플릿 → ChatPromptTemplate
PromptTemplate로 변수만 바꿔 프롬프트 재사용ChatPromptTemplate로 system/human/ai 구조화Output Parser
JsonOutputParser + 지시문을 프롬프트에 → 파싱 실패 없이 JSON 획득LCEL 파이프라인
prompt | llm으로 실행임베딩 비교 실험
Pinecone
위키 100개 샘플: datasets로 위키 로드 → RecursiveCharacterTextSplitter(400/20)로 쪼개기 → text-embedding-3-small(1536차원)으로 임베딩 → Pinecone 업서트(배치 20 + sleep) → query()로 바로 검색까지
리트리벌 비교:
wiki_index.query(..., include_metadata=True)PineconeVectorStore(..., text_key='full_text').similarity_search()세금 문서 RAG: Docx2txtLoader → split(1500/200) → Chroma.persist로 로컬 저장 → ChatOpenAI로 컨텍스트 기반 답변 생성
질의 정규화(정규식/치환) → 바로 성과
사전 기반 용어 표준화가 유효
LCEL 체이닝 구조가 읽기 쉬움
dictionary_chain → qa_chain 흐름이 명확하고 나중에 모듈별로 성능 비교하기 좋아 보였다.LangSmith 평가 프레임 설계
소믈리에 페르소나
InMemoryCache → 속도 빠름, 종료 시 데이터 사라짐. RedisCache → 여러 서버 공유, 껐다 켜도 데이터 유지.PromptTemplate → 서울에서 유명한 프렌치 레스토랑을 알려줘 같은 문장을 변수만 바꿔 자동 생성.ChatPromptTemplate → system / human / ai 역할을 나눠서 대화 프롬프트를 안정적으로 만들 수 있음.JsonOutputParser + Pydantic 스키마로 내가 원하는 필드(sender_name, title, content)만 딱딱 뽑을 수 있었음.parser.get_format_instructions()를 프롬프트에 넣으니 LLM이 정해진 JSON 구조로 잘 출력해줌.prompt | llm 처럼 파이프라인으로 연결SequentialChain처럼 사용할 수 있지만 LCEL이 더 직관적이고 가볍다.RecursiveCharacterTextSplitter(chunk_size=400, overlap=20)로 위키 텍스트를 쪼개고 35KB 초과는 스킵.docx2txt → split → Chroma.persist)로 질문 → 관련 문단 → 근거 기반 답변retrieve_docs() → invoke_llm()에서 문맥을 system에 고정해 주면 헛소리가 줄어든다. 다만 발췌 범위/길이 관리가 중요(너무 길면 분산)프롬프트 표준화가 왜 중요한지 감은 오지만 막상 적용은..
{city}, {topic}처럼 바꾸면 되지만 실제 데이터에서는 훨씬 복잡할 것 같다.시간 관계상 생각보다 굉장히 빨라서 따로 리뷰하는 시간을 꼭 가져야한다…
full_text를 통째로 넣음: 임베딩은 chunk로 했는데 메타데이터 텍스트 키를 full_text로 두니 각 청크가 전부 원문 전체를 달고 다니는 구조가 됨.hit/miss, sim_score, latency, tokens, cost 저장해서 캐시 성능을 숫자로 확인!출처: [문서명] 섹션/문단ID 템플릿 고정.title | url | chunk_id | score를 함께 보여주기.country, variety, price, points, winery, title, region_1filter={"price":{"$lte":30000}}similarity_search(query, k, filter={...}) 패턴 확보.