Spring AI 與 Ollama 在本地執行案例原始碼

banq發表於2024-03-29

為了更好地理解Spring AI是如何實現的,建議更好地理解AI概念。

什麼是Spring AI專案
Spring AI專案的建立是為了加快開發可以使用人工智慧資源且不太複雜的應用程式。

該專案的靈感來自LangChain和LlamaIndex,兩者都是用Python開發的,但生成式AI應用的浪潮不僅僅來自Python開發人員。

Spring AI提供了抽象,因此即使在 AI 發生變化的情況下,也只會進行最少的程式碼更改。

Ollama是什麼?
Ollama是一個用於在本地執行大型語言模型 (LLM) (稱為模型)的簡化工具。使用Ollama可以執行開源模型,例如:

  • Llama2
  • Mistral
  • codellama

除其他外。您可以在此處檢視型號列表。對於我們的示例,我們將使用Llama2模型。

什麼是Llama2?
Llama2是Meta的開源模型。該模型可以出於個人、研究或商業目的免費分發。

對於我們的示例,我們將建立一個 REST API 來使用Spring AI與Ollama進行互動。

讓我們來看看程式碼吧!
首先,我們在start.spring.io建立一個新專案。

我們的示例所需的唯一依賴項是Spring Web。

由於 Spring AI 仍然是一個實驗專案,它還沒有正式出現在Spring Initializr中,因此您需要在pom.xml中配置 SNAPSHOTS 儲存庫:

 <repositories>
  <repository>
   <id>spring-milestones</id>
   <name>Spring Milestones</name>
   <url>https://repo.spring.io/milestone</url>
   <snapshots>
    <enabled>false</enabled>
   </snapshots>
  </repository>
  <repository>
   <id>spring-snapshots</id>
   <name>Spring Snapshots</name>
   <url>https://repo.spring.io/snapshot</url>
   <releases>
    <enabled>false</enabled>
   </releases>
  </repository>
 </repositories>


接下來,我們將新增 Spring AI 依賴項,該依賴項具有與 Ollama 整合的 API。為此,請新增到pom.xml:

<dependency>
   <groupId>org.springframework.ai</groupId>
   <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
   <version>0.8.0</version>
</dependency>


由於我們將使用 Ollama,因此我們將在application.yml檔案中定義它:

spring:
  ai:
    ollama:
      chat:
        options:
          model: llama2


為了與 Ollama 整合,我們將使用ChatClient類,稱為call(Prompt prompt).讓我們建立一個注入ChatClient的 bean並使用以下方法:

@Component
public class ChatAiClient {

  private final ChatClient chatClient;

  public ChatAiClient(ChatClient chatClient) {
    this.chatClient = chatClient;
  }

  public String chat(String question) {
    var aiResponse = this.chatClient.call(new Prompt(question));
    var response = aiResponse.getResult().getOutput().getContent();

    return response;
  }
}


該方法chat將接收提示作為引數,傳遞給API並返回AI響應。

現在我們將建立controller並records透過 REST API 進行整合。首先讓我們分別建立 orequest和 o response:

record QuestionRequest(String question) {}

record Response(String response) {}


接下來我們將建立controller透過路徑響應的內容/ask:

@RestController
public class AskQuestionController {

  private final ChatAiClient chatClient;

  public AskQuestionController(ChatAiClient chatClient) {
    this.chatClient = chatClient;
  }

  @PostMapping("/ask")
  public Response ask(@RequestBody QuestionRequest questionRequest) {
    return new Response(chatClient.chat(questionRequest.question()));
  }
}


應用程式初始化後,您可以執行curl:

curl --location 'http://localhost:8080/ask' \ 
--header 'Content-Type: application/json' \ 
--data '{ 
    "question": "給我講個笑話嗎?" 
}'


測試時的響應如下:


  "response": "為什麼這本數學書很難過?因為它的問題太多了!" 
}

結論
對於Spring AI的Milestones版本,現在可以與市場上主要的人工智慧整合,並將此功能新增到您的系統、產品或專案中。這個專案將會發生很大的變化,就像人工智慧的發展一樣。

如果您想檢視完整的示例,只需訪問示例github 。

相關文章