...
This commit is contained in:
parent
b191022e6d
commit
540c700c89
@ -2,6 +2,7 @@ package kr.lunaticbum.back.lun
|
||||
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication
|
||||
import org.springframework.boot.runApplication
|
||||
import org.springframework.scheduling.annotation.EnableAsync
|
||||
import org.springframework.scheduling.annotation.EnableScheduling
|
||||
import org.springframework.web.reactive.function.client.WebClient
|
||||
import java.io.IOException
|
||||
@ -9,7 +10,7 @@ import java.util.concurrent.ExecutionException
|
||||
import java.util.concurrent.TimeUnit
|
||||
import java.util.concurrent.TimeoutException
|
||||
|
||||
|
||||
@EnableAsync
|
||||
@EnableScheduling // 추가
|
||||
@SpringBootApplication
|
||||
class LunApplication {
|
||||
|
||||
@ -36,17 +36,17 @@ class AppConfig : WebMvcConfigurer {
|
||||
// return QdrantClient("https://ollama.lunaticbum.kr:6334")
|
||||
// }
|
||||
|
||||
@Bean
|
||||
fun chatClient(): OllamaApi {
|
||||
return OllamaApi("https://lama.lunaticbum.kr")
|
||||
|
||||
// .withDefaultOptions(
|
||||
// OllamaOptions.create()
|
||||
// .withModel("phi4:14b")
|
||||
// .withNumThread(5)
|
||||
// .withSeed(5)
|
||||
// .withTemperature(0.9f))
|
||||
}
|
||||
// @Bean
|
||||
// fun chatClient(): OllamaApi {
|
||||
// return OllamaApi("https://lama.lunaticbum.kr")
|
||||
//
|
||||
//// .withDefaultOptions(
|
||||
//// OllamaOptions.create()
|
||||
//// .withModel("phi4:14b")
|
||||
//// .withNumThread(5)
|
||||
//// .withSeed(5)
|
||||
//// .withTemperature(0.9f))
|
||||
// }
|
||||
// @Bean
|
||||
// fun getProperty() : Map<String,String>{
|
||||
// println("telegramBotKey >>>> $telegramBotKey")
|
||||
|
||||
@ -0,0 +1,24 @@
|
||||
package kr.lunaticbum.back.lun.configs
|
||||
|
||||
import org.springframework.context.annotation.Bean
|
||||
import org.springframework.context.annotation.Configuration
|
||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
|
||||
|
||||
|
||||
@Configuration
|
||||
class AsyncConfig {
|
||||
@Bean
|
||||
fun taskExecutor(): ThreadPoolTaskExecutor {
|
||||
val executor = ThreadPoolTaskExecutor()
|
||||
executor.corePoolSize = 10 // 코어 스레드 풀 크기 설정
|
||||
executor.maxPoolSize = 20 // 최대 스레드 풀 크기 설정
|
||||
executor.queueCapacity = 500 // 작업 큐 용량 설정
|
||||
executor.setThreadNamePrefix("AsyncThread-") // 스레드 이름 접두사 설정
|
||||
|
||||
// 작업이 완료된 후 스레드 풀이 종료될 때까지 대기할 시간 설정 (단위: 초)
|
||||
executor.setAwaitTerminationSeconds(60)
|
||||
|
||||
executor.initialize()
|
||||
return executor
|
||||
}
|
||||
}
|
||||
@ -28,11 +28,11 @@ class BumsInterceptor : HandlerInterceptor {
|
||||
@Throws(Exception::class)
|
||||
override fun preHandle(request: HttpServletRequest, response: HttpServletResponse, handler: Any): Boolean {
|
||||
var skippResourcesExtension = arrayListOf(".js",".css").filter { request.requestURI.contains(it) }.size > 0
|
||||
if (!skippResourcesExtension) {
|
||||
println("===============================================")
|
||||
println("==================== BEGIN ====================")
|
||||
println("Request URL ===> " + request.requestURL)
|
||||
}
|
||||
// if (!skippResourcesExtension) {
|
||||
// println("===============================================")
|
||||
// println("==================== BEGIN ====================")
|
||||
// println("Request URL ===> " + request.requestURL)
|
||||
// }
|
||||
return super.preHandle(request, response, handler)
|
||||
}
|
||||
|
||||
@ -44,7 +44,7 @@ class BumsInterceptor : HandlerInterceptor {
|
||||
handler: Any,
|
||||
@Nullable modelAndView: ModelAndView?
|
||||
) {
|
||||
var skippResourcesExtension = arrayListOf(".js",".css").filter { request.requestURI.contains(it) }.size > 0
|
||||
var skippResourcesExtension = arrayListOf(".ajax",".js",".css").filter { request.requestURI.contains(it) }.size > 0
|
||||
if (!skippResourcesExtension) {
|
||||
if (request.requestURI.contains("logout") == false && !request.cookies.isNullOrEmpty() && request.cookies.filter {
|
||||
it.name.equals(
|
||||
@ -60,6 +60,7 @@ class BumsInterceptor : HandlerInterceptor {
|
||||
access = it
|
||||
accessOk = true
|
||||
println("==================== accessOk ${accessOk} ======================")
|
||||
|
||||
}
|
||||
}
|
||||
request.cookies.forEach {
|
||||
@ -70,44 +71,41 @@ class BumsInterceptor : HandlerInterceptor {
|
||||
}
|
||||
}
|
||||
if (refreshOk || accessOk) {
|
||||
if (refreshOk) {
|
||||
if (!accessOk) {
|
||||
refresh?.let { refresh ->
|
||||
jwtService.getUserIdFromRefresh(refresh.value)?.let { userId ->
|
||||
userManager.findById(userId)?.block()?.let { user ->
|
||||
jwtService.generate(user)?.let { token ->
|
||||
response.addCookie(cookieUpdate(Cookie("access", token.tokenKey)))
|
||||
response.addCookie(cookieUpdate(Cookie("refresh", token.refreshToken)))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
response.addCookie(cookieUpdate(access))
|
||||
}
|
||||
} else if (accessOk) {
|
||||
response.addCookie(cookieUpdate(access))
|
||||
request.getSession(true)?.let { session ->
|
||||
session.setAttribute(WRITE_PERMISSION_KEY, true)
|
||||
session.maxInactiveInterval = 60 * 5
|
||||
}
|
||||
modelAndView?.modelMap?.put(WRITE_PERMISSION_KEY, "OK")
|
||||
modelAndView?.modelMap?.put("user_id", jwtService.getUserIdFromToken(access?.value ?: ""))
|
||||
} else {
|
||||
println("==================== accessOk ${accessOk} && refreshOk ${refreshOk} ======================")
|
||||
response.addCookie(Cookie("access", "").apply { maxAge = -1 })
|
||||
response.addCookie(Cookie("refresh", "").apply { maxAge = -1 })
|
||||
modelAndView?.modelMap?.put(WRITE_PERMISSION_KEY, "NO")
|
||||
modelAndView?.modelMap?.put("user_id", "")
|
||||
}
|
||||
println("Response modelMap ===> ${Gson().toJson(modelAndView?.modelMap)}")
|
||||
} else if (request.requestURI.contains("logout")) {
|
||||
modelAndView?.modelMap?.put(WRITE_PERMISSION_KEY, "NO")
|
||||
modelAndView?.modelMap?.put("user_id", "")
|
||||
}
|
||||
|
||||
}
|
||||
} else if (request.requestURI.contains("logout")) {
|
||||
request.getSession(true)?.let { session ->
|
||||
session.invalidate()
|
||||
session.setAttribute(WRITE_PERMISSION_KEY, false)
|
||||
}
|
||||
}
|
||||
println("==================== END ======================")
|
||||
println("===============================================")
|
||||
}
|
||||
request.cookies?.forEach {
|
||||
if (it.name.equals("CLEAR", true)) {
|
||||
request.getSession(true)?.let { session ->
|
||||
session.invalidate()
|
||||
session.setAttribute(WRITE_PERMISSION_KEY, false)
|
||||
}
|
||||
}
|
||||
}
|
||||
modelAndView?.modelMap?.put(WRITE_PERMISSION_KEY,"NO")
|
||||
request.getSession(true)?.let {
|
||||
(it.getAttribute(WRITE_PERMISSION_KEY) as? Boolean)?.let { permission ->
|
||||
if (permission) {
|
||||
modelAndView?.modelMap?.put(WRITE_PERMISSION_KEY,"OK")
|
||||
}
|
||||
}
|
||||
}
|
||||
super.postHandle(request, response, handler, modelAndView)
|
||||
}
|
||||
|
||||
fun cookieUpdate(cookie: Cookie?) : Cookie? {
|
||||
cookie?.maxAge = (globalEvv.ACCESS_EXPIRATION / 1000).toInt()
|
||||
cookie?.domain = "lunaticbum.kr"
|
||||
|
||||
@ -143,39 +143,34 @@ class BlogController() {
|
||||
fun modify(httpServletRequest: HttpServletRequest, @RequestParam("token") token : String?) : ResultMV{
|
||||
logService.log("incoming modify")
|
||||
val vm = ResultMV("content/blog/modify")
|
||||
var s33Key : String? = null
|
||||
if(jwtService.hasPerrmission(httpServletRequest)) {
|
||||
postManageg.find20()?.apply {
|
||||
forEach {
|
||||
it.title = URLDecoder.decode(it.title)
|
||||
val content = URLDecoder.decode(it.content)
|
||||
it.content = if (content.length > 50) content.substring(0,150) else content
|
||||
vm.modelMap.put(WRITE_PERMISSION_KEY,"NO")
|
||||
httpServletRequest.getSession(true)?.let { session ->
|
||||
(session.getAttribute(WRITE_PERMISSION_KEY) as? Boolean)?.let {
|
||||
postManageg.find20()?.apply {
|
||||
forEach {
|
||||
it.title = URLDecoder.decode(it.title)
|
||||
val content = URLDecoder.decode(it.content)
|
||||
it.content = if (content.length > 50) content.substring(0,150) else content
|
||||
}
|
||||
vm.modelMap.put("chunkedPosts", this.chunked(3))
|
||||
}
|
||||
vm.modelMap.put("chunkedPosts", this.chunked(3))
|
||||
vm.modelMap.put(WRITE_PERMISSION_KEY,"OK")
|
||||
vm.modelMap.put("path","editor/")
|
||||
vm.modelMap.put("SK",token)
|
||||
}
|
||||
vm.modelMap.put(WRITE_PERMISSION_KEY,"OK")
|
||||
vm.modelMap.put("path","editor/")
|
||||
vm.modelMap.put("SK",token)
|
||||
} else {
|
||||
vm.modelMap.put(WRITE_PERMISSION_KEY,"NO")
|
||||
}
|
||||
vm.modelMap.put("rowKey","chunkedPosts_")
|
||||
return vm
|
||||
}
|
||||
|
||||
@GetMapping("editor/{postId}")
|
||||
fun editor(@PathVariable postId : String, @RequestParam("token") token : String?) : ResultMV{
|
||||
fun editor(@PathVariable postId : String) : ResultMV{
|
||||
val vm = ResultMV("content/blog/editor")
|
||||
postManageg.getPost(postId).block().apply {
|
||||
this?.title = URLDecoder.decode(this?.title)
|
||||
this?.content = URLDecoder.decode(this?.content)
|
||||
vm.modelMap.put("srcPost",this)
|
||||
}
|
||||
if (TEMPTOKEN.equals(token)) {
|
||||
vm.modelMap.put(WRITE_PERMISSION_KEY,"OK")
|
||||
} else {
|
||||
vm.modelMap.put(WRITE_PERMISSION_KEY,"NO")
|
||||
}
|
||||
return vm
|
||||
}
|
||||
|
||||
@ -183,7 +178,7 @@ class BlogController() {
|
||||
@GetMapping("recent")
|
||||
fun recent() : ResultMV{
|
||||
val vm = ResultMV("content/blog/viewer")
|
||||
locationLogService.find20().forEach {
|
||||
locationLogService.find10().forEach {
|
||||
logService.log(Gson().toJson(it))
|
||||
}
|
||||
locationLogService.getLocationLog()?.let {
|
||||
|
||||
@ -33,11 +33,9 @@ class BumsPrivate {
|
||||
@GetMapping("where")
|
||||
fun where() : ResultMV {
|
||||
val m = ResultMV("content/private/where")
|
||||
locationService.find20().apply {
|
||||
|
||||
locationService.find10().apply {
|
||||
m.modelMap.put("locations",this.reversed())
|
||||
// forEach {
|
||||
// logService.log(it.timeString.plus(it.mAddressLines.joinToString(",")))
|
||||
// }
|
||||
}
|
||||
m.setTitle("돼지 여기있다요~!!")
|
||||
return m
|
||||
@ -60,15 +58,15 @@ class BumsPrivate {
|
||||
val responce = ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(ResponceResult().apply {
|
||||
|
||||
})
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
location?.let {
|
||||
val client = WebClient.create()
|
||||
client.get()
|
||||
.uri("https://api.telegram.org/${globalEvv.telegramBotKey}/sendMessage?chat_id=${globalEvv.telegramMyId}&text=${it.mAddressLines.first()} 저장")
|
||||
.retrieve()
|
||||
.bodyToMono(String::class.java).block() ?: "FAIL"
|
||||
}
|
||||
}
|
||||
// CoroutineScope(Dispatchers.IO).launch {
|
||||
// location?.let {
|
||||
// val client = WebClient.create()
|
||||
// client.get()
|
||||
// .uri("https://api.telegram.org/${globalEvv.telegramBotKey}/sendMessage?chat_id=${globalEvv.telegramMyId}&text=${it.mAddressLines.first()} 저장")
|
||||
// .retrieve()
|
||||
// .bodyToMono(String::class.java).block() ?: "FAIL"
|
||||
// }
|
||||
// }
|
||||
return responce
|
||||
}
|
||||
|
||||
|
||||
@ -74,6 +74,7 @@ class UserController {
|
||||
@PostMapping("login.ajax")
|
||||
fun login(httpServletRequest: HttpServletRequest, @RequestBody jsonString: String) : ResponseEntity<LoginResult> {
|
||||
try {
|
||||
|
||||
logService.log(httpServletRequest.requestURI)
|
||||
logService.log(jsonString)
|
||||
var lResultCode = 0
|
||||
|
||||
@ -90,8 +90,8 @@ class LocationLogService : LocationService {
|
||||
@Autowired
|
||||
private lateinit var logRepository: LocationLogRepository
|
||||
|
||||
fun find20() : List<LocationLog> {
|
||||
return logRepository.findAll().takeLast(20).buffer(20).blockLast(Duration.ofSeconds(30)) ?: listOf()
|
||||
fun find10() : List<LocationLog> {
|
||||
return logRepository.findAll().takeLast(10).buffer(10).blockLast(Duration.ofSeconds(30)) ?: listOf()
|
||||
}
|
||||
fun getLocationLog() : LocationLog? {
|
||||
return logRepository.findFirstByOrderByTimeDesc().block()
|
||||
|
||||
@ -12,7 +12,8 @@ class SearXng {
|
||||
var unresponsive_engines: ArrayList<ArrayList<String>>? = null
|
||||
}
|
||||
class SearXngResult {
|
||||
// var originQuery : String? = null
|
||||
var originQuery : String? = null
|
||||
var refinedQuery : String? = null
|
||||
var url: String? = null
|
||||
var title: String? = null
|
||||
var content: String? = null
|
||||
|
||||
@ -7,6 +7,7 @@ import com.google.gson.annotations.SerializedName
|
||||
import io.micrometer.observation.ObservationRegistry
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.async
|
||||
import kotlinx.coroutines.launch
|
||||
import kr.lunaticbum.back.lun.configs.GlobalEnvironment
|
||||
import kr.lunaticbum.back.lun.controllers.TelegramSendMsg
|
||||
@ -21,6 +22,7 @@ import org.springframework.ai.ollama.management.ModelManagementOptions
|
||||
import org.springframework.beans.factory.annotation.Autowired
|
||||
import org.springframework.beans.factory.annotation.Qualifier
|
||||
import org.springframework.http.MediaType
|
||||
import org.springframework.scheduling.annotation.Async
|
||||
import org.springframework.stereotype.Service
|
||||
import org.springframework.web.reactive.function.BodyInserters
|
||||
import org.springframework.web.reactive.function.client.WebClient
|
||||
@ -28,15 +30,14 @@ import reactor.kotlin.core.publisher.toMono
|
||||
import java.text.SimpleDateFormat
|
||||
import java.time.Duration
|
||||
import java.util.*
|
||||
import kotlin.collections.ArrayList
|
||||
|
||||
|
||||
@Service
|
||||
class Lama {
|
||||
|
||||
|
||||
@Qualifier("chatClient")
|
||||
@Autowired
|
||||
private lateinit var chatClient: OllamaApi
|
||||
|
||||
|
||||
//, val date : String = SimpleDateFormat("yyyyMMddHHmmss").format(Date())
|
||||
// data class QSearchData(val query : FloatArray,val limit : Int)
|
||||
@ -62,7 +63,7 @@ class Lama {
|
||||
// .retrieve()
|
||||
// .bodyToMono(String::class.java).timeout(Duration.ofMinutes(20L)).block() ?: ""
|
||||
// }
|
||||
var qPointsCount : Long = 0
|
||||
|
||||
private fun checkCollection() : Long {
|
||||
val qUrl = "https://ollama.lunaticbum.kr/collections/blama_vectors"
|
||||
val client = WebClient.create()
|
||||
@ -119,9 +120,9 @@ class Lama {
|
||||
}
|
||||
}
|
||||
return if (lastElement.size > 0) {
|
||||
lastElement.map { it.children().eachText() }.joinToString(joinString)
|
||||
lastElement.eachText().joinToString(joinString)
|
||||
} else {
|
||||
body.children().map { it.children().eachText() }.joinToString(joinString)
|
||||
body.children().eachText().joinToString(joinString)
|
||||
}
|
||||
}
|
||||
|
||||
@ -137,71 +138,116 @@ class Lama {
|
||||
// }
|
||||
|
||||
|
||||
private fun addDocuments(query : String) {
|
||||
|
||||
val embeddingModel = OllamaEmbeddingModel(
|
||||
chatClient,
|
||||
OllamaOptions.builder().build(),
|
||||
ObservationRegistry.create(),
|
||||
ModelManagementOptions.defaults()
|
||||
)
|
||||
val gSearch = "https://psn.lunaticbum.kr/search?q=${query?.replace("오늘", SimpleDateFormat("yyyMMdd").format(Date()))}&language=ko&time_range=month&safesearch=0&categories=general&format=json"
|
||||
println("gSearch >>> ${gSearch}")
|
||||
val sdss = QPut(arrayListOf())
|
||||
WebClient.create().get()
|
||||
.uri(gSearch)
|
||||
.retrieve()
|
||||
.bodyToMono(SearXng::class.java).timeout(Duration.ofMinutes(20L)).block()?.let { gsResult ->
|
||||
gsResult.results?.filter { it.score > 0.3}?.forEach {
|
||||
qPointsCount += 1
|
||||
println("in filter ${it.url}")
|
||||
// it.originQuery = query
|
||||
val data = Gson().toJson(it)
|
||||
println(it.title)
|
||||
jsopFilter(it.url!!).let { text ->
|
||||
try {
|
||||
println("text >>>>> ${text?.chunked(50)?.first() ?: ""}")
|
||||
var dispoable = chatClient.chat(OllamaApi.ChatRequest.Builder("phi4:14b").stream(false).format("json").messages(
|
||||
listOf(OllamaApi.Message.Builder(OllamaApi.Message.Role.USER).content("원문:\n'${text}'\n원문의 웹 페이지 소스는 '$query'이 질문에 대해 연관 결과로 받은 내용이야. 해당 정보를 파악해서 'query:{질문},contents:{본문내용},summary:{요약},keywords:[키워드],related_links:[링크],relatedness_score:{0.0~10.0}'이 형식의 결과만들어줘 내용은 한국어로 부탁할께").build())
|
||||
).build()).toMono().subscribe({aiResponce ->
|
||||
it.pageData = aiResponce.message.content
|
||||
// println(aiResponce)
|
||||
println("summary result >>>>> ${it.pageData}")
|
||||
// it.originHtml = text
|
||||
val embeddingResponse = embeddingModel.call(
|
||||
EmbeddingRequest(
|
||||
listOf(data),
|
||||
OllamaOptions.builder()
|
||||
.model("nomic-embed-text")
|
||||
.truncate(false).build()
|
||||
)
|
||||
)
|
||||
sdss.points.add(QData(id = qPointsCount,embeddingResponse.result.output,it))
|
||||
},{err->
|
||||
err.printStackTrace()
|
||||
})
|
||||
}catch (e : Exception) {
|
||||
e.printStackTrace()
|
||||
fun addDocuments(query : String , refinedQuery: RefinedQuery?) {
|
||||
var querys : ArrayList<String> = ArrayList()
|
||||
querys.add(query)
|
||||
refinedQuery?.ko_query?.let { querys.add(it) }
|
||||
refinedQuery?.en_query?.let { querys.add(it) }
|
||||
refinedQuery?.keywords?.let { querys.add(it.joinToString { " " })}
|
||||
val readedUrls = ArrayList<String>()
|
||||
querys.forEach { refinedQuery ->
|
||||
val gSearch = "https://psn.lunaticbum.kr/search?q=${refinedQuery?.replace("오늘", SimpleDateFormat("yyyMMdd").format(Date()))}&language=ko&time_range=month&safesearch=0&categories=general&format=json"
|
||||
println("gSearch >>> ${gSearch}")
|
||||
WebClient.create().get()
|
||||
.uri(gSearch)
|
||||
.retrieve()
|
||||
.bodyToMono(SearXng::class.java).timeout(Duration.ofMinutes(20L)).block()?.let { gsResult ->
|
||||
gsResult.results?.filter { it.url?.startsWith("https://") == true && it.score > 0.4}?.forEach {
|
||||
println("in filter ${it.url}")
|
||||
if (readedUrls.contains(it.url) == false) {
|
||||
readedUrls.add(it.url!!)
|
||||
it.originQuery = query
|
||||
it.refinedQuery = refinedQuery
|
||||
println(it.title)
|
||||
try {
|
||||
jsopFilter(it.url!!).let { text ->
|
||||
it.originHtml = text
|
||||
webPageSummarize(it,text)
|
||||
}
|
||||
}catch(e:Exception){e.printStackTrace()}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
println("out filter")
|
||||
if (sdss.points.size > 0) {
|
||||
val qUrl = "https://ollama.lunaticbum.kr/collections/blama_vectors".plus("/points")
|
||||
val client = WebClient.create()
|
||||
client.put()
|
||||
.uri(qUrl)
|
||||
.header("api-key", "blama-admin-key-gb")
|
||||
.body(BodyInserters.fromValue(Gson().toJson(sdss)))
|
||||
.retrieve()
|
||||
.bodyToMono(String::class.java).timeout(Duration.ofMinutes(20L)).block() ?: ""
|
||||
|
||||
println("end of search")
|
||||
}
|
||||
println("end of search")
|
||||
}
|
||||
|
||||
private fun embedQuery(embedFlots : FloatArray) : QContents?{
|
||||
var format = "원문:\n'%s'\n원문의 웹 페이지 소스는 '%s'이 질문에 대해 연관 결과로 받은 내용이야. 해당 정보를 파악해서 'query:{질문},contents:{본문내용 한국어},summary:{요약 한국어},keywords:[키워드],related_links:[링크],relatedness_score:{0.0~10.0}'이 형식의 결과만들어줘"
|
||||
internal fun makeSummarizeRequestMsg(it : SearXngResult) : String= format.format(it.originHtml,it.originQuery)
|
||||
|
||||
internal fun makeCahtReq(reqMsg:String) = OllamaApi.ChatRequest.Builder("phi4:14b").stream(false).format("json").messages(listOf(OllamaApi.Message.Builder(OllamaApi.Message.Role.USER).content(reqMsg).build())).build()
|
||||
|
||||
@Async
|
||||
fun webPageSummarize(it : SearXngResult , text : String) {
|
||||
try {
|
||||
val chatClient = OllamaApi("https://lama.lunaticbum.kr")
|
||||
val embeddingModel = OllamaEmbeddingModel(
|
||||
chatClient, OllamaOptions.builder().build(), ObservationRegistry.create(), ModelManagementOptions.defaults())
|
||||
println("text >>>>> ${text?.chunked(50)?.first() ?: ""}")
|
||||
var dispoable = chatClient.chat(makeCahtReq(makeSummarizeRequestMsg(it))).toMono().subscribe({aiResponce ->
|
||||
it.pageData = aiResponce.message.content
|
||||
println("summary result >>>>> ${it.pageData}")
|
||||
val embeddingResponse = embeddingModel.call(
|
||||
EmbeddingRequest(
|
||||
listOf(aiResponce.message.content),
|
||||
OllamaOptions.builder()
|
||||
.model("bge-m3")
|
||||
.truncate(false).build()
|
||||
)
|
||||
)
|
||||
infomationDic.put(it.url!!,aiResponce.message.content)
|
||||
val sdss = QPut(arrayListOf())
|
||||
sdss.points.add(QData(id = System.currentTimeMillis(),embeddingResponse.result.output,it))
|
||||
if (sdss.points.size > 0) {
|
||||
val qUrl = "https://ollama.lunaticbum.kr/collections/blama_vectors".plus("/points")
|
||||
val client = WebClient.create()
|
||||
client.put()
|
||||
.uri(qUrl)
|
||||
.header("api-key", "blama-admin-key-gb")
|
||||
.body(BodyInserters.fromValue(Gson().toJson(sdss)))
|
||||
.retrieve()
|
||||
.bodyToMono(String::class.java).timeout(Duration.ofMinutes(20L)).subscribe(
|
||||
{resultString -> },{error-> error.printStackTrace()}
|
||||
)
|
||||
}
|
||||
},{err->
|
||||
err.printStackTrace()
|
||||
})
|
||||
}catch (e : Exception) {
|
||||
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
class RefinedQuery {
|
||||
var ko_query : String? = null
|
||||
var en_query : String? = null
|
||||
var keywords : Array<String>? = null
|
||||
}
|
||||
|
||||
var queryFormat = "질문:\n'%s'\n앞은 질문의 내용을 정리해서 '{ko_query:한국어 질문,en_query:영어 번역된 질문,ko_keywords:[한국어 키워드],en_keyword:[영문키워드]}'이 형식의 결과를 부탁할께"
|
||||
internal fun makeQuerySummarizeRequestMsg(query : String) : String= queryFormat.format(query)
|
||||
fun querySummarize(query: String) : RefinedQuery? {
|
||||
var refinedQuery : RefinedQuery? = null
|
||||
try {
|
||||
val chatClient = OllamaApi("https://lama.lunaticbum.kr")
|
||||
var dispoable = chatClient.chat(makeCahtReq(makeQuerySummarizeRequestMsg(query))).toMono().subscribe({aiResponce ->
|
||||
println("summary result >>>>> ${aiResponce.message.content}")
|
||||
refinedQuery = Gson().fromJson(aiResponce.message.content, RefinedQuery::class.java)
|
||||
},{err->
|
||||
err.printStackTrace()
|
||||
})
|
||||
}catch (e : Exception) {
|
||||
|
||||
e.printStackTrace()
|
||||
}
|
||||
return refinedQuery
|
||||
}
|
||||
|
||||
|
||||
@Async
|
||||
public fun embedQuery(embedFlots : FloatArray) : QContents?{
|
||||
val qUrl = "https://ollama.lunaticbum.kr/collections/blama_vectors".plus("/points/search")
|
||||
val client = WebClient.create()
|
||||
var lists = client.post()
|
||||
@ -233,63 +279,41 @@ class Lama {
|
||||
@Autowired
|
||||
lateinit var globalEvv : GlobalEnvironment
|
||||
|
||||
var infomationDic = hashMapOf<String,String>()
|
||||
suspend fun generateResponse(query: String?, targetId: String? = globalEvv.telegramMyId) {
|
||||
infomationDic.clear()
|
||||
val chatClient = OllamaApi("https://lama.lunaticbum.kr")
|
||||
val embeddingModel = OllamaEmbeddingModel(
|
||||
chatClient,
|
||||
OllamaOptions.builder().build(),
|
||||
ObservationRegistry.create(),
|
||||
ModelManagementOptions.defaults()
|
||||
)
|
||||
chatClient, OllamaOptions.builder().build(), ObservationRegistry.create(), ModelManagementOptions.defaults())
|
||||
println("On generateResponse :: find something ${query}")
|
||||
query?.let {
|
||||
var embeddingResponse = embeddingModel.call(
|
||||
EmbeddingRequest(
|
||||
listOf(query),
|
||||
OllamaOptions.builder()
|
||||
.model("nomic-embed-text")
|
||||
.truncate(false)
|
||||
.build()
|
||||
)
|
||||
)
|
||||
query?.let { originalQuery ->
|
||||
var embeddingResponse = embeddingModel.call(EmbeddingRequest(listOf(originalQuery), OllamaOptions.builder().model("bge-m3").truncate(false).build()))
|
||||
addDocuments(originalQuery, querySummarize(originalQuery))
|
||||
println("points size ${embeddingResponse.result.output.size}")
|
||||
qPointsCount = checkCollection()
|
||||
addDocuments(it)
|
||||
embeddingResponse = embeddingModel.call(
|
||||
EmbeddingRequest(
|
||||
listOf(query),
|
||||
OllamaOptions.builder()
|
||||
.model("nomic-embed-text")
|
||||
.truncate(false)
|
||||
.build()
|
||||
)
|
||||
)
|
||||
println(embeddingResponse.result.output)
|
||||
var context : String? = ""
|
||||
try {
|
||||
embedQuery(embeddingResponse.result.output)?.result?.forEach { result ->
|
||||
context += "참고자료:".plus(if (result.payload?.pageData?.length ?: 0 > 10) {
|
||||
result.payload?.pageData
|
||||
} else {
|
||||
result.payload?.content
|
||||
})
|
||||
context +="\n"
|
||||
if (infomationDic.contains(result.payload?.url ?: "NONE") == false) {
|
||||
context += "\n# :".plus(if (result.payload?.pageData?.length ?: 0 > 10) {
|
||||
result.payload?.pageData
|
||||
} else {
|
||||
result.payload?.content
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
}catch (e:Exception){
|
||||
e.printStackTrace()
|
||||
}
|
||||
val response: OllamaApi.ChatResponse = if (context?.length ?: 0 > 10) {
|
||||
val prompt = "Context information is below.\n$context\nGiven the context information and not prior knowledge, answer the query: $query\n한국어로 대답해줘".trimIndent()
|
||||
chatClient.chat(OllamaApi.ChatRequest.Builder("phi4:14b").stream(false).format("json").messages(
|
||||
listOf(OllamaApi.Message.Builder(OllamaApi.Message.Role.USER).content(prompt).build())
|
||||
).build())
|
||||
} else {
|
||||
chatClient.chat(OllamaApi.ChatRequest.Builder("phi4:14b").stream(false).format("json").messages(
|
||||
listOf(OllamaApi.Message.Builder(OllamaApi.Message.Role.USER).content(query).build())
|
||||
).build())
|
||||
}
|
||||
|
||||
infomationDic.iterator().forEach { context += "\n#${it.key}:${it.value}" }
|
||||
|
||||
val prompt = "참조:\n$context\n참조 내용을 고려해서\n해당 질문:${query}\n에 {질문내용:[한국어],답변내용:[한국어],전체키워드:[],참조링크:[]}형식으로 대답 해줘 ".trimIndent()
|
||||
println(prompt)
|
||||
val response: OllamaApi.ChatResponse = chatClient.chat(OllamaApi.ChatRequest.Builder("phi4:14b").stream(false).format("json").messages(
|
||||
listOf(OllamaApi.Message.Builder(OllamaApi.Message.Role.USER).content(prompt).build())
|
||||
).build())
|
||||
|
||||
println(response.message.content)
|
||||
// val fullUrl = "https://api.telegram.org/${globalEvv.telegramBotKey}/sendMessage?chat_id=${globalEvv.telegramMyId}&text=${query}의 대답이 도착했어요.\n\n${response.message.content}"
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
var toalmsg = "${query}의 대답이 도착했어요.\n${response.message.content}"
|
||||
val fullUrl = "https://api.telegram.org/${globalEvv.telegramBotKey}/sendMessage"
|
||||
@ -309,8 +333,6 @@ class Lama {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
println("On generateResponse :: END OF Answer")
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,13 +5,9 @@ onload = function() {
|
||||
var refreshToken = get_cookie("refresh")
|
||||
console.log("access === " + accToken + " || " + accToken.length);
|
||||
console.log("refresh === " + refreshToken + " || " + refreshToken.length);
|
||||
|
||||
if (accToken.length < 1) {
|
||||
document.cookie = "refresh="+ window.sessionStorage.getItem("REFRESH") + ";";
|
||||
}
|
||||
if (refreshToken.length < 1) {
|
||||
window.sessionStorage.setItem("REFRESH",get_cookie("refresh"))
|
||||
}
|
||||
document.cookie = "access=; expires=Thu, 01 Jan 1970 00:00:01 GMT;"
|
||||
document.cookie = "refresh=; expires=Thu, 01 Jan 1970 00:00:01 GMT;"
|
||||
document.cookie = "CLEAR=; expires=Thu, 01 Jan 1970 00:00:01 GMT;"
|
||||
}
|
||||
onbeforeunload = function () {
|
||||
var accToken = get_cookie("access")
|
||||
@ -160,6 +156,10 @@ function logout() {
|
||||
// retrieve all cookies
|
||||
document.cookie = "access=; expires=Thu, 01 Jan 1970 00:00:01 GMT;"
|
||||
document.cookie = "refresh=; expires=Thu, 01 Jan 1970 00:00:01 GMT;"
|
||||
|
||||
console.log(document.cookie["JSESSIONID"])
|
||||
document.cookie = "JSESSIONID=; expires=Thu, 01 Jan 1970 00:00:01 GMT;"
|
||||
document.cookie = "CLEAR="+Date.now()+"";
|
||||
let logOutUrl = getMainPath() + "/user/logout.ajax";
|
||||
post(logOutUrl,"","","", function (resultData) {
|
||||
alert("로그아웃 됨요~! 빠염~!")
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user