这是深入了解 Ollama 和我所了解的有关本地法学硕士以及如何将它们用于基于推理的应用程序的第一部分。在这篇文章中,您将了解 -
要了解法学硕士(包括本地法学硕士)的基础知识,您可以在这里参考我之前关于此主题的文章。
在本地法学硕士领域,我第一次遇到了 LMStudio。虽然应用程序本身易于使用,但我喜欢 Ollama 提供的简单性和可操作性。要了解有关 Ollama 的更多信息,您可以访问此处。
tl;dr:Ollama 拥有自己精选的模型列表,您可以访问。
您可以将这些模型下载到本地计算机,然后通过命令行提示符与这些模型进行交互。或者,当您运行模型时,Ollama 还会运行托管在端口 11434(默认情况下)的推理服务器,您可以通过 API 和其他库(例如 Langchain)与其进行交互。
截至本文发布,Ollama 拥有 74 个模型,其中还包括嵌入模型等类别。
下载适用于您选择的操作系统的 Ollama。完成此操作后,运行命令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 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 附带了一些默认模型(例如llama2
,它是 Facebook 的开源 LLM),您可以通过运行看到它们。
ollama list
从Ollama 库页面中选择您想要与之交互的模型(假设为phi
)。您现在可以通过运行命令来拉取该模型
ollama pull phi
下载完成后,您可以通过运行以下命令来检查模型是否在本地可用:
ollama list
现在模型已经可用,可以运行了。您可以使用以下命令运行模型 -
ollama run phi
答案的准确性并不总是一流的,但您可以通过选择不同的模型或自行进行一些微调或实施类似 RAG 的解决方案来解决这个问题,以提高准确性。
我上面演示的是如何使用命令行提示符来使用 Ollama 模型。但是,如果您检查 Llama 运行的推理服务器,您会发现可以通过编程方式通过端口 11434 来访问它。
如果您想使用 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 中的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 注册表。为了实现这一点,您需要
创建本地 llm 后,您可以使用以下命令将其推送到 ollama 注册表:
ollama push arjunrao87/financellm
🦄 现在,让我们进入精彩的部分。
在我寻求使用 Ollama 的过程中,更令人愉快的发现之一是我遇到的这个基于 Python 的 Web 应用程序构建器生态系统。 Chainlit可用于构建成熟的聊天机器人,如 ChatGPT。正如他们的页面所说,
Chainlit 是一个开源 Python 包,用于构建生产就绪的对话式 AI
我浏览了一些 Chainlit 教程,以了解可以使用 chainlit 执行哪些操作,其中包括创建任务序列(称为“步骤”)、启用按钮和操作、发送图像以及各种操作。您可以 在这里关注我的这部分旅程。
一旦我掌握了 Chainlit 的窍门,我就想组合一个简单的聊天机器人,基本上使用 Ollama,这样我就可以使用本地的 LLM 来聊天(而不是说 ChatGPT 或 Claude)。
使用 Chainlit + Ollama 仅需不到 50 行代码即可完成此操作。这不是很疯狂吗?
Chainlit 作为一个库,使用起来非常简单。我还使用 Langchain 来与 Ollama 进行交互。
from langchain_community.llms import Ollama from langchain.prompts import ChatPromptTemplate import chainlit as cl
下一步是使用 chainlit 的@cl.on_chat_start
装饰器来定义聊天机器人的加载屏幕的外观 -
@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 是一个名为Runnable
的 Langchain 接口,用于创建自定义链。您可以在这里阅读更多相关内容。
@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 并接受用户输入的所有条件。您如何处理用户提供的提示?您将使用 Chainlit 的@cl.on_message
处理程序对用户提供的消息执行某些操作。
@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
正如文档建议的那样“流回异步响应块”,这正是我们的机器人想要的。
确实如此。一些导入,一些功能,一点点糖,你就拥有了一个功能齐全的聊天机器人。
完整代码可以看我的GitHub 。
如果您对此内容感兴趣,请点击👏按钮或在此处订阅我的时事通讯 → https://a1engineering.beehiiv.com/subscribe 。它给了我反馈,告诉我我需要做或多或少的事情!谢谢❤️
也发布在这里