개요
FIM One은 교체 가능한 각 구성 요소마다 하나씩 얇은 추상 기본 클래스 집합을 중심으로 구축되었습니다. 모든 구성 요소는 단일 책임과 최소한의 인터페이스를 가집니다. 추상 메서드를 구현하고, 인스턴스를 적절한 레지스트리 또는 인젝터에 연결하면, 나머지 시스템이 자동으로 구현을 사용합니다.| 확장 지점 | 기본 클래스 | 파일 | 등록 |
|---|---|---|---|
| LLM 제공자 | BaseLLM | core/model/base.py | ModelRegistry.register() |
| 도구 | BaseTool | core/tool/base.py | builtin/에 파일 드롭 |
| 메모리 | BaseMemory | core/memory/base.py | 생성자 주입 |
| 임베딩 | BaseEmbedding | core/embedding/base.py | 생성자 주입 |
| 이미지 생성 | BaseImageGen | core/image_gen/base.py | 생성자 주입 |
| 리랭커 | BaseReranker | core/reranker/base.py | 생성자 주입 |
| 웹 페치 백엔드 | BaseWebFetch | core/web/fetch/base.py | 생성자 주입 |
| 웹 검색 백엔드 | BaseWebSearch | core/web/search/base.py | 생성자 주입 |
| RAG 리트리버 | BaseRetriever | rag/base.py | 생성자 주입 |
| 문서 로더 | BaseLoader | rag/loaders/base.py | 로더 레지스트리 / 주입 |
| 텍스트 청킹 | BaseChunker | rag/chunking/base.py | 생성자 주입 |
커스텀 LLM 제공자
BaseLLM에는 두 개의 필수 메서드 — chat과 stream_chat — 그리고 시스템의 나머지 부분에 모델이 할 수 있는 작업을 알려주는 선택적 abilities 속성이 있습니다.
ModelRegistry를 통한 등록
ModelRegistry는 이름을 BaseLLM 인스턴스에 매핑하고 역할별로 해결합니다. 시스템은 네 가지 기본 제공 역할을 사용합니다: general, fast, compact, 및 vision. 자신만의 역할을 추가할 수 있습니다.
나중에 검색
abilities 딕셔너리는 LLM과 ReAct 엔진 간의 계약입니다. tool_call=True이고 에이전트가 use_native_tools=True로 생성된 경우, 엔진은 기본 함수 호출을 사용합니다. 그렇지 않으면 자동으로 JSON 모드로 폴백됩니다.
사용자 정의 도구
도구는 가장 일반적인 확장입니다.BaseTool에는 세 가지 필수 요소가 있습니다: name, description, 그리고 run. 나머지는 모두 합리적인 기본값을 가지고 있습니다.
자동 발견
src/fim_one/core/tool/builtin/ 디렉토리에 파일을 드롭하세요. discover_builtin_tools() 스캐너는 구체적인(추상이 아닌) BaseTool 서브클래스를 자동으로 찾습니다 — 수동 등록이 필요 없습니다.
_SKIP_AUTO_DISCOVER에 나열된 클래스를 건너뜁니다. 외부 구성(예: API 키)이 필요하고 시작 시 조건부로 인스턴스화해야 하는 도구에 해당 집합을 사용하세요.
사용 불가능 상태 신호
종속성이 누락되었을 때 도구 카탈로그에 메시지를 표시하려면availability()를 재정의하세요:
아티팩트를 포함한 풍부한 결과
도구가 파일을 생성할 때 일반str 대신 ToolResult를 반환하세요:
커스텀 메모리
BaseMemory는 대화 기록의 지속성 계층입니다. 세 가지 메서드: add_message, get_messages, clear.
ReActAgent(llm=llm, memory=RedisMemory(conv_id, url)).
사용자 정의 임베딩
BaseEmbedding은 두 가지 메서드를 제공합니다: embed_texts (배치) 및 embed_query (단일), 그리고 dimension 속성입니다.
embed_texts와 embed_query의 구분이 존재하는 이유는 많은 임베딩 모델(예: E5, BGE)이 검색 품질을 개선하기 위해 문서와 쿼리에 다른 접두사를 사용하기 때문입니다.
사용자 정의 이미지 생성
BaseImageGen은 단일 메서드 generate를 가집니다. 이미지를 output_dir에 저장하고 파일 경로와 서버 상대 URL이 포함된 ImageResult를 반환합니다.
커스텀 리랭커
BaseReranker는 쿼리와 문서 문자열 목록을 받아 재정렬된 결과를 점수와 함께 반환합니다.
사용자 정의 웹 백엔드
웹 페치
BaseWebFetch는 URL을 페치하고 그 내용을 Markdown 또는 일반 텍스트로 반환합니다.
웹 검색
BaseWebSearch는 순위가 매겨진 SearchResult 객체 목록을 반환합니다.
커스텀 RAG 컴포넌트
RAG 파이프라인에는 세 가지 독립적으로 교체 가능한 단계가 있습니다: 로딩, 청킹, 검색.문서 로더
BaseLoader는 파일 경로를 LoadedDocument 객체 목록으로 변환합니다. PDF 로더는 일반적으로 페이지당 하나의 문서를 반환합니다.
텍스트 청킹
BaseChunker는 텍스트를 Chunk 객체로 분할합니다. MAX_CHUNK_SIZE = 6000 문자는 하드 제한입니다 — 이를 초과하는 청크 크기는 Jina Embeddings v3 토큰 윈도우를 오버플로우할 수 있습니다.
검색기
BaseRetriever는 모든 백엔드를 쿼리하고 순위가 매겨진 Document 객체를 반환합니다.
설계 원칙
모든 기본 클래스에서 일관된 몇 가지 패턴이 있어 사용자 정의 구현을 더 쉽게 작성할 수 있습니다: 비동기 우선. 모든 메서드는async def입니다. 구현이 동기식이더라도 asyncio.to_thread()로 래핑하여 이벤트 루프를 차단하지 않도록 하세요.
도구의 문자열 출력. BaseTool.run()은 str (또는 ToolResult)을 반환합니다. LLM은 텍스트만 봅니다 — 도구 구현은 복잡한 데이터를 읽을 수 있는 형식으로 직렬화할 책임이 있습니다.
최소 인터페이스. 각 기본 클래스는 필요한 가장 작은 계약을 정의합니다. BaseMemory는 세 가지 메서드이고, BaseWebFetch는 하나입니다. 필요하지 않은 기능을 구현할 필요가 없습니다.
상속보다 구성. 기본 클래스는 인터페이스이지 프레임워크가 아닙니다. 구성 시간에 구현을 주입하고, 런타임은 이를 더 이상 몽키 패칭하거나 서브클래싱하지 않습니다.