langchain4j + ollama3 实现 AI
langchain4j + ollama3 实现 AI
注意: 官方建议 jdk17+ springboot 3.2+
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-spring-boot-starter</artifactId>
<version>0.31.0</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-ollama</artifactId>
<version>0.31.0</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-chroma</artifactId>
<version>0.31.0</version>
</dependency>
simple
OllamaChatModel llm = OllamaChatModel.builder()
.baseUrl("http://localhost:11434")
.modelName("llama3")
.temperature(0d)
.build();
String result = llm.generate("中国首都在哪?");
System.out.println(result);
PromptTemplateMessage
OllamaChatModel llm = OllamaChatModel.builder()
.baseUrl("http://localhost:11434")
.modelName("llama3")
.temperature(0d)
.build();
String information = "中国首都为北京,直辖市有北京、天津、重庆,港澳台地区有香港、澳门";
Prompt prompt = PromptTemplate.from("""
Tell me about {{name}}?
Use the following information to answer the question:
{{information}}
""").apply(Map.of("name", "直辖市有哪些?","information", information));
String response = llm.generate(prompt.toUserMessage()).content().text();
RAG
Document document = FileSystemDocumentLoader.loadDocument("/xxx.txt", new TextDocumentParser());
DocumentSplitter splitter = DocumentSplitters.recursive(600,0);
List<TextSegment> documentSplitter = splitter.split(document);
EmbeddingModel embeddingModel = OllamaEmbeddingModel.builder()
.baseUrl("http://localhost:11434")
.modelName("llama3")
.build();
List<Embedding> embeddingModels = embeddingModel.embedAll(documentSplitter).content();
EmbeddingStore embeddingStore = new InMemoryEmbeddingStore();
embeddingStore.addAll(embeddingModels,documentSplitter);
Embedding queryEmbedding = embeddingModel.embed("瑜伽垫的规格尺寸?").content();
EmbeddingSearchRequest searchRequest = EmbeddingSearchRequest.builder().queryEmbedding(queryEmbedding).maxResults(1).build();
EmbeddingSearchResult relevant = embeddingStore.search(searchRequest);
List<EmbeddingMatch> matchesList = relevant.matches();
String information = matchesList.stream().map(matches -> matches.embedded().toString()).collect(Collectors.joining("\n"));
Prompt prompt = PromptTemplate.from("""
请根据输入的信息:
{{information}},解答如下问题:{{query}}
""").apply(Map.of("query", "瑜伽垫的尺寸是多少?","information", information));
OllamaChatModel llm = OllamaChatModel.builder()
.baseUrl("http://localhost:11434")
.modelName("llama3")
.temperature(0d)
.build();
String answer = llm.generate(prompt.toUserMessage()).content().text();