Ollama в LangChain - интеграция с Python
краткое содержание
В этом документе описано, как использовать Оллама Интеграция с LangChain для создания мощных приложений ИИ. Ollama - это инструмент с открытым исходным кодом для развертывания больших языковых моделей, а LangChain - это фреймворк для создания приложений на основе языковых моделей. Объединив их, мы можем быстро развернуть и использовать передовые модели ИИ в локальной среде.
Примечание: Этот документ содержит основные фрагменты кода и подробные объяснения. Полный код можно найти вЭтот блокнот JupyterНайдено в.
1. настройки окружающей среды
Настройка среды Conda
Сначала нам нужно использовать среду Conda в Jupyter. Выполните следующую команду в командной строке:
conda create -n handlm python=3.10 -y
conda activate handlm
pip install jupyter
python -m ipykernel install --user --name=handlm
После выполнения перезапустите Jupyter и выберите ядро для этой среды, как показано на рисунке:

⚠️ Примечание
Внимание: Также можно использовать глобальное окружение напрямую, без виртуальной среды conda.
Установка зависимостей
Прежде чем приступить к работе, нам необходимо установить следующие пакеты:
langchain-ollama
: для интеграции модели Ollama во фреймворк LangChainlangchain
: основная библиотека LangChain, которая предоставляет инструменты и абстракции для создания приложений искусственного интеллекта.langchain-community
: Включает в себя различные интеграции и инструменты, созданные сообществом.Pillow
: для обработки изображений, которые используются в мультимодальных задачахfaiss-cpu
: для создания простых RAG ретривер
Его можно установить с помощью следующей команды:
pip install langchain-ollama langchain langchain-community Pillow faiss-cpu
2. Загрузите необходимые модели и инициализируйте OllamaLLM
Скачать модель llama3.1
- Перейдите на официальный сайт https://ollama.com/download, чтобы скачать и установить Ollama на доступные поддерживаемые платформы.
- Посетите сайт https://ollama.ai/library, чтобы узнать обо всех доступных моделях.
- пройти (законопроект, проверку и т.д.)
ollama pull <name-of-model>
команда для получения доступных моделей LLM (например:ollama pull llama3.1
).
Командная строка выполняется, как показано на рисунке:

Место хранения модели:
- Мак.
~/.ollama/models/
- Linux (или WSL).
/usr/share/ollama/.ollama/models
- Окна.
C:\Users\Administrator\.ollama\models
3. Примеры базового использования
Ведение беседы с помощью шаблона ChatPromptTemplate
ChatPromptTemplate позволяет создать многократно используемый шаблон с одним или несколькими параметрами. Эти параметры могут быть динамически заменены во время выполнения, чтобы генерировать различные подсказки.
template = """
你是一个乐于助人的AI,擅长于解决回答各种问题。
问题:{question}
"""
prompt = ChatPromptTemplate.from_template(template)
chain = prompt | model
chain.invoke({"question": "你比GPT4厉害吗?"})
В разделе "Создать цепочку" используйте оператор pipe |
Он соединяет подсказки с моделью, формируя поток обработки. Такая цепочка позволяет легко комбинировать и повторно использовать различные компоненты.
invoke
Метод запускает всю цепочку обработки, передавая наш вопрос в шаблон, а затем отправляя отформатированную подсказку в модель для обработки.
потоковый вывод
Потоковый вывод - это метод, который возвращает результаты постепенно, по мере того как генерируется длинный текст. У этого метода есть несколько важных преимуществ:
- Улучшенный пользовательский опыт: пользователи могут видеть частичные результаты сразу, а не ждать, пока завершится весь ответ.
- Сократите время ожидания: для длинных ответов пользователи могут начать чтение до того, как будет создан полный ответ.
- Взаимодействие в реальном времени: позволяет вмешаться или прервать процесс генерации.
На практике, особенно в чат-ботах или диалоговых системах реального времени, потоковый вывод практически необходим.
from langchain_ollama import ChatOllama
model = ChatOllama(model="llama3.1", temperature=0.7)
messages = [
("human", "你好呀"),
]
for chunk in model.stream(messages):
print(chunk.content, end='', flush=True)
model.stream()
Метод представляет собой обертку вокруг интерфейса потокового вывода Ollama API, который возвращает объект генератора. При вызове метода model.stream(messages)
После этого будут выполнены следующие операции:
- Отправьте запрос к API Ollama, чтобы начать генерировать ответ.
- API начинает генерировать текст, но вместо того, чтобы ждать, пока он будет сгенерирован полностью, он возвращает его небольшими фрагментами.
- Для каждого полученного небольшого фрагмента текста
stream()
метод выдает блок текста. flush=True
Убедитесь, что каждый клип отображается сразу, а не ждет, пока заполнится буфер.
Вызов инструмента
Вызовы инструментов - это способность модели ИИ взаимодействовать с внешними функциями или API. Это позволяет модели выполнять сложные задачи, такие как математические расчеты, запросы данных или вызовы внешних сервисов.
def simple_calculator(operation: str, x: float, y: float) -> float:
'''实际的代码处理逻辑'''
llm = ChatOllama(
model="llama3.1",
temperature=0,
).bind_tools([simple_calculator])
result = llm.invoke("你知道一千万乘二是多少吗?")
bind_tools
метод позволяет зарегистрировать в модели пользовательскую функцию. Таким образом, когда модель сталкивается с проблемой, которую необходимо вычислить, она может вызвать эту функцию, чтобы получить точные результаты, а не полагаться на свои знания, полученные в ходе предварительного обучения.
Эта возможность полезна, например, при создании сложных приложений искусственного интеллекта:
- Создание чат-ботов, способных получать доступ к данным в режиме реального времени
- Создавайте интеллектуальных помощников, выполняющих конкретные задачи (например, бронирование, запрос и т. д.).
- Разработка систем искусственного интеллекта, способных выполнять точные вычисления или сложные операции
мультимодальная модель
Ollama поддерживает мультимодальные модели, такие как bakllava и llava. Мультимодальные модели - это модели ИИ, способные обрабатывать несколько типов входных данных (например, текст, изображения, аудио и т. д.). Эти модели отлично понимают и генерируют кросс-модальный контент, обеспечивая более сложное и естественное взаимодействие человека и компьютера.
Сначала необходимо загрузить мультимодальную модель. Выполните ее в командной строке:
ollama pull llava

Мы можем использовать следующий код для обработки изображений и ввода текста:
from langchain_ollama import ChatOllama
from langchain_core.messages import HumanMessage
from langchain_core.output_parsers import StrOutputParser
llm = ChatOllama(model="llava", temperature=0)
def prompt_func(data):
'''构造多模态输入'''
chain = prompt_func | llm | StrOutputParser()
query_chain = chain.invoke(
{"text": "这个图片里是什么动物啊?", "image": image_b64}
)
Ключевым моментом здесь является следующее:
- Предварительная обработка изображения: нам нужно преобразовать изображение в строку в кодировке base64.
- Функция подсказки:
prompt_func
Создается мультимодальный вход, содержащий текст и изображения. - Цепочка: мы используем
|
оператор соединяет функцию подсказки, модель и выходной синтаксический анализатор.
Мультимодальные модели полезны во многих сценариях, например:
- Генерация описания изображения
- визуальная система вопросов и ответов
- Анализ и рекомендации по содержанию на основе изображений
4. Расширенное использование
Разговор с использованием ConversationChain
ConversationChain
это мощный инструмент, предоставляемый LangChain для управления многораундовыми диалогами. Он сочетает в себе языковые модели, шаблоны подсказок и компоненты in-memory, что упрощает создание диалоговых систем с учетом контекста.
memory = ConversationBufferMemory()
conversation = ConversationChain(
llm=model,
memory=memory,
verbose=True
)
# 进行对话
response = conversation.predict(input="你好,我想了解一下人工智能。")
print("AI:", response)
response = conversation.predict(input="能给我举个AI在日常生活中的应用例子吗?")
print("AI:", response)
response = conversation.predict(input="这听起来很有趣。AI在医疗领域有什么应用?")
print("AI:", response)
Ключевым компонентом здесь является:
ConversationBufferMemory
: Это простой компонент in-memory, который хранит историю всех предыдущих разговоров.ConversationChain
: Он объединяет языковую модель, память и шаблон диалоговой подсказки по умолчанию.
Ведение истории диалога очень важно, поскольку позволяет моделям:
- Понимание контекста и ранее упомянутой информации
- Генерируйте более последовательные и релевантные ответы
- Работа со сложными сценариями многораундового диалога
На практике вам может потребоваться использование более совершенных компонентов памяти, таких как ConversationSummaryMemory
чтобы обрабатывать длинные диалоги и не превышать лимит длины контекста модели.
Индивидуальные шаблоны подсказок
Хорошо продуманные шаблоны подсказок - ключ к созданию эффективных приложений искусственного интеллекта. В этом примере мы создали сложную подсказку для создания описаний товаров:
system_message = SystemMessage(content="""
你是一位经验丰富的电商文案撰写专家。你的任务是根据给定的产品信息创作吸引人的商品描述。
请确保你的描述简洁、有力,并且突出产品的核心优势。
""")
human_message_template = """
请为以下产品创作一段吸引人的商品描述:
产品类型: {product_type}
核心特性: {key_feature}
目标受众: {target_audience}
价格区间: {price_range}
品牌定位: {brand_positioning}
请提供以下三种不同风格的描述,每种大约50字:
1. 理性分析型
2. 情感诉求型
3. 故事化营销型
"""
# 示例使用
product_info = {
"product_type": "智能手表",
"key_feature": "心率监测和睡眠分析",
"target_audience": "注重健康的年轻专业人士",
"price_range": "中高端",
"brand_positioning": "科技与健康的完美结合"
}
При проектировании этой конструкции необходимо учитывать несколько важных моментов:
- system_prompt: определяет роль и общую задачу ИИ, задавая тон всему диалогу.
- human_message_template: обеспечивает структуру конкретных инструкций и необходимых сообщений.
- Многопараметрическая конструкция: позволяет гибко адаптироваться к различным продуктам и требованиям.
- Разнообразие требований к выходным данным: поощряйте модели демонстрировать свое разнообразие, требуя описания в разных стилях.
При разработке эффективного шаблона подсказки учитывайте следующее:
- Четко определите роль и миссию ИИ
- Обеспечьте четкий, структурированный формат ввода
- Содержит конкретные требования к выходу и указания по форматированию
- Рассмотрим, как максимально использовать потенциал и творческий потенциал модели
Построение простой системы вопросов и ответов RAG
RAG (Retrieval-Augmented Generation) - это метод искусственного интеллекта, который сочетает поиск и генерацию, чтобы расширить возможности языковой модели по поиску релевантной информации. Рабочий процесс системы RAG обычно включает следующие шаги:
- Разделение документов базы знаний на фрагменты и создание векторных индексов
- Векторизация проблемы пользователя и поиск соответствующих документов в индексе
- Предоставьте языковой модели найденные релевантные документы в качестве контекста вместе с исходным вопросом
- Языковая модель генерирует ответы на основе полученной информации
Преимущество RAG в том, что он помогает языковым моделям получить доступ к актуальной и специализированной информации, снижает разочарование и повышает точность и релевантность ответов.
LangChain предоставляет множество компонентов, которые могут быть легко интегрированы с моделями Ollama. Здесь мы покажем, как использовать модель Ollama в сочетании с векторным хранилищем и ретривером для создания простой системы вопросов и ответов RAG.
Прежде всего необходимо убедиться, что модель встраивания загружена, для чего в командной строке можно выполнить следующую команду:
ollama pull nomic-embed-text
Затем мы можем построить систему RAG:
# 初始化 Ollama 模型和嵌入
llm = ChatOllama(model="llama3.1")
embeddings = OllamaEmbeddings(model="nomic-embed-text")
# 准备文档
text = """
Datawhale 是一个专注于数据科学与 AI 领域的开源组织,汇集了众多领域院校和知名企业的优秀学习者,聚合了一群有开源精神和探索精神的团队成员。
Datawhale 以" for the learner,和学习者一起成长"为愿景,鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。
同时 Datawhale 用开源的理念去探索开源内容、开源学习和开源方案,赋能人才培养,助力人才成长,建立起人与人,人与知识,人与企业和人与未来的联结。
如果你想在Datawhale开源社区发起一个开源项目,请详细阅读Datawhale开源项目指南[https://github.com/datawhalechina/DOPMC/blob/main/GUIDE.md]
"""
# 分割文本
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20)
chunks = text_splitter.split_text(text)
# 创建向量存储
vectorstore = FAISS.from_texts(chunks, embeddings)
retriever = vectorstore.as_retriever()
# 创建提示模板
template = """只能使用下列内容回答问题:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
# 创建检索-问答链
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
)
# 使用链回答问题
question = "我想为datawhale贡献该怎么做?"
response = chain.invoke(question)
Система RAG работает следующим образом:
- Сегментация текста: использование
RecursiveCharacterTextSplitter
Разделите длинный текст на небольшие фрагменты. - Векторизация и индексация: использование
OllamaEmbeddings
Преобразует блок текста в вектор и создает векторный индекс с помощью FAISS. - Извлечение: при получении вопроса система векторизует его и извлекает наиболее релевантный блок текста из индекса FAISS.
- Генерация ответов: найденные релевантные фрагменты текста предоставляются языковой модели вместе с исходным вопросом для генерации окончательного ответа.
Например, система RAG очень полезна во многих реальных сценариях:
- Обслуживание клиентов: на запросы клиентов можно быстро ответить, опираясь на базу знаний компании.
- Помощь в исследованиях: помогает исследователям быстро найти необходимую литературу и обобщить ключевую информацию.
- Персональный помощник: объединяет личные заметки и веб-информацию, чтобы обеспечить индивидуальный поиск информации и предложений.
вынести вердикт
На этих примерах мы показываем, как использовать Ollama и LangChain для создания различных приложений ИИ, начиная от простых диалоговых систем и заканчивая сложными системами вопросов и ответов RAG. Эти инструменты и методы закладывают прочный фундамент для разработки мощных приложений ИИ.
Сочетание Ollama и LangChain обеспечивает разработчикам большую гибкость и возможности. Вы можете выбрать подходящие модели и компоненты в соответствии с вашими конкретными потребностями и построить систему искусственного интеллекта, соответствующую сценарию вашего приложения.
По мере развития технологий мы ожидаем появления новых инновационных приложений. Мы надеемся, что это руководство поможет вам начать свой путь в области разработки ИИ и вдохновит вас на творческий поиск безграничных возможностей технологии ИИ.
© заявление об авторских правах
Авторское право на статью Круг обмена ИИ Пожалуйста, не воспроизводите без разрешения.
Похожие статьи
Нет комментариев...