今天咱们来聊聊 AI 界的重要事情——那些像 Llama3 系列这样的超大型语言模型(LLMs),现在居然可以在咱们自己的地盘上运行啦!想象一下,这就像是把一个超级智能的助手请进了家门,而且还是私密的,不用担心信息泄露的问题。
本文,虽然是基于之前 Llama3的版本实验的,但相信 Llama3.1 也是适用的。
现在就是要带大家一探究竟,看看为我们要把这些大家伙弄到本地来,还有怎么用 GPT4ALL 和 Ollama 这样的工具来搞定它们。我们不仅要聊聊怎么把这些模型服务起来,还要看看怎么把它们嵌入到我们的开发环境里,最后,用它们来开发一些超酷的 AI 应用。
别以为这些模型只能当个聊天机器人,我们可以用它们来提升工作效率,甚至一起搞些大项目。这就像是给自己的工作和生活加了个智能加速器,让一切变得更高效、更有趣。我们这就出发,看看这趟 AI 之旅能带咱们飞多高吧!
为什么在本地运行 Llama 3?
听起来本地运行 Llama 3 这样的大型语言模型(LLMs)确实有点让人望而生畏,尤其是考虑到它对 RAM、GPU 和处理能力的需求。但别担心,随着技术的进步,这些障碍正在逐渐被克服。那我们为啥要在本地运行大模型呢?
首先,不间断访问意味着你可以随时使用模型,不用担心网络问题或者服务中断,这就像是拥有了一个随时待命的智能助手。
然后是提高性能,响应速度快,几乎没有延迟,即使是在中等配置的笔记本电脑上,也能享受到飞快的 token 生成速度,这简直就像是给思考装上了涡轮增压器。
安全性方面,增强安全性让你可以完全控制输入数据,保护你的隐私,就像是给你的数据穿上了防弹衣。
成本上,降低成本意味着你不需要支付昂贵的 API 访问费用或订阅费,Llama 3 可以免费使用,这就像是找到了一个不用花钱的宝藏。
自定义和灵活性让你可以调整模型的各种设置,就像是给你的智能助手装上了可调节的翅膀,让它更符合你的需求。
而且,离线功能意味着一旦下载了模型,你就可以随时随地使用它,不受网络限制,这就像是拥有了一本随身携带的百科全书。
最后,所有权意味着你对模型、数据和输出拥有完全的控制权,就像是你拥有了一片私人领地,你可以自由地探索和利用。
所以,虽然一开始可能会觉得有点难度,但一旦你掌握了这些工具和技术,本地运行 Llama 3 将会给你带来前所未有的便利和自由。这就像是开启了一扇通往新世界的大门,让我们一起探索吧!
接下来,我们就采用 GPT4ALL 和 Ollama 工具来搞定吧。
使用 GPT4ALL 运行 Llama 3
GPT4ALL 这玩意儿听起来就像是个魔法盒子,能让我们在自己的电脑上玩转那些听起来高大上的语言模型,而且连 GPU 都不用,简直是技术小白的福音啊!
我们将从访问官方下载页面开始,在 Windows 上下载并安装 GPT4ALL。
安装应用程序后,启动它并点击"Download”按钮以打开模型菜单。我们可以滚动并选择“Llama 3 Instruct”模型,然后点击“Download”下载吧。
下载完成后,关闭标签页,并通过点击“Choose a model...”下拉菜单选择 Llama 3 Instruct 模型。
输入提示并开始像使用 ChatGPT 一样使用它。系统已安装 CUDA 工具包,因此它可以使用 GPU 来生成更快的响应。
使用 Ollama 运行 Llama 3
现在,让我们尝试通过下载并安装 Ollama 来使用 Llama 3 的最简单方法。
Ollama 这玩意儿,简直就是个本地语言模型的超级英雄,功能多得不得了,而且速度快得飞起。
来,咱们这么搞定它:
安装 Ollama:首先,得把 Ollama 这玩意儿请到你的电脑上来,安装过程应该挺简单,就像装个新游戏一样。
打开终端或 PowerShell:这玩意儿就像是跟电脑对话的窗口,告诉它你想干啥。
输入命令:接下来,得输入点命令,告诉 Ollama 你要开始用了。这个命令就像是你跟服务员说“来份炒饭”一样,哈哈。
用 Ollama 的时候,你可能会遇到各种命令,这些命令就像是菜单上的不同选项,想用啥功能就点啥命令。
安装好后,在终端运行一下,让它跑起来吧。
ollama run llama3
注意:在终端内下载模型文件并启动聊天机器人需要几分钟。
写下提示或开始提问,Ollama 将在您的终端内生成响应,聊天响应非常快速。现在经济形势不好,大家是不是都怕裁员?来让它教教 HR 怎么可以比较礼貌的写一份 layoffs 吧,哈哈。
要退出聊天机器人,只需输入/bye,是不是非常简单?
在本地提供 Llama 3
运行本地服务器,可以让你将 Llama 3 集成到其他应用程序中,并构建自己的应用程序以完成特定任务。通过在终端中输入以下命令来启动本地模型推理服务器:
ollama serve
要检查服务器是否正常运行,请转到系统托盘,找到 Ollama 图标,右键单击以查看日志。
它将带您进入 Ollama 文件夹,在那里您可以打开server.log文件以查看有关 API 请求和时间戳的服务器信息。
使用 CURL 访问 API
您可以简单地使用 CURL 命令访问推理服务器。只需提供模型名称和提示,并确保关闭流以获取完整消息。
curl http://localhost:11434/api/chat -d '{
"model": "llama3",
"messages": [
{ "role": "user", "content": "What are God Particles?" }
],
"stream": false
}'
CURL 命令是 Linux 的原生命令,但您也可以在 Windows PowerShell 中使用,如下所示。
使用 Python 包访问 API
如果你是想用 Python 来搞点 AI 驱动的应用程序和工具啊,就可以使用 PIP 安装 Ollama Python 包来访问推理服务器。
pip install ollama
Python 访问 API,就像是给你的代码开了个超级权限,让你能直接跟 AI 大脑对话。
只需提供ollama.chat函数与模型名称和消息,它将生成响应。
注意:在消息参数中,您还可以添加系统提示和助手提示以添加上下文。
import ollama
response = ollama.chat(
model="llama3",
messages=[
{
"role": "user",
"content": "Tell me an interesting fact about elephants",
},
],
)
print(response["message"]["content"])
Ollama Python 包还提供异步调用和流式传输等功能,这有助于有效管理 API 请求并提高模型的感知速度。
类似于 OpenAI API,我们可以创建一个异步聊天函数,然后使用异步函数编写流式代码,允许与模型进行高效快速的交互。
import asyncio
from ollama import AsyncClient
async def chat():
"""
使用AsyncClient从Llama流式传输聊天。
"""
message = {
"role": "user",
"content": "Tell me an interesting fact about elephants"
}
async for part in await AsyncClient().chat(
model="llama3", messages=[message], stream=True
):
print(part["message"]["content"], end="", flush=True)
asyncio.run(chat())
没错,你会看到下面那样,模型会显示生成的 token。
当然,我们也可以用 Python 来玩转 API,创建自定义模型,听起来就像是在用乐高积木搭建自己的 AI 玩具城堡。咱们简单聊聊这事儿:
创建自定义模型:首先,你可以用 Python 来定义自己的模型,这就像是设计乐高城堡的蓝图。你可以决定模型的结构,比如它有多少层,每层有多少神经元。
文本转换为嵌入:接下来,你可以把文本转换成嵌入(embeddings),这就像是给每个乐高积木块上色,让它们有独特的属性和特征。
错误处理:在构建过程中,难免会遇到一些错误,比如模型训练不顺利,或者 API 调用出错。这时候,就需要用 Python 来写一些错误处理的代码,确保你的 AI 城堡不会因为一块积木没搭好就塌了。
模型的复制、删除、拉取和推送:这就像是管理你的乐高积木收藏。你可以复制模型来备份,删除不需要的模型来节省空间,拉取新的模型来扩展你的城堡,或者推送你的模型到云端,让其他人也能使用。
用 Python API 来操作这些,代码大概长这样:
# 导入需要的库
from my_api import MyAPI
# 创建API实例
api = MyAPI(api_key='你的API密钥')
# 创建自定义模型
model = api.create_model('我的模型', layers=5, neurons=128)
# 将文本转换为嵌入
embeddings = model.convert_text_to_embedding('你好,世界!')
# 错误处理
try:
# 尝试一些可能会出错的操作
result = api.some_risky_operation()
except Exception as e:
print(f"出错了:{e}")
# 复制模型
copied_model = api.copy_model(model_id='模型的唯一ID')
# 删除模型
api.delete_model(model_id='模型的唯一ID')
# 拉取模型
pulled_model = api.pull_model(model_id='模型的唯一ID')
# 推送模型
api.push_model(model)
这就像是有了一把万能钥匙,可以解锁 AI 世界的大门。
在 VSCode 中集成 Llama 3
接下来,来个更有趣的,我们直接把 Ollama 和 Llama 3 模型集成到 VSCode 里,让编码体验更上一层楼了!这就像是给你的编程工具箱里加了一把瑞士军刀,啥功能都有。咱们来一步步看看怎么操作:
启动 Ollama 推理服务器:首先,得让 Ollama 的推理服务器跑起来。这就像是启动你的编程助手,让它随时待命。在终端里输入ollama serve,然后回车,服务器就开始工作了。
安装 CodeGPT 扩展:接下来,打开 VSCode,去扩展商店搜索“CodeGPT”,找到它就安装。这个扩展就像是给你的 VSCode 开了个外挂,让它能连接到 Ollama 这样的模型提供者。
设置 CodeGPT:安装完 CodeGPT 后,点击 VSCode 左侧的 CodeGPT 图标,开始设置。在设置里,把模型提供者选为Ollama,然后挑llama3:8b这个模型。因为咱们是本地运行,所以不需要 API 密钥。
生成代码:设置好后,就可以用 CodeGPT 来生成代码了。比如你想写 Python 代码,就给 CodeGPT 一个提示,然后点击“插入代码”,嗖的一下,代码就到你的 Python 文件里了。如果需要改进,再给 CodeGPT 发指令就行。
使用 CodeGPT 的其他功能:除了生成代码,CodeGPT 还能帮你理解代码、重构代码、写文档、生成单元测试和解决问题。这就像是你的个人编程导师,随时准备帮你提升代码质量。
整个流程就像是在跟一个智能助手合作,它能帮你提高效率,减少重复劳动。
在本地开发 AI 应用程序
好嘞,咱们要搞的这个 AI 应用听起来就像是个智能阅读器,不过它不仅能读,还能分析和理解书籍内容,甚至能回答你的问题。咱们来捋一捋这个项目:
读取文件:首先,咱们得从一个文件夹里读取 docx 文件。这些文件就像是我们的原料,需要被 AI 应用读取和处理。
转换为嵌入向量:接下来,AI 会把文本内容转换成嵌入向量。这就像是给书籍内容做个 DNA 分析,提取出它们的独特特征。
存储到向量数据库:这些嵌入向量会被存储到一个向量数据库中。你可以把这想象成一个高级的图书馆,书籍被整理得井井有条,方便我们随时查找。
相似性搜索:当用户提出问题时,AI 应用会用相似性搜索来找到最相关的书籍内容。这就像是在图书馆里快速找到最相关的参考资料。
提供上下文答案:最后,AI 应用会根据搜索结果,给出一个上下文相关的详细答案。这就像是有个智能助手,不仅能回答问题,还能提供背景信息和深入分析。
开发这样一个应用,我们来看看如何做吧。
设置
首先,我们将安装所有必要的 Python 包,用于加载文档、向量存储和 LLM 框架。
pip install unstructured[docx] langchain langchainhub langchain_community langchain-chroma
然后,启动 Ollama 推理服务器。
ollama serve
加载文档
在创建应用程序之前,在 Jupyter Notebook 中开发和测试您的代码是一个最佳实践。
我们将使用DirectoryLoader从文件夹中加载所有的 docx 文件。
from langchain_community.document_loaders import DirectoryLoader
loader = DirectoryLoader("./Books", glob="**/*.docx")
books = loader.load()
len(books)
分割文本
将整本书喂给模型是不可行的,因为这将超出其上下文窗口的限制。为了克服这个限制,我们必须将文本分成更小、更易于管理的块,这些块可以舒适地适应模型的上下文窗口。
下面,我们将所有四本书转换为 500 个字符的块大小。
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
all_splits = text_splitter.split_documents(books)
Ollama 嵌入和 Chroma 向量数据库
我们将使用 Langchain 将文本转换为嵌入向量,并存储在 Chroma 数据库中。
我们使用 Ollama Llama 3 模型作为嵌入模型。
from langchain_chroma import Chroma
from langchain_community.embeddings import OllamaEmbeddings
vectorstore = Chroma.from_documents(
documents=all_splits,
embedding=OllamaEmbeddings(model="llama3", show_progress=True),
persist_directory="./chroma_db",
)
OllamaEmbeddings: 100%|██████████| 23/23 [01:00<00:00, 2.63s/it]
让我们通过执行一些相似性搜索来测试我们的向量数据库。
question = "Who is Zahra?"
docs = vectorstore.similarity_search(question)
docs
我们得到了四个与问题相似的结果。
构建 Langchain 链用于问答检索系统
咱们如果要搭建智能问答助手呢?不用担心,它背后可是有一整套高科技的链条在支撑,我们将使用 Langchain 链并开始添加模块。咱们一步步来搭建这个系统:
使用向量数据库作为检索器:首先,得用向量数据库来检索信息。这就像是你有个超级大脑,里面存储了无数的信息,而且能快速找出最相关的那部分。
格式化结果:检索到的信息得整理一下,让它看起来更清晰、更易于理解。这就像是把找到的资料整理成笔记,方便查阅。
提供 RAG 提示:接下来,得用到 RAG(Retrieval-Augmented Generation)提示。这个提示就像是给智能助手的一个提示卡,让它知道怎么结合检索到的信息来生成回答。你可以在 Langchain Hub 上找到这个提示。
Ollama Llama 3 推理函数:然后,得用到 Ollama 的 Llama 3 模型来进行推理。这就像是让智能助手根据提示和检索到的信息来思考和生成答案。
解析结果:最后,得把智能助手生成的回答解析一下,只展示最关键的部分。这就像是把长篇大论精简成要点,让人一目了然。
具体实现的时候,可能需要写一些代码来连接各个模块,让它们协同工作。比如,你可能需要用到 Python 的langchain库来构建这个链条,简单来说,在通过 Llama 3 模型之前,您的问题将通过相似性搜索和 RAG 提示提供上下文。
from langchain import hub
from langchain_community.llms import Ollama
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
llm = Ollama(model="llama3")
retriever = vectorstore.as_retriever()
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
rag_prompt = hub.pull("rlm/rag-prompt")
qa_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| rag_prompt
| llm
| StrOutputParser()
)
测试问答检索链
我们现在就来询问有关书籍的相关问题,以了解更多关于故事的信息。
question = "What is the story of the 'Gené is Missing' book?"
qa_chain.invoke(question)
正如我们所看到的,使用书籍作为上下文提供了准确的响应。
'Based on the provided context, "Gené is Missing" appears to be a mystery novel that revolves around uncovering the truth about Gené\'s life and potential involvement in murders. The story follows different perspectives, including Simon trying to prove his innocence, flashbacks of Gené\'s past, and detective Jacob investigating the case.'
现在让我们问一个关于角色的问题。
question = "Who is Arslan?"
qa_chain.invoke(question)
生成了一个精确的答案。
'Arslan is Zahra\'s brother\'s best friend. He is someone that Zahra visits in the book "A Boy with Honest Dreams" by Abid Ali Awan to gather information about Ali.'
构建 AI 应用程序
为了构建一个在您的终端中无缝运行的完整 AI 应用程序,我们将把前几节中的所有代码合并到一个 Python 文件中。
code AI_app.py
此外,我们将增强代码以启用交互式查询,允许您反复向应用程序提问,直到您通过键入'exit'明确终止会话。
from langchain_chroma import Chroma
from langchain_community.embeddings import OllamaEmbeddings
from langchain import hub
from langchain_community.llms import Ollama
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
# 加载向量数据库
vectorstore = Chroma(persist_directory="./chroma_db", embedding_function=OllamaEmbeddings(model="llama3"))
# 加载Llama3模型
llm = Ollama(model="llama3")
# 使用向量数据库作为检索器
retriever = vectorstore.as_retriever()
# 格式化文档
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
# 从langchain hub加载问答链
rag_prompt = hub.pull("rlm/rag-prompt")
# 创建问答链
qa_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| rag_prompt
| llm
| StrOutputParser()
)
# 在循环中运行问答链,直到用户键入"exit"
while True:
question = input("问题:")
if question.lower() == "exit":
break
answer = qa_chain.invoke(question)
print(f"\n答案:{answer}\n")
通过在终端中写入Python和文件名来运行应用程序。
python AI_app.py
这很酷啊,我们用几行代码在本地创建了自己的 RAG AI 应用程序。
感谢吧
最后,咱们得好好聊聊 AI 开源社区这帮牛人,没有他们咱们哪能在自己电脑上跑 Llama 3,搞自己的应用程序啊。这帮家伙真是拼了命,就为了让 AI 变得大家都能用。
这样一来,咱们不仅能保护自己的数据,不用怕泄露啥的,还能省下一大笔 API 调用费或者订阅费。你要是也想加入这个大家庭,就贡献点代码,或者帮忙宣传,再不行捐点钱也是好的。
咱们这个文章里,知道了怎么在笔记本上用 Llama 3,还有怎么把推理服务器搞到 VSCode 里去。
最后,咱们用 Langchain、Chroma 和 Ollama 搭了个问答系统,这玩意儿牛,数据全在自己电脑上,一分钱不用花。而且,用这些工具,你还能搞出更复杂的系统来。
总之,开源社区这帮人真是太棒了,他们让 AI 技术变得触手可及。你要是也想出份力,就收藏、点赞并关注我的微信公众号吧,感谢啦!