DonTizi/Swiftrag
요약
이 프로젝트는 Swift로 구현된 RAG(Retrieval Augmented Generation) 시스템입니다. Ollama와 같은 로컬 LLM과 연동하여 iOS/macOS 앱에서 문서 검색 및 자연어 생성을 결합합니다. Apple의 NLP 프레임워크를 활용해 임베딩을 생성하고, 코사인 유사도를 이용해 관련 문서를 찾아 컨텍스트 기반 응답을 만듭니다.
핵심 포인트
- Swift로 구현된 RAG 시스템으로 로컬 LLM(Ollama)과 연동됩니다.
- Apple NLP 프레임워크를 사용한 문서 임베딩 및 검색 기능을 제공합니다.
- 코사인 유사도를 이용해 관련 문서를 찾아 컨텍스트 기반 응답을 생성합니다.
이 프로젝트는 Swift로 구현된 Retrieval Augmented Generation (RAG) 시스템으로, Ollama와 같은 로컬 Large Language Models (LLMs)과 함께 작동하도록 설계되었습니다. 문서 검색(document retrieval)과 자연어 생성(natural language generation)을 결합하여 iOS 및 macOS 애플리케이션에서 컨텍스트를 인식하는 AI 응답을 가능하게 합니다.
-
Xcode 12.0 이상
-
iOS 14.0+ / macOS 11.0+
-
로컬 기기에 Ollama 설치 필수
-
이 저장소를 클론합니다.
-
로컬 기기에서 Ollama가 실행 중인지 확인합니다.
-
Swift 파일을 Xcode 프로젝트에 추가합니다.
Document
: 지식 기반의 단일 문서를 나타냅니다.
RAGSystem
: 문서 저장, 검색 및 응답 생성을 처리하는 핵심 클래스입니다.
class RAGSystem {
func addDocument(_ document: Document)
func searchRelevantDocuments(for query: String, limit: Int = 3) -> [Document]
...
문서 임베딩 (Document Embedding): 문서가 추가될 때, Apple의 NLP 프레임워크를 사용하여 수치적 표현(embedding)으로 변환됩니다.
func addDocument(_ document: Document) {
let words = document.content.components(separatedBy: .whitespacesAndNewlines)
let embeddings = words.compactMap { embeddingModel.vector(for: $0) }
...
관련 문서 검색 (Relevant Document Retrieval): 쿼리가 수신되면, 시스템은 코사인 유사도(cosine similarity)를 사용하여 가장 관련성 높은 문서를 찾습니다.
func searchRelevantDocuments(for query: String, limit: Int = 3) -> [Document] {
let queryEmbedding = getEmbedding(for: query)
let sortedDocuments = documents.sorted { doc1, doc2 in
...
응답 생성 (Response Generation): 시스템은 검색된 문서를 컨텍스트로 사용하여 Ollama에 프롬프트를 보내 응답을 생성합니다.
func generateResponse(for query: String) -> String {
let relevantDocs = searchRelevantDocuments(for: query)
let context = relevantDocs.map { $0.content }.joined(separator:
private func callOllama(with prompt: String) -> String {
let ollamaURL = URL(string: "http://localhost:11434/api/generate")!
var request = URLRequest(url: ollamaURL)
...
RAG 시스템 사용 기본 예시:
let ragSystem = RAGSystem()
// 지식 기반에 문서 추가하기
ragSystem.addDocument(Document(id: "1", content: "Swift는 Apple이 개발한 프로그래밍 언어입니다."))
...
**임베딩 모델 (Embedding Model)**: 이 시스템은 Apple의 `NLEmbedding`을 사용합니다. 더 나은 결과를 얻기 위해 다른 임베딩 기법으로 실험해 볼 수 있습니다.**유사도 측정 지표 (Similarity Metric)**: 현재 코사인 유사도(cosine similarity)를 사용하고 있습니다. 유클리드 거리(Euclidean distance)와 같은 다른 지표를 시도해 볼 수 있습니다.**Ollama 모델**: 이 코드는 "llama3.2:3b"를 사용합니다. 이를 Ollama 설치에서 사용할 수 있는 다른 모든 모델로 변경할 수 있습니다.
**Ollama 연결 문제 해결 방법**:
- Ollama가 실행 중인지 확인하세요 (`ollama run llama3.2:3b`)
- 설정에 맞는 URL과 포트(11434)가 올바른지 확인하세요
**느린 응답 시간 (Slow Response Times)**:
- `searchRelevantDocuments`에서 문서 제한을 줄이는 것을 고려해 보세요.
- 사용 가능한 경우 더 작은 Ollama 모델을 사용하세요.
- `searchRelevantDocuments`에서 문서 제한을 줄이는 것을 고려해 보세요.
**메모리 부족 오류 (Out of Memory Errors)**:
- 페이지네이션(pagination)을 구현하거나 메모리에 저장되는 문서 수를 제한하세요.
프로덕션 환경에서는 특히 Ollama를 호출할 때 네트워크 관련 문제 등 오류 처리를 우아하게 처리하는 것을 기억하세요.
이 프로젝트는 Swift의 네이티브 기능과 로컬 LLM을 결합하는 강력함을 보여줍니다. 자유롭게 기여하거나, 문제를 보고하거나, 개선 사항을 제안해 주세요!
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub AI Tools의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기