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 и выберите ядро для этой среды, как показано на рисунке:

Ollama 在 LangChain 中的使用 - Python 集成

⚠️ Примечание

Внимание: Также можно использовать глобальное окружение напрямую, без виртуальной среды conda.

Установка зависимостей

Прежде чем приступить к работе, нам необходимо установить следующие пакеты:

  • langchain-ollama: для интеграции модели Ollama во фреймворк LangChain
  • langchain: основная библиотека LangChain, которая предоставляет инструменты и абстракции для создания приложений искусственного интеллекта.
  • langchain-community: Включает в себя различные интеграции и инструменты, созданные сообществом.
  • Pillow: для обработки изображений, которые используются в мультимодальных задачах
  • faiss-cpu: для создания простых RAG ретривер

Его можно установить с помощью следующей команды:

pip install langchain-ollama langchain langchain-community Pillow faiss-cpu

 

2. Загрузите необходимые модели и инициализируйте OllamaLLM

Скачать модель llama3.1

  1. Перейдите на официальный сайт https://ollama.com/download, чтобы скачать и установить Ollama на доступные поддерживаемые платформы.
  2. Посетите сайт https://ollama.ai/library, чтобы узнать обо всех доступных моделях.
  3. пройти (законопроект, проверку и т.д.) ollama pull <name-of-model> команда для получения доступных моделей LLM (например:ollama pull llama3.1).

Командная строка выполняется, как показано на рисунке:

Ollama 在 LangChain 中的使用 - Python 集成

Место хранения модели:

  • Мак. ~/.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 Метод запускает всю цепочку обработки, передавая наш вопрос в шаблон, а затем отправляя отформатированную подсказку в модель для обработки.

потоковый вывод

Потоковый вывод - это метод, который возвращает результаты постепенно, по мере того как генерируется длинный текст. У этого метода есть несколько важных преимуществ:

  1. Улучшенный пользовательский опыт: пользователи могут видеть частичные результаты сразу, а не ждать, пока завершится весь ответ.
  2. Сократите время ожидания: для длинных ответов пользователи могут начать чтение до того, как будет создан полный ответ.
  3. Взаимодействие в реальном времени: позволяет вмешаться или прервать процесс генерации.

На практике, особенно в чат-ботах или диалоговых системах реального времени, потоковый вывод практически необходим.

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
Ollama 在 LangChain 中的使用 - Python 集成

Мы можем использовать следующий код для обработки изображений и ввода текста:

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}
)

Ключевым моментом здесь является следующее:

  1. Предварительная обработка изображения: нам нужно преобразовать изображение в строку в кодировке base64.
  2. Функция подсказки:prompt_func Создается мультимодальный вход, содержащий текст и изображения.
  3. Цепочка: мы используем | оператор соединяет функцию подсказки, модель и выходной синтаксический анализатор.

Мультимодальные модели полезны во многих сценариях, например:

  • Генерация описания изображения
  • визуальная система вопросов и ответов
  • Анализ и рекомендации по содержанию на основе изображений

 

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)

Ключевым компонентом здесь является:

  1. ConversationBufferMemory: Это простой компонент in-memory, который хранит историю всех предыдущих разговоров.
  2. 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": "科技与健康的完美结合"
}

При проектировании этой конструкции необходимо учитывать несколько важных моментов:

  1. system_prompt: определяет роль и общую задачу ИИ, задавая тон всему диалогу.
  2. human_message_template: обеспечивает структуру конкретных инструкций и необходимых сообщений.
  3. Многопараметрическая конструкция: позволяет гибко адаптироваться к различным продуктам и требованиям.
  4. Разнообразие требований к выходным данным: поощряйте модели демонстрировать свое разнообразие, требуя описания в разных стилях.

При разработке эффективного шаблона подсказки учитывайте следующее:

  • Четко определите роль и миссию ИИ
  • Обеспечьте четкий, структурированный формат ввода
  • Содержит конкретные требования к выходу и указания по форматированию
  • Рассмотрим, как максимально использовать потенциал и творческий потенциал модели

Построение простой системы вопросов и ответов RAG

RAG (Retrieval-Augmented Generation) - это метод искусственного интеллекта, который сочетает поиск и генерацию, чтобы расширить возможности языковой модели по поиску релевантной информации. Рабочий процесс системы RAG обычно включает следующие шаги:

  1. Разделение документов базы знаний на фрагменты и создание векторных индексов
  2. Векторизация проблемы пользователя и поиск соответствующих документов в индексе
  3. Предоставьте языковой модели найденные релевантные документы в качестве контекста вместе с исходным вопросом
  4. Языковая модель генерирует ответы на основе полученной информации

Преимущество 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 работает следующим образом:

  1. Сегментация текста: использование RecursiveCharacterTextSplitter Разделите длинный текст на небольшие фрагменты.
  2. Векторизация и индексация: использование OllamaEmbeddings Преобразует блок текста в вектор и создает векторный индекс с помощью FAISS.
  3. Извлечение: при получении вопроса система векторизует его и извлекает наиболее релевантный блок текста из индекса FAISS.
  4. Генерация ответов: найденные релевантные фрагменты текста предоставляются языковой модели вместе с исходным вопросом для генерации окончательного ответа.

Например, система RAG очень полезна во многих реальных сценариях:

  • Обслуживание клиентов: на запросы клиентов можно быстро ответить, опираясь на базу знаний компании.
  • Помощь в исследованиях: помогает исследователям быстро найти необходимую литературу и обобщить ключевую информацию.
  • Персональный помощник: объединяет личные заметки и веб-информацию, чтобы обеспечить индивидуальный поиск информации и предложений.

 

вынести вердикт

На этих примерах мы показываем, как использовать Ollama и LangChain для создания различных приложений ИИ, начиная от простых диалоговых систем и заканчивая сложными системами вопросов и ответов RAG. Эти инструменты и методы закладывают прочный фундамент для разработки мощных приложений ИИ.

Сочетание Ollama и LangChain обеспечивает разработчикам большую гибкость и возможности. Вы можете выбрать подходящие модели и компоненты в соответствии с вашими конкретными потребностями и построить систему искусственного интеллекта, соответствующую сценарию вашего приложения.

По мере развития технологий мы ожидаем появления новых инновационных приложений. Мы надеемся, что это руководство поможет вам начать свой путь в области разработки ИИ и вдохновит вас на творческий поиск безграничных возможностей технологии ИИ.

© заявление об авторских правах

Похожие статьи

Нет комментариев

Вы должны войти в систему, чтобы участвовать в комментариях!
Войти сейчас
нет
Нет комментариев...