Создание контекстно-зависимой мультиагентной системы ИИ с использованием Nomic Embeddings и Gemini LLM

В этом руководстве мы рассмотрим полную реализацию продвинутой системы агентов ИИ на базе Nomic Embeddings и Google Gemini. Мы разрабатываем архитектуру с нуля, интегрируя семантическую память, контекстуальное рассуждение и мультиагентное управление в единую интеллектуальную систему. Используя LangChain, Faiss и LangChain-Nomic, мы наделяем наших агентов способностью хранить, извлекать информацию и рассуждать над ней с помощью запросов на естественном языке. Цель — продемонстрировать, как можно создать модульную и расширяемую систему ИИ, поддерживающую как аналитические исследования, так и дружескую беседу.

Установка необходимых библиотек

Сначала мы устанавливаем все необходимые библиотеки, включая langchain-nomic, langchain-google-genai и faiss-cpu, чтобы поддержать возможности встраивания, рассуждения и векторного поиска нашего агента. Затем мы импортируем необходимые модули и безопасно устанавливаем наши API-ключи Nomic и Google с помощью getpass для обеспечения плавной интеграции со службами встраивания и LLM.

“`python
import os
import getpass
import numpy as np
from typing import List, Dict, Any, Optional
from dataclasses import dataclass
from langchain_nomic import NomicEmbeddings
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_core.documents import Document
from langchaingooglegenai import ChatGoogleGenerativeAI
import json

if not os.getenv(“NOMICAPIKEY”):
os.environ[“NOMICAPIKEY”] = getpass.getpass(“Enter your Nomic API key: “)

if not os.getenv(“GOOGLEAPIKEY”):
os.environ[“GOOGLEAPIKEY”] = getpass.getpass(“Enter your Google API key (for Gemini): “)
“`

Определение структуры интеллектуального агента

Мы определяем основную структуру нашего интеллектуального агента, создавая систему памяти, которая имитирует эпизодическое и семантическое запоминание. Мы интегрируем Nomic embeddings для семантического понимания и используем Gemini LLM для генерации контекстуальных ответов, управляемых личностью. Благодаря встроенным возможностям, таким как поиск по памяти, поиск знаний и рассуждения, мы предоставляем агенту возможность интеллектуально взаимодействовать и учиться в ходе каждого разговора.

“`python
@dataclass
class AgentMemory:
“””Agent’s episodic and semantic memory”””
episodic: List[Dict[str, Any]]
semantic: Dict[str, Any]
working: Dict[str, Any]

class IntelligentAgent:
“””Advanced AI Agent with Nomic Embeddings for semantic reasoning”””

def init(self, agent_name: str = “AIAgent”, personality: str = “helpful”):
self.name = agent_name
self.personality = personality

self.embeddings = NomicEmbeddings(
model=”nomic-embed-text-v1.5″,
dimensionality=384,
inference_mode=”remote”
)

self.llm = ChatGoogleGenerativeAI(
model=”gemini-1.5-flash”,
temperature=0.7,
max_tokens=512
)

self.memory = AgentMemory(
episodic=[],
semantic={},
working={}
)

self.knowledge_base = None
self.vector_store = None

self.capabilities = {
“reasoning”: True,
“memory_retrieval”: True,
“knowledge_search”: True,
“context_awareness”: True,
“learning”: True
}

print(f” {self.name} initialized with Nomic embeddings + Gemini LLM”)

def add_knowledge(self, documents: List[str], metadata: List[Dict] = None):
“””Add knowledge to agent’s semantic memory”””
if metadata is None:
metadata = [{“source”: f”doc_{i}”} for i in range(len(documents))]

docs = [Document(page_content=doc, metadata=meta)
for doc, meta in zip(documents, metadata)]

if self.vector_store is None:
self.vectorstore = InMemoryVectorStore.fromdocuments(docs, self.embeddings)
else:
self.vectorstore.adddocuments(docs)

print(f” Added {len(documents)} documents to knowledge base”)

def rememberinteraction(self, userinput: str, agent_response: str, context: Dict = None):
“””Store interaction in episodic memory”””
memory_entry = {
“timestamp”: len(self.memory.episodic),
“userinput”: userinput,
“agentresponse”: agentresponse,
“context”: context or {},
“embedding”: self.embeddings.embedquery(f”{userinput} {agent_response}”)
}
self.memory.episodic.append(memory_entry)
“`

Специализированные агенты

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

“`python
class ResearchAgent(IntelligentAgent):
“””Specialized agent for research and analysis tasks”””

def init(self):
super().init(“ResearchBot”, “analytical and thorough”)
self.research_domains = []

def analyze_topic(self, topic: str) -> Dict[str, Any]:
“””Analyze a topic using semantic similarity and Gemini reasoning”””

relateddocs = self.searchknowledge(topic, k=5)

if not related_docs:
return {“analysis”: “No relevant information found”, “confidence”: 0.0}

topicembedding = self.embeddings.embedquery(topic)
docembeddings = [self.embeddings.embedquery(doc.page_content)
for doc in related_docs]

similarities = [np.dot(topicembedding, docemb)
for docemb in docembeddings]

context = ” “.join([doc.pagecontent for doc in relateddocs[:3]])
analysis_prompt = f”””As a research analyst, analyze the topic: {topic}

Available information:
{context}

Provide a structured analysis including:
1. Key insights (2-3 points)
2. Confidence level assessment
3. Research gaps or limitations
4. Practical implications

Keep response under 200 words.”””

try:
geminianalysis = self.llm.invoke(analysisprompt)
detailedanalysis = geminianalysis.content.strip()
except:
detailedanalysis = f”Analysis of {topic} based on available documents with {len(relateddocs)} relevant sources.”

analysis = {
“topic”: topic,
“relateddocuments”: len(relateddocs),
“max_similarity”: max(similarities),
“avg_similarity”: np.mean(similarities),
“keyinsights”: [doc.pagecontent[:100] + “…” for doc in related_docs[:3]],
“confidence”: max(similarities),
“detailedanalysis”: detailedanalysis
}

return analysis

class ConversationalAgent(IntelligentAgent):
“””Agent optimized for natural conversations”””

def init(self):
super().init(“ChatBot”, “friendly and engaging”)
self.conversation_history = []

def maintainconversationcontext(self, user_input: str) -> str:
“””Maintain conversation flow with context awareness”””

self.conversationhistory.append({“role”: “user”, “content”: userinput})

recentcontext = ” “.join([msg[“content”] for msg in self.conversationhistory[-3:]])

response = self.reasonandrespond(recent_context)

self.conversation_history.append({“role”: “assistant”, “content”: response})

return response
“`

Мультиагентная система

Мы создали мультиагентную систему, которая интеллектуально направляет запросы либо к исследовательскому, либо к агенту для ведения бесед на основе семантической схожести. Встраивая как запрос пользователя, так и специализации агентов с помощью Nomic embeddings, мы гарантируем, что к каждому запросу будет назначен наиболее подходящий эксперт. Эта архитектура позволяет нам масштабировать интеллектуальное поведение, сохраняя при этом специализацию и точность.

“`python
class MultiAgentSystem:
“””Orchestrate multiple specialized agents”””

def init(self):
self.agents = {
“research”: ResearchAgent(),
“chat”: ConversationalAgent()
}
self.coordinator_embeddings = NomicEmbeddings(model=”nomic-embed-text-v1.5″, dimensionality=256)

def route_query(self, query: str) -> str:
“””Route query to most appropriate agent”””

agent_descriptions = {
“research”: “analysis, research, data, statistics, technical information”,
“chat”: “conversation, questions, general discussion, casual talk”
}

queryembedding = self.coordinatorembeddings.embed_query(query)
best_agent = “chat”
best_similarity = 0

for agentname, description in agentdescriptions.items():
descembedding = self.coordinatorembeddings.embed_query(description)
similarity = np.dot(queryembedding, descembedding)

if similarity > best_similarity:
best_similarity = similarity
bestagent = agentname

return best_agent

def process_query(self, query: str) -> Dict[str, Any]:
“””Process query through appropriate agent”””

selectedagent, confidence = self.routequerywithconfidence(query)
agent = self.agents[selected_agent]

if selected_agent == “research”:
if “analyze” in query.lower() or “research” in query.lower():
topic = query.replace(“analyze”, “”).replace(“research”, “”).strip()
result = agent.analyze_topic(topic)
response = f”Research Analysis: {result.get(‘detailed_analysis’, str(result))}”
else:
response = agent.reasonandrespond(query)
else:
response = agent.maintainconversationcontext(query)

return {
“query”: query,
“selectedagent”: selectedagent,
“response”: response,
“confidence”: confidence
}

def routequerywith_confidence(self, query: str) -> tuple[str, float]:
“””Route query to most appropriate agent and return confidence”””

agent_descriptions = {
“research”: “analysis, research, data, statistics, technical information”,
“chat”: “conversation, questions, general discussion, casual talk”
}

queryembedding = self.coordinatorembeddings.embed_query(query)
best_agent = “chat”
best_similarity = 0.0

for agentname, description in agentdescriptions.items():
descembedding = self.coordinatorembeddings.embed_query(description)
similarity = np.dot(queryembedding, descembedding)

if similarity > best_similarity:
best_similarity = similarity
bestagent = agentname

return bestagent, bestsimilarity
“`

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

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

В статье для создания мультиагентной системы ИИ используются следующие инструменты и библиотеки: LangChain, Faiss, LangChain-Nomic, Nomic Embeddings, Google Gemini, ChatGoogleGenerativeAI, InMemoryVectorStore.

2. Какие типы агентов разработаны в статье и для каких задач они предназначены?

В статье разработаны два типа агентов: ResearchAgent для структурированного анализа тем и ConversationalAgent для естественного диалога. Первый агент предназначен для аналитических исследований, а второй — для дружеской беседы.

3. Как в системе обеспечивается контекстуальное понимание и генерация ответов?

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

4. Какие возможности предоставляет система для хранения и извлечения информации?

Система предоставляет возможность хранения и извлечения информации через систему памяти, которая имитирует эпизодическое и семантическое запоминание. Это позволяет агентам интеллектуально взаимодействовать и учиться в ходе каждого разговора.

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

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

Источник

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