В этом руководстве мы создадим продвинутую систему агентского ИИ, используя модели LangGraph и OpenAI, выходя за рамки простых циклов планировщика и исполнителя. Мы реализуем адаптивную аргументацию, где агент динамически выбирает между быстрым и глубоким рассуждением; граф агентской памяти в стиле Zettelkasten, который хранит атомарные знания и автоматически связывает связанные опыты; и управляемый механизм использования инструментов, который обеспечивает соблюдение ограничений во время выполнения.
Установка среды выполнения
Мы устанавливаем все необходимые библиотеки и импортируем основные модули:
- LangGraph для оркестрации;
- LangChain для абстракций моделей и инструментов;
- Поддерживающие библиотеки для графов памяти и числовых операций.
Загрузка ключа API
«`python
if not os.environ.get(«OPENAIAPIKEY»):
os.environ[«OPENAIAPIKEY»] = getpass.getpass(«Enter OPENAIAPIKEY: «)
«`
Инициализация языковых моделей
«`python
MODEL = os.environ.get(«OPENAI_MODEL», «gpt-4o-mini»)
EMBMODEL = os.environ.get(«OPENAIEMBED_MODEL», «text-embedding-3-small»)
llm_fast = ChatOpenAI(model=MODEL, temperature=0)
llm_deep = ChatOpenAI(model=MODEL, temperature=0)
llm_reflect = ChatOpenAI(model=MODEL, temperature=0)
emb = OpenAIEmbeddings(model=EMB_MODEL)
«`
Класс Note
«`python
class Note(BaseModel):
note_id: str
title: str
content: str
tags: List[str] = Field(default_factory=list)
createdatunix: float
context: Dict[str, Any] = Field(default_factory=dict)
«`
Класс MemoryGraph
«`python
class MemoryGraph:
def init(self):
self.g = nx.Graph()
self.note_vectors = {}
def _cos(self, a, b):
return float(np.dot(a, b) / ((np.linalg.norm(a) + 1e-9) * (np.linalg.norm(b) + 1e-9)))
def add_note(self, note, vec):
self.g.addnode(note.noteid, note.model_dump())
self.notevectors[note.noteid] = vec
def topk_related(self, vec, k=5):
scored = [(nid, self.cos(vec, v)) for nid, v in self.notevectors.items()]
scored.sort(key=lambda x: x[1], reverse=True)
return [{«note_id»: n, «score»: s, «title»: self.g.nodes[n][«title»]} for n, s in scored[:k]]
def link_note(self, a, b, w, r):
if a != b:
self.g.add_edge(a, b, weight=w, reason=r)
def evolve_links(self, nid, vec):
for r in self.topk_related(vec, 8):
if r[«score»] >= 0.78:
self.linknote(nid, r[«noteid»], r[«score»], «evolve»)
MEM = MemoryGraph()
«`
Инструменты
«`python
@tool
def web_get(url: str) -> str:
import urllib.request
with urllib.request.urlopen(url, timeout=15) as r:
return r.read(25000).decode(«utf-8″, errors=»ignore»)
@tool
def memory_search(query: str, k: int = 5) -> str:
qv = np.array(emb.embed_query(query))
hits = MEM.topk_related(qv, k)
return json.dumps(hits, ensure_ascii=False)
@tool
def memoryneighbors(noteid: str) -> str:
if note_id not in MEM.g:
return «[]»
return json.dumps([
{«noteid»: n, «weight»: MEM.g[noteid][n][«weight»]}
for n in MEM.g.neighbors(note_id)
])
TOOLS = [webget, memorysearch, memory_neighbors]
TOOLSBYNAME = {t.name: t for t in TOOLS}
«`
Формализация внутренних представлений агента
«`python
class DeliberationDecision(BaseModel):
mode: Literal[«fast», «deep»]
reason: str
suggested_steps: List[str]
class RunSpec(BaseModel):
goal: str
constraints: List[str]
deliverable_format: str
mustusememory: bool
maxtoolcalls: int
class Reflection(BaseModel):
note_title: str
note_tags: List[str]
new_rules: List[str]
what_worked: List[str]
what_failed: List[str]
class AgentState(TypedDict, total=False):
run_spec: Dict[str, Any]
messages: Annotated[List[AnyMessage], operator.add]
decision: Dict[str, Any]
final: str
budgetcallsremaining: int
toolcallsused: int
maxtoolcalls: int
lastnoteid: str
«`
Заключение
Мы показали, как агент может непрерывно улучшать своё поведение через рефлексию и память, а не полагаясь на статические подсказки или жёстко заданную логику. Мы использовали LangGraph для оркестрации аргументации, выполнения, управления инструментами и рефлексии как связного графа, в то время как модели OpenAI обеспечивают возможности рассуждения и синтеза на каждом этапе. Этот подход проиллюстрировал, как агентские системы ИИ могут приблизиться к автономии, адаптируя глубину своего рассуждения, повторно используя предыдущие знания и кодируя уроки в виде постоянной памяти, формируя практическую основу для создания масштабируемых, самосовершенствующихся агентов в реальных приложениях.
Вопросы по тексту статьи:
1. Какие инструменты и библиотеки используются для создания продвинутой системы агентского ИИ в статье?
Ответ:
В статье используются следующие инструменты и библиотеки: LangGraph для оркестрации, LangChain для абстракций моделей и инструментов, поддерживающие библиотеки для графов памяти и числовых операций, а также модели OpenAI для обеспечения возможностей рассуждения и синтеза.
2. Как в статье описывается механизм адаптивной аргументации в агентском ИИ?
Ответ:
В статье описывается механизм адаптивной аргументации, где агент динамически выбирает между быстрым и глубоким рассуждением. Это позволяет агенту адаптироваться к различным ситуациям и оптимизировать процесс принятия решений.
3. Какие классы и структуры данных используются для реализации графов памяти в статье?
Ответ:
В статье используются классы Note и MemoryGraph для реализации графов памяти. Класс Note представляет собой атомарное знание с идентификатором, заголовком, содержанием, тегами и другими атрибутами. Класс MemoryGraph управляет графом памяти, добавляя заметки, связывая их и эволюционируя связи между ними.
4. Какие инструменты представлены в статье для работы с внешними данными и памятью?
Ответ:
В статье представлены следующие инструменты: webget для получения данных из интернета, memorysearch для поиска заметок в памяти, и memory_neighbors для получения соседей заметки в графе памяти. Эти инструменты позволяют агенту взаимодействовать с внешними данными и использовать память для принятия решений.
5. Как в статье описывается процесс формализации внутренних представлений агента?
Ответ:
В статье описывается процесс формализации внутренних представлений агента через классы DeliberationDecision, RunSpec, Reflection и AgentState. Эти классы определяют различные аспекты поведения агента, такие как режим рассуждения, цели, ограничения, формат результатов и другие параметры.