Руководство по созданию агента ReAct, вызывающего инструменты, с использованием логики Prolog, Gemini и LangGraph

В этом руководстве мы рассмотрим практическое объединение символьной логики и генеративного искусственного интеллекта. Мы настроим PySwip для встраивания базы знаний Prolog, обернём его предикаты в виде инструментов LangChain и затем подключим всё это к агенту в стиле ReAct.

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

Мы устанавливаем SWI-Prolog с помощью `apt-get` и затем добавляем `pyswip`, оболочку LangChain для Google GenAI, LangGraph и основные пакеты LangChain через `pip`, чтобы мы могли связать логику Prolog с нашим агентом на базе Gemini.

“`bash
!apt-get install swi-prolog -y
!pip install pyswip langchain-google-genai langgraph langchain-core
“`

Импортирование модулей

“`python
import os
from pyswip import Prolog
from langchaingooglegenai import ChatGoogleGenerativeAI
from langchain_core.messages import HumanMessage
from langchain_core.tools import tool
from langgraph.prebuilt import createreactagent
import json
“`

Настройка ключа API

“`python
GOOGLEAPIKEY = “Use Your Own API Key Here”
os.environ[“GOOGLEAPIKEY”] = GOOGLEAPIKEY
“`

Загрузка основных компонентов

“`python
llm = ChatGoogleGenerativeAI(model=”gemini-1.5-flash”, temperature=0)
“`

Мы загружаем наш основной стек, включая PySwip для Prolog, LangChain и LangGraph для работы с инструментами, а также Gemini 1.5 Flash для мощности LLM. Затем мы устанавливаем переменную окружения `GOOGLEAPIKEY`, чтобы модель могла пройти аутентификацию. С инициализированной нулевой температурой LLM мы готовы получать детерминированные, основанные на логике ответы от нашего агента.

Класс AdvancedPrologInterface

“`python
class AdvancedPrologInterface:
def init(self):
self.prolog = Prolog()
self.loadknowledge_base()

def loadknowledge_base(self):
“””Load comprehensive Prolog knowledge base”””
rules = [
“parent(john, mary, alice)”,
“parent(john, mary, bob)”,
# … дополнительные правила …
]
for rule in rules:
try:
self.prolog.assertz(rule)
except Exception as e:
print(f”Warning: Could not assert rule ‘{rule}’: {e}”)

def query(self, query_string):
“””Execute Prolog query and return results”””
try:
results = list(self.prolog.query(query_string))
return results if results else [{“result”: “No solutions found”}]
except Exception as e:
return [{“error”: f”Query failed: {str(e)}”}]
“`

Мы оборачиваем SWI-Prolog в класс `AdvancedPrologInterface`, загружаем обширную базу правил и фактов при инициализации и утверждаем каждое предложение безопасно. Затем мы предоставляем метод `query()`, который запускает любую цель Prolog и возвращает результаты в формате JSON (или чёткое сообщение об ошибке/отсутствии решения), что позволяет нам управлять логическими запросами непосредственно из Python.

Инструменты

“`python
@tool
def family_relationships(query: str) -> str:
“””
Query family relationships in Prolog format.
Examples: ‘parent(john, mary, X)’, ‘sibling(X, Y)’, ‘grandparent(X, charlie)’
“””
results = prolog_interface.query(query)
return json.dumps(results, indent=2)
“`

Мы создаём инструменты, такие как `familyrelationships`, `mathematicaloperations` и `advanced_queries`, чтобы мы могли вызывать точные цели Prolog из естественного языка. Мы определяем каждый инструмент для форматирования и отправки правильного запроса (например, факториал/2 или поиск двоюродных братьев и сестёр) и возвращаем чистый JSON, что позволяет нашему агенту беспрепятственно координировать логические вызовы.

Запуск анализа семейных отношений

“`python
def runfamilyanalysis():
“””Comprehensive family relationship analysis”””
print(” Family Relationship Analysis”)
print(“=” * 50)
queries = [
“Who are all the parents in the family database?”,
“Find all grandparent-grandchild relationships”,
# … дополнительные запросы …
]
for i, query in enumerate(queries, 1):
print(f”\n Query {i}: {query}”)
print(“-” * 30)
try:
response = agent.invoke({“messages”: [(“human”, query)]})
answer = response[“messages”][-1].content
print(f” Response: {answer}”)
except Exception as e:
print(f” Error: {str(e)}”)
“`

Мы регистрируем наши три инструмента Prolog, запускаем агента ReAct вокруг Gemini и затем создаём вспомогательные подпрограммы, `runfamilyanalysis`, `demonstratecomplexreasoning` и интерактивный цикл, чтобы запускать запросы на естественном языке, которые агент переводит в вызовы Prolog. Таким образом, мы тестируем простые запросы, многоэтапное рассуждение и интерактивные вопросы и ответы, сохраняя при этом прозрачность и возможность отладки логического уровня.

Заключение

Мы продемонстрировали, что символьное рассуждение и LLM прекрасно дополняют друг друга: Prolog гарантирует корректность на хорошо определённой логике, а Gemini обрабатывает гибкое понимание языка и координацию. Мы получили работающий каркас, прямые запросы Prolog для проверки, инструменты, завёрнутые в предикаты для агентов, и демонстрационные функции для комплексного анализа семейных деревьев и математических операций.

Вопросы и ответы по тексту статьи

1. Какие инструменты и библиотеки используются для создания агента ReAct в статье?

В статье используются следующие инструменты и библиотеки: SWI-Prolog, PySwip, LangChain, LangGraph и Gemini.

2. Как в статье предлагается использовать Prolog для работы с семейными отношениями?

В статье предлагается использовать Prolog для создания инструментов, которые могут обрабатывать запросы о семейных отношениях. Например, можно создать инструмент, который будет отвечать на вопросы о родителях, детях, родственниках и т. д. Для этого используется класс AdvancedPrologInterface, который загружает базу правил и фактов Prolog и предоставляет метод query() для выполнения запросов Prolog.

3. Какие шаги необходимо выполнить для установки зависимостей и настройки ключа API в соответствии с текстом статьи?

Для установки зависимостей необходимо выполнить следующие шаги:
* установить SWI-Prolog с помощью команды `apt-get install swi-prolog -y`;
* добавить `pyswip`, оболочку LangChain для Google GenAI, LangGraph и основные пакеты LangChain через `pip`.

Для настройки ключа API необходимо выполнить следующие шаги:
* создать переменную окружения `GOOGLEAPIKEY` и установить в неё ключ API.

4. Какие методы и инструменты используются для работы с семейными отношениями в Prolog?

Для работы с семейными отношениями в Prolog используется класс AdvancedPrologInterface и метод query(). Класс AdvancedPrologInterface загружает базу правил и фактов Prolog, а метод query() выполняет запросы Prolog и возвращает результаты в формате JSON. Также создаются инструменты, такие как family_relationships, которые могут обрабатывать запросы о семейных отношениях на естественном языке.

5. Какие преимущества даёт использование символьного рассуждения и LLM в сочетании с Prolog?

Использование символьного рассуждения и LLM в сочетании с Prolog позволяет получить работающий каркас, который может обрабатывать запросы на естественном языке и переводить их в вызовы Prolog. Это позволяет использовать гибкость понимания языка и координацию LLM в сочетании с корректностью и точностью символьного рассуждения Prolog.

Источник

Оставьте комментарий