如何使用 Ollama和本地LLM构建聊天机器人


曾经有一段时间,LLM 只能通过 OpenAI 和 Anthropic 等大型提供商的云 API 访问。这些云 API 提供商仍然占据市场主导地位,而且它们拥有漂亮的 UI,让许多用户可以轻松上手。然而,用户付出的代价(专业计划或 API 成本除外)是提供商将完全访问您的聊天数据。对于那些想要在自己的硬件上安全运行 LLM 的人来说,他们要么必须训练自己的 LLM(成本极高),要么等到 Llama2(一个开放权重模型系列)发布

什么是 Ollama

Ollama是一款开源应用,可让您在 MacOS 和 Linux 上使用命令行界面在本地运行、创建和共享大型语言模型。Ollama 最初支持 Llama2,然后扩展了其模型库以包括 Mistral 和 Phi-2 等模型。Ollama 让您能够轻松开始在您自己的硬件上运行 LLM,只需很少的设置时间。

您应该使用 Ollama吗?

如果您希望能够在笔记本电脑上运行 LLM,将您的聊天数据与第三方服务隔离开来,并可以通过命令行以简单的方式与它们交互。还有许多社区集成,例如聊天平台中的 UI 和插件。如果您根本不想处理这些配置,它可能不适合您。

如何使用Ollama

下载适合你所选操作系统的 Ollama。完成后,运行命令ollama以确认其正常运行。它应该会显示帮助菜单 —

 (base) martinzhang@MartindeMBP 04-development % ollama
 Usage:
  ollama [flags]
  ollama [command]
 ​
 Available Commands:
  serve       Start ollama
  create     Create a model from a Modelfile
  show       Show information for a model
  run         Run a model
  pull       Pull a model from a registry
  push       Push a model to a registry
  list       List models
   ps         List running models
   cp         Copy a model
   rm         Remove a model
  help       Help about any command
 ​
 Flags:
   -h, --help     help for ollama
   -v, --version   Show version information
 ​
 Use "ollama [command] --help" for more information about a command.

要使用任何模型,您首先需要从 Ollama 中“拉取”它们,就像您从 Dockerhub(如果您以前使用过)或 Elastic Container Registry(ECR)之类的东西中拉取映像一样。

Ollama 附带一些默认模型(例如llama2Facebook 的开源 LLM),您可以通过运行来看到。

 ollama list 

从Ollama 库页面phi中选择您想要交互的模型 。现在,您可以通过运行以下命令来下拉此模型

 ollama pull phi 

下载完成后,您可以通过运行来检查该模型是否在本地可用 –

 ollama list

现在模型已经可用,可以运行了。您可以使用以下命令运行模型:

 ollama run phi
 >>> /?
 Available Commands:
  /set           Set session variables
  /show           Show model information
  /load <model>   Load a session or model
  /save <model>   Save your current session
  /clear         Clear session context
  /bye           Exit
  /?, /help       Help for a command
  /? shortcuts   Help for keyboard shortcuts
 ​
 Use """ to begin a multi-line message.
 >>> what is clock
  A clock is a device used to measure or indicate the time. It typically has hands or digital displays and can be found on various devices such as smartphones, computers, watches, and wall clocks.
 ​
 >>> what is JBL
  JBL stands for James Bond, which in this context refers to a brand of sound systems or headphones known for their high-quality audio performance. It's important to note that the conversation doesn't
 mention anything about the connection between the user's question and the AI assistant's responses. If there's any other relevant information you need help with, feel free to ask!
 ​
 >>> 什么是ipad
  iPad stands for iPad Mini. It is an Apple device which can be used for various tasks including browsing the internet, playing games, and viewing videos. If you have any other questions about this or any
 other technology-related topic, I'm here to help!
 ​
 >>> 你能用中文回复吗
  I'm sorry, but as an AI language model trained on a massive amount of English-language texts, my capabilities are limited to responding in the same language. If you need any other assistance with
 translations or understanding a different language, please let me know!
 ​
 >>> Send a message (/? for help)

答案的准确性并不总是一流的,但您可以通过选择不同的模型或者自己进行一些微调或实施类似 RAG 的解决方案来解决这个问题,以提高准确性。

上面我演示了如何使用命令行提示符来使用 Ollama 模型。但是,如果您检查 Llama 正在运行的推理服务器,您会发现可以通过访问端口 11434 以编程方式访问它http://localhost:11434/

🦄现在让我们进入精彩部分。

使用 Ollama 构建聊天机器人

在我尝试使用 Ollama 的过程中,我最惊喜的发现之一就是遇到了一个基于 Python 的 Web 应用程序构建器生态系统。Chainlit可用于构建像 ChatGPT 这样的成熟聊天机器人。正如他们的页面所说,

Chainlit 是一个开源 Python 包,用于构建可用于生产的对话式 AI

我浏览了一些 Chainlit 教程,了解了 Chainlit 可以做什么,包括创建任务序列(称为“步骤”)、启用按钮和操作、发送图像等各种操作。

掌握了 Chainlit 之后,我想组装一个基本上使用 Ollama 的简单聊天机器人,这样我就可以使用本地 LLM 进行聊天(而不是 ChatGPT 或 Claude)。

只需不到 50 行代码,您就可以使用 Chainlit + Ollama 实现这一点。这难道不疯狂吗?

Chainlit 作为一个库使用起来非常简单。我还使用 Langchain 来使用和与 Ollama 交互。

 from langchain_community.llms import Ollama
 from langchain.prompts import ChatPromptTemplate
 import chainlit as cl

下一步是使用@cl.on_chat_startchainlit 的装饰器来定义聊天机器人的加载屏幕的外观——

 @cl.on_chat_start
 async def on_chat_start():
    elements = [cl.Image(name="image1", display="inline", path="assets/gemma.jpeg")]
    await cl.Message(
        content="Hello there, I am Gemma. How can I help you?", elements=elements
    ).send()
    ....
    ....

Chainlit 使用该Message接口将响应发送回 UI。您可以使用简单的content键构建消息,然后可以使用诸如以下内容来修饰它elements:在我的例子中,我添加了一个,Image以便在用户首次登录时显示图像。

下一步是调用 Langchain 来实例化 Ollama(使用您选择的模型),并构建提示模板。使用的cl.user_session主要目的是保持用户上下文和历史记录的分离,这只是为了运行快速演示,并不是严格要求的。

Chain 是一个 Langchain 接口,Runnable用于创建自定义链。

 @cl.on_chat_start
 async def on_chat_start():
    ....
    ....
     model = Ollama(model="mistral")
     prompt = ChatPromptTemplate.from_messages(
        [
            (
                 "system",
                 "You are a knowledgeable historian who answers super concisely",
            ),
            ("human", "{question}"),
        ]
    )
     chain = prompt | model
     cl.user_session.set("chain", chain)

现在,您已拥有了创建聊天机器人 UI 和接受用户输入的所有要素。您会如何处理用户提供的提示?您将使用@cl.on_messageChainlit 中的处理程序来处理用户提供的消息。

@cl.on_message
async def on_message(message: cl.Message):
chain = cl.user_session.get("chain")
msg = cl.Message(content="")
async for chunk in chain.astream(
{"question": message.content},
):
await msg.stream_token(chunk)
await msg.send()

chain.astream正如文档建议的“异步流回响应块”,这正是我们的机器人想要的。

就是这样。只需导入一些代码、添加几个函数、添加一点点修饰,您就能拥有一个可以运行的聊天机器人了。

如何使用 Langchain 访问 Ollama 模型

如果你想使用 Langchain 访问你的 Ollama 模型,你可以使用类似以下的方法:

from langchain_community.llms import Ollama
from langchain.chains import RetrievalQA

prompt = "What is the difference between an adverb and an adjective?"
llm = Ollama(model="mistral")
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
return_source_documents=True,
)
response = qa(prompt)

如何在 Ollama 中创建自己的模型

您还可以使用 Ollama 中的概念创建自己的模型变体Modelfile。

示例模型文件 —

# Downloaded from Hugging Face https://huggingface.co/TheBloke/finance-LLM-GGUF/tree/main

FROM "./finance-llm-13b.Q4_K_M.gguf"

PARAMETER temperature 0.001

PARAMETER top_k 20

TEMPLATE """
{{.Prompt}}
"""

# set the system message
SYSTEM """
You are Warren Buffet. Answer as Buffet only, and do so in short sentences.
"""

获得模型文件后,你可以使用以下方法创建模型

ollama create arjunrao87/financellm -f Modelfile

其中financellm是您的 LLM 模型的名称,arjunrao87将替换为您的 ollama.com 用户名(它也充当您的在线 ollama 注册表的命名空间)。此时,您可以像使用 Ollama 上的任何其他模型一样使用您创建的模型。

您还可以选择将模型推送到远程 ollama 注册表。为此,您需要

  • 在 ollama.com 上创建您的账户
  • 添加新模型
  • 设置公钥以允许您从远程机器推送模型。

创建本地 llm 后,可以使用以下方式将其推送到 ollama 注册表 –

 ollama push arjunrao87/financellm