macOS Monterey实战:用Ollama运行本地大模型并与LangChain集成

云信安装大师
90
AI 质量分
11 5 月, 2025
5 分钟阅读
0 阅读

macOS Monterey实战:用Ollama运行本地大模型并与LangChain集成

引言

在人工智能领域,大型语言模型(LLM)正在改变我们与计算机交互的方式。本文将指导你在macOS Monterey上使用Ollama运行本地大模型,并将其与LangChain框架集成,打造强大的本地AI应用。

准备工作

系统要求

  • macOS Monterey (12.0+) 或更高版本
  • Apple Silicon (M1/M2) 或 Intel处理器
  • 至少16GB内存(推荐32GB+以运行更大的模型)
  • Python 3.8+ 环境

工具安装

首先确保你的系统已安装以下工具:

代码片段
# 检查Homebrew是否安装
brew --version || /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 安装Python和pip
brew install python

# 验证Python版本
python3 --version
pip3 --version

第一部分:安装和配置Ollama

1. 安装Ollama

Ollama是一个简化在本地运行大型语言模型的工具。

代码片段
# 使用curl安装Ollama
curl -fsSL https://ollama.ai/install.sh | sh

# 验证安装是否成功
ollama --version

2. 下载并运行模型

Ollama支持多种开源模型,我们先从较小的模型开始:

代码片段
# 下载llama2模型(7B参数版本)
ollama pull llama2:7b

# 运行模型进行测试(按Ctrl+D退出)
ollama run llama2:7b

经验分享:首次运行时可能需要较长时间下载模型文件,大小约4GB。建议在网络稳定的环境下进行。

3. Ollama常用命令

代码片段
# 查看已下载的模型列表
ollama list

# 删除不需要的模型(谨慎操作)
ollama rm <model-name>

# 启动一个模型的API服务(默认端口11434)
ollama serve &

第二部分:LangChain集成

1. Python环境准备

创建一个虚拟环境并安装必要依赖:

代码片段
# 创建虚拟环境
python3 -m venv ollama-env
source ollama-env/bin/activate

# 安装LangChain和相关库
pip install langchain openai requests flask flask-cors uvicorn fastapi sse-starlette httpx pydantic typing-extensions numpy tiktoken pymongo sqlalchemy psycopg2-binary unstructured python-multipart aiohttp pandas matplotlib scipy scikit-learn sentence-transformers transformers torch torchvision torchaudio faiss-cpu chromadb tqdm ipywidgets ipython jupyterlab pyarrow pyyaml jinja2 markdown bs4 lxml beautifulsoup4 pdfminer.six pdfplumber pypdf pypdfium2 docx2txt python-docx docx openpyxl xlrd xlwt xlsxwriter tabulate pandasql duckdb sqlparse spacy nltk gensim networkx pygraphviz plotly seaborn altair bokeh holoviews datashader panel streamlit gradio dash dash-bootstrap-components dash-core-components dash-html-components dash-table dash-daq dash-renderer dash-auth dash-cytoscape jupyter-dash jupyter-bokeh voila nbconvert nbformat traitlets ipykernel ipyparallel ipywidgets widgetsnbextension jupyter-packaging jupyterlab-pygments jupyterlab-widgets notebook voila-gridstack voila-material voila-vuetify voila-xterm voila-gridstack voila-material voila-vuetify voila-xterm panel-highcharts panel-plotly panel-matplotlib panel-bokeh panel-holoviews panel-seaborn panel-altair panel-streamlit panel-dash panel-gradio panel-jupyterlite panel-jupyterlab panel-notebook panel-terminal panel-xterm 

注意:上述命令安装了LangChain生态系统可能需要的所有依赖。实际使用时可以根据需要精简。

2. LangChain基础集成示例

创建一个Python脚本ollama_langchain.py

代码片段
from langchain_community.llms import Ollama
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# 初始化Ollama LLM实例(确保ollama serve正在运行)
llm = Ollama(
    model="llama2:7b", 
    base_url="http://localhost:11434",
    temperature=0.7,   # 控制创造性,0-1之间,越高越有创造性但可能偏离事实

    # Ollama特有参数(可选)
    top_p=0.9,         # Nucleus采样参数,控制生成多样性

    # LangChain通用参数(可选)
    verbose=True       # 显示详细执行过程

)

# LangChain提示模板示例(比直接字符串拼接更结构化)
prompt = PromptTemplate(
    input_variables=["topic"],
    template="""
    你是一位知识渊博的{subject}专家。请用简洁易懂的方式解释以下概念:
    概念:{topic}

    要求:
    1.不超过200字的中文解释 
    2.提供一个实际例子 
    3.列出相关知识点

    你的回答:
    """
)

# LLM链式调用示例 - LangChain的核心概念之一!
chain = LLMChain(llm=llm, prompt=prompt)

if __name__ == "__main__":
    while True:
        user_input = input("\n请输入你想了解的概念(输入q退出): ")
        if user_input.lower() == 'q':
            break

        response = chain.run(
            subject="计算机科学",
            topic=user_input,
            stop=["\n\n"]   # Ollama支持的停止条件

        )

        print("\nAI回答:")
        print(response)

        # LangChain内置的输出解析器示例(可选) 
        from langchain.schema import OutputParserException

        try:
            parsed = response.split("\n")
            print("\n解析后的回答:")
            for i, line in enumerate(parsed[:5], start=1):
                print(f"{i}. {line.strip()}")

        except OutputParserException as e:
            print(f"解析错误: {e}")

3. LangChain高级功能示例

创建一个更复杂的脚本advanced_integration.py

“`python
import os
from langchaincommunity.documentloaders import TextLoader, PyPDFLoader, WebBaseLoader, CSVLoader, UnstructuredFileLoader, DirectoryLoader, NotebookLoader, UnstructuredMarkdownLoader, UnstructuredWordDocumentLoader, UnstructuredPowerPointLoader, UnstructuredExcelLoader, UnstructuredEmailLoader, UnstructuredHTMLLoader, UnstructuredODTLoader, UnstructuredEPubLoader, UnstructuredImageLoader, UnstructuredRTFLoader
from langchain.textsplitter import RecursiveCharacterTextSplitter
from langchain
community.vectorstores import Chroma
from langchain_community.embeddings import OllamaEmbeddings
from langchain.chains import RetrievalQA
from langchain.memory import ConversationBufferMemory

class LocalAIAssistant:
def init(self):
self.setup_environment()

代码片段
def setup_environment(self):
    """配置LangChain与Ollama集成环境"""
    self.model_name = "llama2:7b"

    # Ollama LLM实例化 - LangChain的适配器模式使我们可以轻松切换不同后端LLM服务!
    self.llm = OllAMA(
        model=self.model_name,
        base_url="http://localhost:11434",
        temperature=0.5,

        # LangChain特有的回调配置(可选)
        callbacks=[self.get_callback_handler()]

    )

    # Ollama嵌入向量 - RAG应用的核心组件之一!
    self.embeddings = OllAMAEmbeddings(
        model=self.model_name,
        base_url="http://localhost:11434"

    )

    # LangChain记忆组件 - ChatGPT式对话体验的基础!
    self.memory = ConversationBufferMemory(
        memory_key="chat_history",
        return_messages=True

    )

def get_callback_handler(self):
    """自定义回调处理器"""
    from langchain.callbacks.base import BaseCallbackHandler

    class CustomCallbackHandler(BaseCallbackHandler):
        def on_llm_start(self, serialized: dict, prompts: list[str], **kwargs) -> None:
            print(f"\n=== LLM开始处理 {len(prompts)}个提示 ===")

        def on_llm_new_token(self, token: str, **kwargs) -> None:
            print(token.replace('\n', '\\n'), end='', flush=True)

        def on_llm_end(self, response: Any, **kwargs) -> None:
            print("\n=== LLM处理完成 ===")

        def on_error(self, error: Exception | KeyboardInterrupt | Any,
                    **kwargs) -> None:
            print(f"\n处理出错: {error}")

    return CustomCallbackHandler()

def load_documents(self):
    """文档加载和预处理"""

    文档加载器选择建议:
    1.PDF → PyPDFLoader / PDFPlumberLoader / PDFMinerLoader  
    2.HTML → WebBaseLoader / BeautifulSoupHTMLLoader  
    3.Markdown → UnstructuredMarkdownLoader  
    4.Word → UnstructuredWordDocumentLoader  
    5.PPT → UnstructuredPowerPointLoader  
    6.TXT → TextLoader  
    7.CSV → CSVLoader

    高级技巧:
    1.DirectoryLoader可以批量加载整个文件夹的文件!
    2.Notebook支持.ipynb文件解析!
    3.Unified API尝试自动检测文件类型!

    示例代码:

loader = DirectoryLoader(
“./data”, #文档目录路径

代码片段
glob="**/*.*",             #文件匹配模式

loader_cls=UnstructuredFileLoader,

show_progress=True,

)

documents = loader.load()

文本分割器配置原则:
1.chunksize控制每个文本块的大小(通常512-2048个token)
2.chunk
overlap控制块间重叠(通常10%-20% chunk_size)

textsplitter = RecursiveCharacterTextSplitter(
chunk
size=1000,
chunk_overlap=200,

separators=[“\n\n”, “\n”, ” “, “”],

length_function=len,

isseparatorregex=False,

)

splitdocs = textsplitter.split_documents(documents)

return split_docs

def buildknowledgebase(self):

“””构建向量知识库”””

docs = self.load_documents()

vectorstore = Chroma.from_documents(

documents=docs,

embedding=self.embeddings,

persistdirectory=”./chromadb”

)

return vectorstore

def createconversationalagent(self):

“””创建对话式AI代理”””

vectorstore = self.buildknowledgebase()

retriever = vectorstore.as_retriever(

search_type=”mmr”, #最大边际相关性搜索平衡相关性和多样性!

search_kwargs={“k”:5} #返回前5个最相关文档!

)

qachain = RetrievalQA.fromchain_type(

llm=self.llm,

memory=self.memory,

retriever=retriever,

verbose=True,

returnsourcedocuments=True,

output_key=’answer’,

input_key=’question’,

includeruninfo=True,

)

return qa_chain

def interactive_chat(self):

“””交互式聊天界面”””

agent = self.createconversationalagent()

print(“本地AI助手已启动!输入’quit’退出”)

while True:

user_input = input(“\n用户提问 >> “)

if user_input.lower() in [‘quit’,’exit’,’q’]:

break

result = agent({“question”:user_input})

print(“\nAI回答:”,result[‘answer’])

if ‘source_documents’ in result:

print(“\n—参考来源—“)

for i,d in enumerate(result[‘source_documents’][:3],start=1):

print(f”{i}. {d.metadata.get(‘source’,’未知’)}”)

print(“…”*30 + “\n”)

if name == “main“:

assistant = LocalAIAssistant()

assistant.interactive_chat()

第三部分:优化与调试

1.OLLAMA性能优化

对于Apple Silicon(M1/M2)芯片,启用Metal加速:

“`bash

export OLLAMANOCUDA=1 #禁用CUDA(如果同时安装了NVIDIA驱动)

export OLLAMANOMETAL=0 #显式启用Metal加速(默认已开启)

ollamarestart

监控GPU使用情况:

“`bash

sudo powermetrics–samplers gpu_power-i1000–show-process-energy

内存优化技巧:

1.Llava等视觉模型需要更多显存→尝试减小batchsize!

2.OLLAMA_FLASHATTN=1可启用FlashAttention优化!

3.–numctx参数控制上下文长度(默认为2048)

2.LangChain调试技巧

启用详细日志记录:

“`python

import logging

logging.basicConfig()

logging.getLogger(“langchain”).setLevel(logging.DEBUG)

使用回调函数追踪执行流程:

“`python

fromlang chain.callbacks.tracersimportConsoleCallbackHandler

withConsoleCallbackHandler():

agent.run(“你的问题”)

常见错误解决:

1.”Connectionrefused”→确保ollamaserve正在运行!

2.”Modelnotfound”→检查拼写或用ollamalist确认可用模型!

3.”CUDAoutofmemory”→尝试更小模型或减少batchsize!

4.”TimeoutError”→增加超时时间或检查网络连接!

5.”InvalidURL”→确认base_url格式为http://localhost:11434

第四部分:生产部署建议

Docker容器化部署(OLLAMA+Lang Chain API)

创建Dockerfile:

“`dockerfile

FROMubuntu:22.04

RUNapt-getupdate&&apt-getinstall-y\

curl\

python3-pip\

&&rm-rf/var/lib/apt/lists/*

RUNcurl-fsSLhttps://oll ama.ai/install.sh|sh

WORKDIR/app

COPYrequirements.txt.

RUNpipinstall-rrequirements.txt

COPY..

CMD[“sh”,”-c”,”ollamaserve&uvicornmain:app–host0.0 .0 .0–port8000″]

构建并运行:

“`bash

dockerbuild-tlocalai.

dockerrun-p11434 :11434-p8000 :8000localai

FastAPI示例(main.py):

“`python

fromfastapiimportFastAPI

frompydanticimportBaseModel

app=FastAPI()

classQuery(BaseModel):

text :str

@app.post(“/ask”)

asyncdefask(query :Query):

response=await ll m.apredict(query.text)

return{“answer”:response}

总结

关键点回顾:

✅在macOS上成功部署了本地大语言模型(OLLAMA)

✅掌握了Lang Chain核心概念和组件用法

✅实现了基于文档的问答系统(RAG架构)

✅学习了性能优化和生产部署技巧

进阶方向:

🔹尝试更大规模的Ll a ma270B或Mixtral8x7B等混合专家(MoE)模型

🔹集成语音输入输出打造全功能AI助手

🔹开发基于Streamlit/Gradio的Web界面

🔹探索Lang Chain Agents实现自动化工作流

原创 高质量