본문 바로가기

전체

(363)
[Spring AI] Spring AI 컨트리뷰트 최근에 RAG 관련해서 Spring AI 를 사용할 일이 있었는데,PDF / HTML 같은걸 Vector DB 에 담아야한다.Vector DB 에 담기전에, 보통 청크 -> 청크한걸 임베딩 모델을 통해서 벡터화 -> 벡터DB 에 삽입하는데 (ETL 파이프라인)Spring AI 를 쓰게 되면 위 전 과정을 설정코드만 가지고 쓸수 있다.그러니까 "청크" 하는 라이브러리도 Spring AI 에 포함인셈 PDF 의 경우 `PagePdfDocumentReader` 를 사용하는데예시 코드는 다음과 같다.@Componentpublic class MyPagePdfDocumentReader { List getDocsFromPdf() { PagePdfDocumentReader pdfReader = new PagePdfD..
[F#] F# Computation Expression 톺아보기 F# 의 Computation Expression 의 표현력은 세계 제일! 서론. 모나드와 Expression Haskell 이나 Scala 같은 타 함수형 언어의 경우 Monad 를 위한 문법으로 Do/For 와 같은 Expression 이 존재한다.C# 이나 Kotlin 또는 JS/TS 같은 경우는 Future Monad 에 대해서만 유효한 async / await 문법이 존재하고, Null(Optional) Monad 에 대한 ?. (옵셔널 체이닝) 문법이 존재한다.위 문법은 Syntax Sugar 이며, 없어도 대게 메서드 체이닝으로 쓸수는 있다.즉 함수형에 가까운 언어는 Do/For 와 같이 그냥 "Monad" 자체에 대한 문법을 제공해서 내가 모나드를 설계하면 동작하고,그렇지 않은 언어는 언어..
Behavioral Programming 라이브러리를 코틀린에서 구현해보자 feat Channel Clojureverse 는 지식의 원천Clojureverse를 돌아다니다가 Behavioral Programming이라는 작은 패러다임에 관한 포스팅을 발견했다. 이 글을 보고 Behavioral Programming에 대해 좀 더 찾아봤는데, 주류는 아니지만 개인적으로 흥미가 생겼다.BThread라는 독립적인 Behavioral을 작성하고, BThread들이 조합되면서 하나의 BProgram이 완성되는 구조다. 복잡하게 얽히고 설킨 소프트웨어의 레고 블록들을 sync라는 공통된 이벤트 기반 시스템으로 관리하여 완성시킨다는 이론이다.절차 지향부터 함수형에 이르기까지 모든 소프트웨어가 공통적으로 추구하는 방향성은 모듈화와 그로 인한 레고처럼 조립하는 시스템이다. Behavioral Programming의 ..
대한 축구 협회 프로그래밍 랭기지를 만들어보자 되도록 튜링완전하게.. 대한축구협회 프로그래밍 랭기지 KFAlang 의 레포는 여기Lee-WonJun/KFAlang: 축구협회 프로그래밍 랭기지 (github.com) GitHub - Lee-WonJun/KFAlang: 축구협회 프로그래밍 랭기지축구협회 프로그래밍 랭기지. Contribute to Lee-WonJun/KFAlang development by creating an account on GitHub.github.com누군가 내 임기 도중 이뤄냈던 실적 에 대해 점수를 매겨보라고 한다면 10점 만점에 720점 정도는 된다고 대답하고 싶다누군가 내 임기 도중 이뤄냈던 명예 에 대해 점수를 매겨보라고 한다면 10점 만점에 690점 정도는 된다고 대답하고 싶다누군가 내 임기 도중 이뤄냈던 축협 에 대해 점수를 매겨보라고 한..
Kotlin DSL 에 다양한 제약사항을 적용해 보자 Feat [Contract] 필자는 Fluent API DSL 보다 Kotlin Type safe builder 를 활용한 DSL 을 좋아하는데, 보기에 좀더 깔끔하기 때문이다.Flunet API 는 Chaining 신경써야 하고 Depth 파악이 더 어렵기 때문그러나 Fluent API의 경우 Class Method Chaining 을 기반으로 하기 때문에 Class base 로 제약조건을 걸기가 좀더 쉽다. 예를들어, Name Age Email 을 받아서 User 를 만드는 Builder 를 설계한다고 해보자.제약 조건은 다음과 같다.1. age 는 Optional2. Name -> Email 순으로 받아야 하며, Required Field 이다 (일종의 Step)물론 해당 조건은 Compile Time 에 해당 제약 조건이 적..
[Monad] 내멋대로 Monad 이해하기 - Kleisli🐟 모나드 다 제끼고, 아래와 같은 함수가 있다고 하자type User = {id:int}let nonSafeParse (str:string) = match Int32.TryParse str with | true, value -> value | _ -> raise (ArgumentException("Invalid input"))let nonSafeCreateUser (id:int) = if id = 0 then raise (ArgumentException("Invalid input")) else {id=id}let nonSafeParseAndCreateUser = nonSafeParse >> nonSafeCreateUserlet nonSafeWay1 = "1" |> n..
[Ktor] + kts 활용해서 Dynamic Endpoint 만들기 Lee-WonJun/ktor-dynamic-endpoint-kts: Ktor-based server application sample that dynamically creates endpoints based on uploaded Kotlin script (.kts) files. (github.com) GitHub - Lee-WonJun/ktor-dynamic-endpoint-kts: Ktor-based server application sample that dynamically creates endpoints based onKtor-based server application sample that dynamically creates endpoints based on uploaded Kotlin scrip..
Kotlin 초기화 코드 제너레이터 Lee-WonJun/reverse-dummy-kt (github.com) GitHub - Lee-WonJun/reverse-dummy-ktContribute to Lee-WonJun/reverse-dummy-kt development by creating an account on GitHub.github.com예전에 dotnet 판을 만들었었는데, 이번에는 Kotlin 판.. 리플렉션 확인겸..사족) kotest 에서 string 이 컴파일 가능한지 확인하는 extension 이 있는데, 예전에는 잘됫는데.. extension 으로 분리되고부터 뭔가 잘안되서 그냥 string 비교로 검사함..