RAGScript 是一个使用 Kotlin DSL 的脚本语言,以用于快速使用、构建 RAG (检索增强,Retrieval Augmented Generation)应用的 PoC。
适用场景:安装有 Intellij IDEA、Kotlin Jupyter 环境或者 Kotlin 编译器的开发环境
需知:文件名必须以 *.main.kts
的形式命名,否则无法运行。
示例:
// 声明依赖
@file:DependsOn("cc.unitmesh:rag-script:0.3.3")
// 引入 RAGScript 依赖
import cc.unitmesh.rag.*
rag {
// 使用 OpenAI 作为 LLM 引擎
llm = LlmConnector(LlmType.OpenAI)
// 使用 SentenceTransformers 作为 Embedding 引擎
embedding = EmbeddingEngine(EngineType.SentenceTransformers)
// 使用 Memory 作为 Retriever
store = Store(StoreType.Memory)
indexing {
// 从文件中读取文档
val document = document("filename.txt")
// 将文档切割成 chunk
val chunks = document.split()
// 建立索引
store.indexing(chunks)
}
querying {
// 查询
store.findRelevant("workflow dsl design ").also {
println(it)
}
}
}
相似性搜索代码示例
在 indexing 阶段:
- 下载和使用 ArchGuard Scanner CLI 工具,扫描代码库,生成 JSON 格式的代码数据结构
- 使用 CodeSplitter 将代码数据结构切割成文档
- 使用 Elasticsearch 建立向量化索引
在 querying 阶段:
- 结合 Elasticsearch 进行向量化搜索
- 生成问题,并使用 LLM 生成答案
@file:DependsOn("cc.unitmesh:rag-script:0.3.6")
import java.io.File
import cc.unitmesh.cf.code.CodeSplitter
import cc.unitmesh.rag.document.Document
import chapi.domain.core.CodeDataStruct
import cc.unitmesh.rag.*
import kotlinx.serialization.json.Json
rag {
val apiKey = env?.get("OPENAI_API_KEY") ?: ""
val apiHost = env?.get("OPENAI_API_HOST") ?: ""
llm = LlmConnector(LlmType.OpenAI, apiKey, apiHost)
embedding = EmbeddingEngine(EngineType.SentenceTransformers)
store = Store(StoreType.Elasticsearch)
indexing {
// Data Loader
val cliUrl = "https://github.com/archguard/archguard/releases/download/v2.0.7/scanner_cli-2.0.7-all.jar"
val file = Http.download(cliUrl)
Exec.runJar(
file, args = listOf(
"--language", "Kotlin",
"--output", "json",
"--path", ".",
"--with-function-code"
)
)
// Code Splitter
val chunks: List<Document> = Json.decodeFromString<List<CodeDataStruct>>(File("0_codes.json").readText()).map {
CodeSplitter().split(it)
}.flatten()
store.indexing(chunks)
}
querying {
val results = store.findRelevant("workflow dsl design ")
val sorted = results
.lowInMiddle()
llm.completion {
"""Your job is to answer a query about a codebase using the information above.
|...
|相关的代码如下:
|${sorted.joinToString("\n") { "${it.score} ${it.embedded.text}" }}
|
|用户的问题是:如何设计一个 DSL 的 workflow
|""".trimMargin()
}.also {
println(it)
}
}
}