분류 전체보기 575

Python 다중 할당(Multiple Assignment)을 이용한 변수 스왑

Python 중고뉴비로서 배우는게 참 많다.배열의 두 요소를 서로 맞바꾼다고하면 전통적으로(?) 이렇게 작성한다.tmp = heap[curr]heap[curr] = heap[child]heap[child] = tmp하지만 Python에서는 다중 할당(multiple assignment)과 튜플 언패킹(tuple unpacking)을 이용해 단 한 줄로 스왑(swap)을 해결할 수 있다.heap[curr], heap[child] = heap[child], heap[curr] 어떻게 동작할까?등호 우측의 heap[child], heap[curr]는 튜플(heap[child], heap[curr])로 묶이게 된다.등호 왼쪽의 heap[curr], heap[child]에는 튜플의 값이 순서대로 할당된다.

코루틴과 비동기 프로그래밍의 관계

재미없는 대학 숙제같은 제목이지만, 최근에 책을 하나 읽으면서 Kotlin의 코루틴(Coroutine)을 사용하면서 풀리지 않던 찝찝함을 풀어서 코루틴과 비동기 프로그래밍의 관계에 대해 포스팅 해보려한다. 이 글은 코루틴, 루틴, 서브루틴, 비동기 프로그래밍, 스레드같은 관련 단어가 각각 따로 뭔지는 알겠는데 이것들의 관계에 대해 명확히 설명하지 못하는 사람이라면 도움이 될 것이다.어떤 개념에 대해 이해하기 위해서는 그 개념이 왜 등장했는지, 이것이 해결하고자하는 문제점은 무엇인지에 대해 생각해보는게 좋은 접근이라는 것을 꽤 오래 잊고있었다. 그냥 "코루틴"이라고 구글에 검색해서 아티클을 몇가지 보면서 이해했다고 넘겼다. 하지만 정작 "코루틴"이 무엇인가? 그리고 비동기 프로그래밍과는 어떤 관계가 있는가..

템플 스테이를 다녀와서

난생처음 템플 스테이를 다녀왔다. 요즘따라 괴로운 마음이 들어서 스마트폰을 보면서 생각하는걸 멈추고 수많은 정보를 뇌에 욱여넣는 행동을 한다는걸 깨달아서였다. 내가 괴로운 것은 심각한건 아니고, 보통 사람들이 느끼는 일상적인 괴로움 정도기는 하다. 불안과 질투, 후회 같은 감정들인데 이러한 생각들이 아무런 도움도, 피해도 되지 않는다는 걸 알기에 멈추고 싶었다. 괴로움에 대한 원인과 출처에 대한 정의는 끝났지만 해결방법을 찾지 못했고, 템플 스테이가 해답이 되지않을까? 생각했다. 안전한 곳에서 스마트폰을 끄고 하루를 생활하는 것도 궁금했고! 템플 스테이에 온 사람들은 그다지 다양하지 않았다. (ㅋㅋㅋㅋ)9명중에 8명은 내 또래로 보이는 여자고, 1명은 여자친구가 오자고해서 따라 온 것으로보이는 남자였..

Agent를 고도화하면서 겪은 문제점들

Tool이 늘어날 수록 멍청해지고, Input Token도 빠르게 소모했음다소 무의미해보이는 도구 호출 증가Tool 설명을 위한 Input Token의 증가Tool을 줄이기 위한 노력CAG 활용 → 관련되지 않은 질문에도 들어갔기 때문에 Input Token이 심하게 소모되어 비슷하고 항상 같이 사용되는 Tool을 하나로 합치는 방향으로 다시 작업계속 같은 패턴으로 사용하는 도구를 하나로 합침 → 회사 정보조회 도구Slack 채널을 조회하는 도구Slack UserGroup을 조회하는 도구Slack UserGroup 소속 멤버를 조회하는 도구Tool 설명을 간결하고 명확한 방향으로 수정거대해진 프롬프트, 이를 무시하는 LLMClaude는 주어진 문제에 적절한 도구를 잘 사용하지만, 친근하게 대하라는 Sys..

LangGraph Agent에 장기기억(LTM)추가하기

LangGraph로 만든 Agent에 장기 기억을 추가하기 위해서는 기존 그래프에 새로운 노드와 도구를 추가해야한다.노드대화 전 저장된 기억을 불러오는 노드 (load_memories)도구관련 기억을 검색해서 가져오는 도구 (SearchRecallMemoriesTool)기억하는 도구 (SaveMemoriesTool)load_memories 노드가 하는 일?load_memories 노드부터 살펴보겠다. load_memories는 Agent가 작업을 처리하기 시작할때 이전 대화 내용을 기반으로 관련된 기억을 불러오는 노드다. 불러온 기억은 State에 [”recall_memories”]로 저장되고, 이는 나중에 기억과 관련된 SystemPrompt에 Context로서 제공된다.load_memories를 어떻..

Pydantic Serialize시 오류 : Object of type <Enum> is not JSON serializable 해결방법

공식문서 참조: https://docs.pydantic.dev/latest/api/config/#pydantic.config.ConfigDict.use_enum_valuesEnum을 Enum 값으로 사용할지 여부를 정의할 수 있는 use_enum_values라는 Model Configuration을 True로 설정할 경우에 Serialize 가능해진다.class SomeEnum(Enum): FOO = 'foo' BAR = 'bar' BAZ = 'baz'class SomeModelCls(BaseModel): e: SomeEnumm = SomeModelCls(e=SomeEnum.FOO)m.model_dump() # TypeError: Object of type SomeEnum is no..

반쪽짜리 Contextual Retrieval로 RAG 강화 해보기

2024년 9월 20일, Anthropic은 Contextual Retrieval이라는 개념을 제시했다. Contextual Retrieval은 기존의 RAG의 검색 성공률을 향상시키기 위한 방법으로, Contextual Embeddings와 Contextual BM25의 두가지 하위 기술을 사용한다. Anthropic에 따르면 이 방법을 이용할 경우 실패한 검색 수를 49%까지 줄일 수 있으며, ReRanking과 함께 사용하면 67%까지 줄일 수 있다고한다. 최근에는 RAG에 이어 CAG(Cache-Augmented Generation)도 등장했다. CAG는 더 길어진 LLM의 Context Window를 충분히 활용하여, 검색 증강하려는 문서의 전체 내용이 Context Window에 들어갈 수 있..

[내방] 아지트 - 한식백반

내방역에서 조금만 올라가면 나오는 보드게임 카페같은 간판을 가진 곳인데, 겉보기에는 평범해보이지만 비범한 요리가 나온다! 고등어 구이, 차돌 청국장, 보쌈, 닭도리탕 같은 메뉴들을 팔고있고, 저녁에는 더 다양하다. 맛있는 간장게장을 먹어본적이 없었는데 여기서 처음 먹어봤다. 시키는 것마다 왠만한 집보다 맛있어서 메뉴를 하나씩 시켜보는 재미가있었다. 그냥 주방장 선생님 능력치가 다른듯...미안하지만 엄마밥이 그리워지지않는 맛이었다. 엄마도 인정할것이다. 내방역 주변에 맛집이랄게 그닥 없는데 여긴 맛있다.