langchain4j + ollama3 实现 AI

158 阅读1分钟

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

image

  ‍

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);

image

		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();

  ‍