之前的文章中介紹了Obsidian配合Ollama的使用案例,那么它們是如何配合起來的呢?其實這個問題并不準確,問題的準確描述應該是Obsidian的Copilot插件是如何與Ollama大語言模型交互的。因為Obsidian在這里只是一個載體,核心功能還是Copilot插件與Ollama完成的。
從obsidian-copilot開始
在為Obsidian安裝Copilot插件時,發現Copilot插件是開源的。
打開源碼倉庫根目錄的 local_copilot.md 能看到Ollama相關的介紹。其中提到了Ollama server,猜測Copilot插件是通過REST API去和Ollama通信的。
進一步了解Ollama
Ollama的文檔里提到了一些信息
- Ollama提供了一系列的API
- Ollama啟動后默認偵聽127.0.0.1的11434端口來提供API服務
- Ollama server在運行時會產生日志,在MacOS的存放路徑是 ~/.ollama/logs/server.log
- 把環境變量 OLLAMA_DEBUG 設置為1可以啟用debug日志
啟用debug日志后重啟Ollama,在瀏覽器里輸入 http://127.0.0.1:11434 得到如下結果
在Ollama命令行提出一個問題(這里問它的名字),在日志里看到了相關的信息
說明Ollama命令行里的提問會調用/api/chat這個API。在Obsidian的Copilot Chat窗口里提問也會看到類似的日志。
交互過程
那么Obsidian的Copilot插件是如何調用Ollama server的API呢?在obsidian-copilot源代碼中沒有發現對/api/chat的直接調用,看起來封裝的比較深。通過分析源代碼推測調用的層次如下
- langchain/ollama 是langchain.js對Ollama的集成,是一個npm包
- Ollama JavaScript Library 是Ollama提供的對其API調用的JavaScript封裝
看得出調用關系還是比較清晰的。但這里再次引申出一個問題:為什么Obsidian Copilot插件不直接和Ollama server通信呢?為什么非得引入langchain來做這件事情呢?