본문 바로가기
C.W.K.
Stream
Lesson 03 of 07 · published

JSONL을 기준 기록으로 두고 파생 저장소는 다시 만들어

~16 min · jsonl, persistence, rebuild

Level 0Observer
0 XP0/64 lessons0/13 achievements
0/150 XP to next level150 XP to go0% complete

기준 원본이 하나여야 복구 방향이 선명해

cwkPippa는 프롬프트와 델타, 도구 호출·결과, 최종 사용량을 conversation_id별 암호화 JSONL에 덧붙여. SQLite와 ChromaDB는 빠른 조회를 위한 파생 거울이며 JSONL에서 다시 만들 수 있어. 불일치가 생기면 여러 저장소를 손으로 맞추지 않고 파생물을 지운 뒤 원본을 재생해.

화면에 보이기 전에 디스크에 써

각 델타는 사용자 화면이나 API로 내보내기 전에 JSONL에 저장해야 해. 스트림이 중간에 죽어도 사용자가 본 모든 토큰이 기록에 남는 순서야. 줄 단위 쓰기와 명시적 flush를 함께 써 갑작스러운 SIGTERM에도 마지막 완성 줄을 잃지 않게 해.

읽을 때 불완전한 턴을 치유해

cwkPippa는 대화를 가져올 때 _heal_incomplete_turns를 실행해 델타에서 중단된 턴을 복원하고 시간 순서를 정리해. 기준 기록은 내구성이 있지만 파생 상태는 흔들릴 수 있으므로, 읽기 경로가 안전한 투영을 만들어 프런트엔드에 넘겨.

원칙: 기준 원본은 하나이고 내구성 있게 덧붙여야 해. 색인과 캐시는 수정할 원본이 아니라 다시 만들 파생물이야.

Code

Write before show·python
import json, pathlib

async def stream_with_persistence(conv_id: str, stream):
    p = pathlib.Path(f"/srv/sessions/{conv_id}.jsonl").open("a", buffering=1)
    try:
        async for event in stream:
            # Persist FIRST.
            p.write(json.dumps({"event": event.dict()}) + "\n")
            p.flush()
            # 그다음 user에 렌더.
            yield event
    finally:
        p.close()
Inconsistency에 JSONL에서 SQLite rebuild·python
import json

def rebuild_session(conn, conv_id: str, jsonl_path: str):
    # 이 세션의 derived 상태 퍼지.
    conn.execute("DELETE FROM messages WHERE conversation_id = ?", (conv_id,))
    # JSONL에서 replay.
    for line in open(jsonl_path):
        ev = json.loads(line)
        if ev["event"]["type"] == "message_complete":
            conn.execute(
                "INSERT INTO messages (conversation_id, role, content, created_at) VALUES (?, ?, ?, ?)",
                (conv_id, ev["event"]["role"], ev["event"]["text"], ev["event"]["created_at"]),
            )
    conn.commit()

External links

Exercise

채팅 기능 하나의 모든 사건을 화면 표시 전에 JSONL로 보내고, 세션 DB 행을 JSONL에서 다시 만드는 도구를 추가해. 알려진 세션에서 현재 DB와 같은지 확인해.
Hint
다르면 복구기를 맞추기 전에 기록 누락이나 작성기 오류부터 고쳐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.