В этом руководстве мы создадим полностью локальную систему создания историй без использования API, применяя Griptape и лёгкую модель Hugging Face. Мы рассмотрим создание агента с возможностью использования инструментов, генерацию вымышленного мира, разработку персонажей и организацию многоэтапного рабочего процесса, который создаёт связный короткий рассказ.
Разделив реализацию на модульные фрагменты, мы сможем чётко понять каждый компонент, когда он объединится в единый творческий конвейер.
Установка окружения
Для начала установим Griptape и инициализируем локальный драйвер Hugging Face:
«`
!pip install -q «griptape[drivers-prompt-huggingface-pipeline]» «transformers» «accelerate» «sentencepiece»
«`
«`
import textwrap
from griptape.structures import Workflow, Agent
from griptape.tasks import PromptTask
from griptape.tools import CalculatorTool
from griptape.rules import Rule, Ruleset
from griptape.drivers.prompt.huggingface_pipeline import HuggingFacePipelinePromptDriver
«`
«`
local_driver = HuggingFacePipelinePromptDriver(
model=»TinyLlama/TinyLlama-1.1B-Chat-v1.0″,
max_tokens=256,
)
«`
Мы настроили вспомогательную функцию для наглядного отображения выходных данных, что позволит нам следить за каждым шагом рабочего процесса.
Создание агента
Создадим агента, оснащённого калькулятором, и протестируем его с помощью простого математического запроса:
«`
math_agent = Agent(
promptdriver=localdriver,
tools=[CalculatorTool()],
)
«`
«`
mathresponse = mathagent.run(
«Compute (37*19)/7 and explain the steps briefly.»
)
«`
«`
show(«Agent + CalculatorTool», math_response.output.value)
«`
Генерация мира и персонажей
Создадим задачу по генерации мира и динамически сконструируем задачи по созданию персонажей, зависящие от выходных данных мира:
«`
world_task = PromptTask(
input=»Create a vivid fictional world using these cues: {{ args[0] }}.\nDescribe geography, culture, and conflicts in 3–5 paragraphs.»,
id=»world»,
promptdriver=localdriver,
)
«`
«`
def charactertask(taskid, name):
return PromptTask(
input=(
«Based on the world below, invent a detailed character named {{ name }}.\n»
«World description:\n{{ parent_outputs[‘world’] }}\n\n»
«Describe their background, desires, flaws, and one secret.»
),
id=task_id,
parent_ids=[«world»],
promptdriver=localdriver,
context={«name»: name},
)
«`
«`
scottytask = charactertask(«scotty», «Scotty»)
annietask = charactertask(«annie», «Annie»)
«`
Стилистические правила и финальная задача по созданию истории
Введём стилистические правила и создадим финальную задачу по написанию рассказа, объединяющую мир и персонажей в связное повествование:
«`
style_ruleset = Ruleset(
name=»StoryStyle»,
rules=[
Rule(«Write in a cinematic, emotionally engaging style.»),
Rule(«Avoid explicit gore or graphic violence.»),
Rule(«Keep the story between 400 and 700 words.»),
],
)
«`
«`
story_task = PromptTask(
input=(
«Write a complete short story using the following elements.\n\n»
«World:\n{{ parent_outputs[‘world’] }}\n\n»
«Character 1 (Scotty):\n{{ parent_outputs[‘scotty’] }}\n\n»
«Character 2 (Annie):\n{{ parent_outputs[‘annie’] }}\n\n»
«The story must have a clear beginning, middle, and end, with a meaningful character decision near the climax.»
),
id=»story»,
parent_ids=[«world», «scotty», «annie»],
promptdriver=localdriver,
rulesets=[style_ruleset],
)
«`
«`
storyworkflow = Workflow(tasks=[worldtask, scottytask, annietask, story_task])
topic = «tidally locked ocean world with floating cities powered by storms»
story_workflow.run(topic)
«`
Мы получим все сгенерированные выходные данные и отобразим мир, персонажей и финальный рассказ. Также вычислим простые метрики для оценки структуры и длины, что даст нам быстрый аналитический обзор.
В заключение мы продемонстрируем, как легко можно организовать сложные шаги рассуждения, взаимодействие инструментов и творческое генерирование с помощью локальных моделей в рамках Griptape. Мы увидим, как модульные задачи, наборы правил и рабочие процессы объединяются в мощную агентскую систему, способную создавать структурированные повествовательные выходные данные.
1. Какие инструменты и библиотеки используются для создания локальной системы создания историй?
В статье описывается использование Griptape и лёгкой модели Hugging Face для создания локальной системы создания историй. Также упоминаются библиотеки `transformers`, `accelerate` и `sentencepiece`, которые устанавливаются с помощью команды `!pip install -q «griptape[drivers-prompt-huggingface-pipeline]» «transformers» «accelerate» «sentencepiece»`.
2. Как в системе создаётся агент и какие задачи он может выполнять?
В статье описывается создание агента с возможностью использования инструментов. Для этого используется класс `Agent` из библиотеки Griptape, который оснащается калькулятором (`CalculatorTool`). Агент тестируется с помощью простого математического запроса.
3. Какие шаги включает в себя генерация мира и персонажей в системе?
В статье описывается генерация мира с помощью задачи `PromptTask`, которая создаёт описание мира на основе заданных подсказок. Затем динамически конструируются задачи по созданию персонажей, зависящие от выходных данных мира. Для этого используется функция `character_task`, которая создаёт задачи по созданию персонажей на основе описания мира.
4. Какие стилистические правила и финальная задача используются для создания истории?
В статье описывается создание стилистических правил с помощью класса `Ruleset` из библиотеки Griptape. Затем создаётся финальная задача по написанию рассказа, объединяющая мир и персонажей в связное повествование. Для этого используется задача `PromptTask`, которая создаёт рассказ на основе описания мира, персонажа Скотти и персонажа Энни.
5. Какие выходные данные можно получить в результате работы системы?
В статье описывается, что в результате работы системы можно получить описание мира, персонажей и финальный рассказ. Также можно вычислить простые метрики для оценки структуры и длины, что даст быстрый аналитический обзор.