AI编程之手把手教你使用JAVA语言编写大模型RAG
RAG是通过把本地知识库检索结果和用户的交互信息,一同提交给大模型,由大模型再次加工后,形成最终结果的一个过程。RAG是最简单的使用大模型为我们工作的模式,有着广泛的应用,例如,让大模型成为我们专业领域的客服,让大模型根据我们专业领域知识产生文档等。
本文手把手教你用langchain4j编写一个最简单的RAG。
STEP1: 安装Postgresql+pgvector向量库
请参考我前面的文章: AI编程之手把手教你在CentOS安装Postgresql的Vector向量数据库
STEP2: 建设简单的知识库
请参考我前面的文章: AI编程之手把手教你使用postgresql向量数据库建设知识库JAVA版
STEP3: 编写本地知识库检索代码
本地知识库检索能力,包含建设好的向量库和从向量库里检索知识的能力:
LeoPostgresVectorEmbeddingStore embeddingStore = LeoPostgresVectorEmbeddingStore.builder()
.host(host)
.port(Integer.parseInt(port))
.database(databaseName)
.user(dataBaseUserName)
.password(dataBasePassword)
.dimension(384)
.createTable(true)
.dropTableFirst(false)
.table(tableName)
.build();
int maxResults = 1;
double minScore = 0.6;
EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel();
ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder()
.embeddingStore(embeddingStore)
.embeddingModel(embeddingModel)
.maxResults(maxResults)
.minScore(minScore)
.build();
STEP4: 编写具体的RAG过程代码
RAG过程需要一个大模型调用,以及本地知识库检索内容。使用langchain4j,这个过程就相对简化很多,而且可以非常方便的通过ChatMemory支持历史记录。
OpenAiChatModel chatModel = OpenAiChatModel.builder().baseUrl("https://xxx.yyy ")
.apiKey("sk-1234567890abcdef").modelName("gpt-3.5-turbo").build();
//建立一个可存储10条历史记录的ChatMemory
ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);
//通过AiServices实例化一个LLM调用代理
LLMAssistant agent = AiServices.builder(LLMAssistant.class)
.chatLanguageModel(chatModel)
.contentRetriever(contentRetriever) //在调用LLM之前,会自动从本地知识库检索相关知识
.chatMemory(chatMemory)
.build();
String answer = agent.chat("介绍一下五一出游趋势");
STEP5: 看看背后干了啥
我们debug代码,跟踪到发请求前,可以看到,最终调用ChatCompletion接口
背后调用的chat/completion接口。
这个接口有较多的参数可用,常用的有如下几个:
- temperature: 为0表示让模型不要自我创造,每次返回的结果都一样,为1表示让模型极大的自我创造。
- n:返回的备选文档条数。
- message中的:system参数设定AI行为的角色和背景,比如“你是一名算法工程师”;user参数是我们输入的问题,或者请求;assistant参数是一些期待AI回应的示例。
STEP6: 后续
后续将使用Langchain和postgresql实现更多的CASE,敬请关注。
作者简介:
leo,互联网大厂AI架构师,欢迎私信交流