Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом руководстве вы используете LangChain.js для создания агента LangChain.js, который позволяет сотрудникам компании NorthWind задавать вопросы, связанные с персоналом. Используя платформу, вы избегаете стандартного кода, необходимого для LangChain.js агентов и интеграции служб Azure, что позволяет сосредоточиться на ваших бизнес-потребностях.
Изучив это руководство, вы:
- Настройте агента LangChain.js
- Интеграция ресурсов Azure в агент LangChain.js
- При желании протестируйте агент LangChain.js в LangSmith Studio
NorthWind использует два источника данных: общедоступную документацию по персоналу для всех сотрудников и конфиденциальную базу данных кадров, содержащую конфиденциальные данные сотрудников. В этом руководстве основное внимание уделяется созданию агента LangChain.js, который определяет, можно ли ответить на вопрос сотрудника с помощью общедоступных документов отдела кадров. В этом случае агент LangChain.js предоставляет ответ напрямую.
Предупреждение
В этой статье используются ключи для доступа к ресурсам. В рабочей среде рекомендуется использовать Azure RBAC и управляемое удостоверение. Такой подход устраняет необходимость управления ключами или смены ключей, повышения безопасности и упрощения управления доступом.
Предпосылки
- Активная учетная запись Azure. Создайте бесплатную учетную запись, если у вас нет учетной записи.
- Node.js LTS установлен в вашей системе.
- TypeScript для написания и компиляции кода TypeScript.
- LangChain.js библиотеку для создания агента.
- Необязательно: LangSmith для мониторинга использования ИИ. Вам потребуется имя проекта, ключ и конечная точка.
- Необязательно: LangGraph Studio для отладки цепей LangGraph и агентов LangChain.js.
- Ресурс поиска ИИ Azure: убедитесь, что у вас есть конечная точка ресурса, ключ администратора (для вставки документов), ключ запроса (для чтения документов) и имя индекса.
-
Ресурс Azure OpenAI: вам потребуется имя экземпляра ресурса, ключ и две модели с версиями API:
- Эмбеддинговая модель, как
text-embedding-ada-002
. - Большая языковая модель, например
gpt-4o
.
- Эмбеддинговая модель, как
Архитектура агента
Фреймворк LangChain.js предоставляет схему принятия решений для создания интеллектуальных агентов в виде LangGraph. В этом руководстве вы создадите агент LangChain.js, который интегрируется с поисковым сервисом Azure AI и Azure OpenAI, чтобы ответить на вопросы, касающиеся отдела кадров. Архитектура агента предназначена для того, чтобы:
- Определите, относится ли вопрос к документации по персоналу.
- Извлеките соответствующие документы из службы "Azure AI Search".
- Используйте Azure OpenAI для создания ответа на основе извлеченных документов и модели LLM.
Ключевые компоненты:
Структура графа: агент LangChain.js представлен в виде графа, где:
- Узлы выполняют определенные задачи, такие как принятие решений или получение данных.
- Ребра определяют поток между узлами, определяя последовательность операций.
Интеграция поиска ИИ Azure:
- Вставляет документы hr в векторное хранилище в качестве внедрения.
- Использует модель эмбеддингов (
text-embedding-ada-002
) для создания этих эмбеддингов. - Извлекает соответствующие документы на основе запроса пользователя.
Интеграция Azure OpenAI:
- Использует большую языковую модель (
gpt-4o
) для:- Определяет, можно ли ответить на вопрос по общим документам отдела кадров.
- Генерирует ответ на основе подсказки, используя контекст из документов и вопрос пользователя.
- Использует большую языковую модель (
В следующей таблице приведены примеры вопросов пользователей, которые являются и не являются актуальными и на которые можно или нельзя ответить с помощью общих документов о персонале.
Вопрос | Релевантность кадровых документов |
---|---|
Does the NorthWind Health Plus plan cover eye exams? |
Уместный. Документы отдела кадров, такие как руководство сотрудника, должны предоставить ответ. |
How much of my perks + benefits have I spent? |
Неприменимо Этот вопрос требует доступа к конфиденциальным данным сотрудника, который находится вне области действия этого агента. |
Используя платформу, вы избегаете стандартного кода, необходимого для LangChain.js агентов и интеграции служб Azure, что позволяет сосредоточиться на ваших бизнес-потребностях.
Инициализация проекта Node.js
В новом каталоге инициализировать проект Node.js для агента TypeScript. Выполните следующие команды:
npm init -y
npm pkg set type=module
npx tsc --init
Создание файла среды
Создайте файл для локальной .env
разработки для хранения переменных среды для ресурсов Azure и LangGraph. Убедитесь, что имя экземпляра ресурса для внедрения и LLM — это только имя ресурса, а не конечная точка.
Необязательно. Если используется LangSmith, установите значение LANGSMITH_TRACING
в true
для локальной разработки. Отключите (false
) или удалите его в рабочей среде.
Установка зависимостей
Установите зависимости Azure для Azure ИИ поиска:
npm install @azure/search-documents
Установите LangChain.js зависимости для создания и использования агента:
npm install @langchain/community @langchain/core @langchain/langgraph @langchain/openai langchain
Установите зависимости для локальной разработки:
npm install --save-dev dotenv
Создание файлов конфигурации ресурсов поиска в Azure AI
Чтобы управлять различными ресурсами и моделями Azure, используемыми в этом руководстве, создайте определенные файлы конфигурации для каждого ресурса. Такой подход обеспечивает четкость и разделение проблем, что упрощает управление конфигурациями и их обслуживание.
Конфигурация для отправки документов в векторное хранилище
Файл конфигурации поиска ИИ Azure использует ключ администратора для вставки документов в векторное хранилище. Этот ключ необходим для управления приемом данных в поиске ИИ Azure.
const endpoint = process.env.AZURE_AISEARCH_ENDPOINT;
const adminKey = process.env.AZURE_AISEARCH_ADMIN_KEY;
const indexName = process.env.AZURE_AISEARCH_INDEX_NAME;
export const VECTOR_STORE_ADMIN = {
endpoint,
key: adminKey,
indexName,
};
LangChain.js абстрагирует необходимость определения схемы приема данных в поиск ИИ Azure, предоставляя схему по умолчанию, подходящую для большинства сценариев. Это абстракция упрощает процесс и сокращает потребность в пользовательских определениях схемы.
Настройка для запроса хранилища векторов
Для запроса хранилища векторов создайте отдельный файл конфигурации:
import {
AzureAISearchConfig,
AzureAISearchQueryType,
} from "@langchain/community/vectorstores/azure_aisearch";
const endpoint = process.env.AZURE_AISEARCH_ENDPOINT;
const queryKey = process.env.AZURE_AISEARCH_QUERY_KEY;
const indexName = process.env.AZURE_AISEARCH_INDEX_NAME;
export const DOC_COUNT = 3;
export const VECTOR_STORE_QUERY: AzureAISearchConfig = {
endpoint,
key: queryKey,
indexName,
search: {
type: AzureAISearchQueryType.Similarity,
},
};
При запросе хранилища векторов используйте вместо него ключ запроса. Это разделение ключей обеспечивает безопасный и эффективный доступ к ресурсу.
Создание файлов конфигурации ресурсов Azure OpenAI
Чтобы управлять двумя различными моделями, внедрениями и LLM, создайте отдельные файлы конфигурации. Такой подход обеспечивает четкость и разделение проблем, что упрощает управление конфигурациями и их обслуживание.
Настройка внедрения для векторного хранилища
Чтобы создать встраивание для вставки документов в векторное хранилище поиска ИИ Azure, создайте файл конфигурации.
const key = process.env.AZURE_OPENAI_EMBEDDING_KEY;
const instance = process.env.AZURE_OPENAI_EMBEDDING_INSTANCE;
const apiVersion =
process.env.AZURE_OPENAI_EMBEDDING_API_VERSION || "2023-05-15";
const model =
process.env.AZURE_OPENAI_EMBEDDING_MODEL || "text-embedding-ada-002";
export const EMBEDDINGS_CONFIG = {
azureOpenAIApiKey: key,
azureOpenAIApiInstanceName: instance,
azureOpenAIApiEmbeddingsDeploymentName: model,
azureOpenAIApiVersion: apiVersion,
maxRetries: 1,
};
Настройка для LLM для создания ответов
Чтобы создать ответы из крупной языковой модели, создайте файл конфигурации:
const key = process.env.AZURE_OPENAI_COMPLETE_KEY;
const instance = process.env.AZURE_OPENAI_COMPLETE_INSTANCE;
const apiVersion =
process.env.AZURE_OPENAI_COMPLETE_API_VERSION || "2024-10-21";
const model = process.env.AZURE_OPENAI_COMPLETE_MODEL || "gpt-4o";
const maxTokens = process.env.AZURE_OPENAI_COMPLETE_MAX_TOKENS;
export const LLM_CONFIG = {
model,
azureOpenAIApiKey: key,
azureOpenAIApiInstanceName: instance,
azureOpenAIApiDeploymentName: model,
azureOpenAIApiVersion: apiVersion,
maxTokens: maxTokens ? parseInt(maxTokens, 10) : 100,
maxRetries: 1,
timeout: 60000,
};
Константы и промпты
Приложения ИИ часто используют постоянные строки и запросы. Управление этими константами с помощью отдельных файлов.
Создайте системный запрос:
export const SYSTEM_PROMPT = `Answer the query with a complete paragraph based on the following context:`;
Создайте константы узлов:
export const ANSWER_NODE = "vector_store_retrieval";
export const DECISION_NODE = "requires_hr_documents";
export const START = "__start__";
export const END = "__end__";
Создание примеров запросов пользователей:
export const USER_QUERIES = [
"Does the NorthWind Health plus plan cover eye exams?",
"What is included in the NorthWind Health plus plan that is not included in the standard?",
"What happens in a performance review?",
];
Загрузка документов в поиск azure AI
Чтобы загрузить документы в поиск ИИ Azure, используйте LangChain.js для упрощения процесса. Документы, хранящиеся в формате PDF, преобразуются в встраивания и вставляются в векторную базу данных. Этот процесс гарантирует, что документы готовы к эффективному извлечению и запросу.
Основные рекомендации:
- LangChain.js абстракция: LangChain.js управляет большей частью сложности, как, например, определения схем и создание клиента, делая процесс более простым.
- Регулирование и логика повторных попыток. Хотя пример кода включает в себя минимальную функцию ожидания, рабочие приложения должны реализовать комплексную обработку ошибок и логику повторных попыток для управления регулированием и временными ошибками.
Действия по загрузке документов
Найдите PDF-документы: документы хранятся в каталоге данных.
Загрузка PDF-файлов в LangChain.js: используйте функцию
loadPdfsFromDirectory
для загрузки документов. Эта функция использует методPDFLoader.load
сообщества LangChain.js для чтения каждого файла и возвращает массивDocument[]
. Этот массив является стандартным форматом документа LangChain.js.import { PDFLoader } from "@langchain/community/document_loaders/fs/pdf"; import { waiter } from "../utils/waiter.js"; import { loadDocsIntoAiSearchVector } from "./load_vector_store.js"; import fs from "fs/promises"; import path from "path"; export async function loadPdfsFromDirectory( embeddings: any, dirPath: string, ): Promise<void> { try { const files = await fs.readdir(dirPath); console.log( `PDF: Loading directory ${dirPath}, ${files.length} files found`, ); for (const file of files) { if (file.toLowerCase().endsWith(".pdf")) { const fullPath = path.join(dirPath, file); console.log(`PDF: Found ${fullPath}`); const pdfLoader = new PDFLoader(fullPath); console.log(`PDF: Loading ${fullPath}`); const docs = await pdfLoader.load(); console.log(`PDF: Sending ${fullPath} to index`); const storeResult = await loadDocsIntoAiSearchVector(embeddings, docs); console.log(`PDF: Indexing result: ${JSON.stringify(storeResult)}`); await waiter(1000 * 60); // waits for 1 minute between files } } } catch (err) { console.error("Error loading PDFs:", err); } }
Вставка документов в поиск ИИ Azure: используйте
loadDocsIntoAiSearchVector
функцию для отправки массива документов в векторное хранилище векторов поиска ИИ Azure. Эта функция использует клиент внедрения для обработки документов и включает базовую функцию ожидания для обработки регулирования. Для эксплуатации реализуйте надежный механизм повторных попыток и откатывания.import { AzureAISearchVectorStore } from "@langchain/community/vectorstores/azure_aisearch"; import type { Document } from "@langchain/core/documents"; import type { EmbeddingsInterface } from "@langchain/core/embeddings"; import { VECTOR_STORE_ADMIN } from "../config/vector_store_admin.js"; export async function loadDocsIntoAiSearchVector( embeddings: EmbeddingsInterface, documents: Document[], ): Promise<AzureAISearchVectorStore> { const vectorStore = await AzureAISearchVectorStore.fromDocuments( documents, embeddings, VECTOR_STORE_ADMIN, ); return vectorStore; }
Создание рабочего процесса агента
В LangChain.jsсоздайте агент LangChain.js с помощью LangGraph. LangGraph позволяет определить узлы и края:
- Узел: место выполнения работы.
- Edge: определяет соединение между узлами.
Компоненты рабочего процесса
В этом приложении два рабочих узла:
- requiresHrResources: определяет, относится ли вопрос к документации по персоналу с помощью Azure OpenAI LLM.
- getAnswer: извлекает ответ. Ответ поступает из цепочки поиска LangChain.js, которая использует векторные представления документов из Azure AI Search и отправляет их в Azure OpenAI LLM. Это суть генерации, дополненной извлечением.
Края определяют место начала, окончания и условия, необходимые для вызова узла getAnswer .
Экспорт графа
Чтобы использовать LangGraph Studio для запуска и отладки графа, экспортируйте его в качестве собственного объекта.
import { StateGraph } from "@langchain/langgraph";
import { StateAnnotation } from "./langchain/state.js";
import { route as endRoute } from "./langchain/check_route_end.js";
import { getAnswer } from "./azure/get_answer.js";
import { START, ANSWER_NODE, DECISION_NODE } from "./config/nodes.js";
import {
requiresHrResources,
routeRequiresHrResources,
} from "./azure/requires_hr_documents.js";
const builder = new StateGraph(StateAnnotation)
.addNode(DECISION_NODE, requiresHrResources)
.addNode(ANSWER_NODE, getAnswer)
.addEdge(START, DECISION_NODE)
.addConditionalEdges(DECISION_NODE, routeRequiresHrResources)
.addConditionalEdges(ANSWER_NODE, endRoute);
export const hr_documents_answer_graph = builder.compile();
hr_documents_answer_graph.name = "Azure AI Search + Azure OpenAI";
В методах addNode, addEdge и addConditionalEdges первый параметр — это имя в виде строки, чтобы идентифицировать объект в графе. Второй параметр — это функция, которая должна вызываться на этом шаге или имя вызываемого узла.
Для метода addEdge его имя — START ("start", определенное в файле ./src/config/nodes.ts) и всегда вызывает DECISION_NODE. Этот узел определяется двумя параметрами: первый — его имя, DECISION_NODE, а второй — функция, называемая requiresHrResources.
Общие функциональные возможности
Это приложение предоставляет общие функциональные возможности LangChain:
Управление состоянием:
import { BaseMessage, BaseMessageLike } from "@langchain/core/messages"; import { Annotation, messagesStateReducer } from "@langchain/langgraph"; export const StateAnnotation = Annotation.Root({ messages: Annotation<BaseMessage[], BaseMessageLike[]>({ reducer: messagesStateReducer, default: () => [], }), });
Завершение маршрута:
import { StateAnnotation } from "./state.js"; import { END, ANSWER_NODE } from "../config/nodes.js"; export const route = ( state: typeof StateAnnotation.State, ): typeof END | typeof ANSWER_NODE => { if (state.messages.length > 0) { return END; } return ANSWER_NODE; };
Единственным настраиваемым маршрутом для этого приложения является МаршрутТребуетHRРесурсы. Этот маршрут используется для определения того, должен ли ответ от узла requiresHrResources указывать, что вопрос пользователя должен продолжаться на узле ANSWER_NODE . Так как этот маршрут получает результат работы requiresHrResources, он находится в том же файле.
Интеграция ресурсов Azure OpenAI
Интеграция Azure OpenAI использует две разные модели:
- Внедрение: используется для вставки документов в векторное хранилище.
- LLM: используется для ответа на вопросы, запрашивая хранилище векторов и создавая ответы.
Клиент внедрения и клиент LLM служат различным целям. Не уменьшайте их до одной модели или клиента.
Модель внедрения
Клиент внедрения требуется всякий раз, когда документы извлекаются из хранилища векторов. Она включает настройку maxRetries, предназначенную для обработки временных ошибок.
import { AzureOpenAIEmbeddings } from "@langchain/openai";
import { EMBEDDINGS_CONFIG } from "../config/embeddings.js";
export function getEmbeddingClient(): AzureOpenAIEmbeddings {
return new AzureOpenAIEmbeddings({ ...EMBEDDINGS_CONFIG, maxRetries: 1 });
}
Модель LLM
Модель LLM используется для ответа на два типа вопросов:
- Релевантность кадров: определяет, относится ли вопрос пользователя к документации по персоналу.
- Создание ответов: предоставляет ответ на вопрос пользователя, дополненный документами из службы "Поиск ИИ Azure".
Клиент LLM создается и вызывается при необходимости ответа.
import { RunnableConfig } from "@langchain/core/runnables";
import { StateAnnotation } from "../langchain/state.js";
import { AzureChatOpenAI } from "@langchain/openai";
import { LLM_CONFIG } from "../config/llm.js";
export const getLlmChatClient = (): AzureChatOpenAI => {
return new AzureChatOpenAI({
...LLM_CONFIG,
temperature: 0,
});
};
export const callChatCompletionModel = async (
state: typeof StateAnnotation.State,
_config: RunnableConfig,
): Promise<typeof StateAnnotation.Update> => {
const llm = new AzureChatOpenAI({
...LLM_CONFIG,
temperature: 0,
});
const completion = await llm.invoke(state.messages);
completion;
return {
messages: [
...state.messages,
{
role: "assistant",
content: completion.content,
},
],
};
};
Агент LangChain.js использует LLM, чтобы решить, относится ли вопрос к документации по персоналу или если рабочий процесс должен направляться в конец графа.
// @ts-nocheck
import { getLlmChatClient } from "./llm.js";
import { StateAnnotation } from "../langchain/state.js";
import { RunnableConfig } from "@langchain/core/runnables";
import { BaseMessage } from "@langchain/core/messages";
import { ANSWER_NODE, END } from "../config/nodes.js";
const PDF_DOCS_REQUIRED = "Answer requires HR PDF docs.";
export async function requiresHrResources(
state: typeof StateAnnotation.State,
_config: RunnableConfig,
): Promise<typeof StateAnnotation.Update> {
const lastUserMessage: BaseMessage = [...state.messages].reverse()[0];
let pdfDocsRequired = false;
if (lastUserMessage && typeof lastUserMessage.content === "string") {
const question = `Does the following question require general company policy information that could be found in HR documents like employee handbooks, benefits overviews, or company-wide policies, then answer yes. Answer no if this requires personal employee-specific information that would require access to an individual's private data, employment records, or personalized benefits details: '${lastUserMessage.content}'. Answer with only "yes" or "no".`;
const llm = getLlmChatClient();
const response = await llm.invoke(question);
const answer = response.content.toLocaleLowerCase().trim();
console.log(`LLM question (is HR PDF documents required): ${question}`);
console.log(`LLM answer (is HR PDF documents required): ${answer}`);
pdfDocsRequired = answer === "yes";
}
// If HR documents (aka vector store) are required, append an assistant message to signal this.
if (!pdfDocsRequired) {
const updatedState = {
messages: [
...state.messages,
{
role: "assistant",
content:
"Not a question for our HR PDF resources. This requires data specific to the asker.",
},
],
};
return updatedState;
} else {
const updatedState = {
messages: [
...state.messages,
{
role: "assistant",
content: `${PDF_DOCS_REQUIRED} You asked: ${lastUserMessage.content}. Let me check.`,
},
],
};
return updatedState;
}
}
export const routeRequiresHrResources = (
state: typeof StateAnnotation.State,
): typeof END | typeof ANSWER_NODE => {
const lastMessage: BaseMessage = [...state.messages].reverse()[0];
if (lastMessage && !lastMessage.content.includes(PDF_DOCS_REQUIRED)) {
console.log("go to end");
return END;
}
console.log("go to llm");
return ANSWER_NODE;
};
Функция requiresHrResources устанавливает сообщение в обновленном состоянии, с содержанием HR resources required detected
. Маршрутизатор, routeRequiresHrResources, ищет это содержимое, чтобы определить, куда отправлять сообщения.
Интеграция ресурса поиска ИИ Azure для векторного хранилища
Интеграция поиска ИИ Azure предоставляет документы векторного хранилища, чтобы LLM могла расширить ответ для узла getAnswer. LangChain.js еще раз предоставляет большую часть абстракции, чтобы обязательный код был минимальным. Функции:
- getReadOnlyVectorStore: извлекает клиента по ключу запроса.
- getDocsFromVectorStore: находит соответствующие документы для вопроса пользователя.
import { AzureAISearchVectorStore } from "@langchain/community/vectorstores/azure_aisearch";
import { VECTOR_STORE_QUERY, DOC_COUNT } from "../config/vector_store_query.js";
import { getEmbeddingClient } from "./embeddings.js";
export function getReadOnlyVectorStore(): AzureAISearchVectorStore {
const embeddings = getEmbeddingClient();
return new AzureAISearchVectorStore(embeddings, VECTOR_STORE_QUERY);
}
export async function getDocsFromVectorStore(
query: string,
): Promise<Document[]> {
const store = getReadOnlyVectorStore();
// @ts-ignore
//return store.similaritySearchWithScore(query, DOC_COUNT);
return store.similaritySearch(query, DOC_COUNT);
}
Код интеграции LangChain.js упрощает получение соответствующих документов из хранилища векторов.
Написание кода для получения ответа от LLM
Теперь, когда компоненты интеграции созданы, создайте функцию getAnswer , чтобы получить соответствующие документы векторного хранилища и создать ответ с помощью LLM.
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { createStuffDocumentsChain } from "langchain/chains/combine_documents";
import { createRetrievalChain } from "langchain/chains/retrieval";
import { getLlmChatClient } from "./llm.js";
import { StateAnnotation } from "../langchain/state.js";
import { AIMessage } from "@langchain/core/messages";
import { getReadOnlyVectorStore } from "./vector_store.js";
const EMPTY_STATE = { messages: [] };
export async function getAnswer(
state: typeof StateAnnotation.State = EMPTY_STATE,
): Promise<typeof StateAnnotation.Update> {
const vectorStore = getReadOnlyVectorStore();
// Extract the last user message's content from the state as input
const lastMessage = state.messages[state.messages.length - 1];
const userInput =
lastMessage && typeof lastMessage.content === "string"
? lastMessage.content
: "";
const questionAnsweringPrompt = ChatPromptTemplate.fromMessages([
[
"system",
"Answer the user's questions based on the below context:\n\n{context}",
],
["human", "{input}"],
]);
const combineDocsChain = await createStuffDocumentsChain({
llm: getLlmChatClient(),
prompt: questionAnsweringPrompt,
});
const retrievalChain = await createRetrievalChain({
retriever: vectorStore.asRetriever(2),
combineDocsChain,
});
const result = await retrievalChain.invoke({ input: userInput });
const assistantMessage = new AIMessage(result.answer);
return {
messages: [...state.messages, assistantMessage],
};
}
Эта функция предоставляет запрос с двумя заполнителями: один для вопроса пользователя и один для контекста. Контекст — это все соответствующие документы из векторного хранилища векторов поиска ИИ. Передайте запрос и клиент LLM в createStuffDocumentsChain , чтобы создать цепочку LLM. Передайте цепочку LLM в функцию создать RetrievalChain, чтобы создать цепочку, содержащую запрос, соответствующие документы и LLM.
Запустите цепочки с помощью retrievalChain.invoke, используя вопрос пользователя в качестве входных данных, чтобы получить ответ. Верните ответ в состоянии сообщений.
Создание пакета агента
Добавьте скрипт для package.json для создания приложения TypeScript:
"build": "tsc",
Создайте агент LangChain.js.
npm run build
Необязательно. Запуск агента LangChain.js в локальной разработке с помощью LangChain Studio
При необходимости для локальной разработки используйте LangChain Studio для работы с агентом LangChain.js.
langgraph.json
Создайте файл для определения графа.{ "dependencies": [], "graphs": { "agent": "./src/graph.ts:hr_documents_answer_graph" }, "env": "../.env" }
Установите интерфейс командной строки LangGraph.
npm install @langchain/langgraph-cli --save-dev
Создайте скрипт в package.json для передачи
.env
файла в интерфейс командной строки LangGraph."studio": "npx @langchain/langgraph-cli dev",
Интерфейс командной строки запускается в терминале и открывает браузер для перехода в LangGraph Studio.
Welcome to ╦ ┌─┐┌┐┌┌─┐╔═╗┬─┐┌─┐┌─┐┬ ┬ ║ ├─┤││││ ┬║ ╦├┬┘├─┤├─┘├─┤ ╩═╝┴ ┴┘└┘└─┘╚═╝┴└─┴ ┴┴ ┴ ┴.js - 🚀 API: http://localhost:2024 - 🎨 Studio UI: https://smith.langchain.com/studio?baseUrl=http://localhost:2024 This in-memory server is designed for development and testing. For production use, please use LangGraph Cloud. info: ▪ Starting server... info: ▪ Initializing storage... info: ▪ Registering graphs from C:\Users\myusername\azure-typescript-langchainjs\packages\langgraph-agent info: ┏ Registering graph with id 'agent' info: ┗ [1] { graph_id: 'agent' } info: ▪ Starting 10 workers info: ▪ Server running at ::1:2024
Просмотрите агент LangChain.js в LangGraph Studio.
Выберите +Сообщение , чтобы добавить вопрос пользователя, а затем нажмите кнопку "Отправить".
Вопрос Релевантность документов отдела кадров Does the NorthWind Health plus plan cover eye exams?
Этот вопрос относится к персоналу и достаточно общий, чтобы документы отдела кадров, такие как справочник сотрудников, справочник по преимуществам и библиотека ролей сотрудников могли бы ответить на него. What is included in the NorthWind Health plus plan that is not included in the standard?
Этот вопрос относится к персоналу и достаточно общий, чтобы документы отдела кадров, такие как справочник сотрудников, справочник по преимуществам и библиотека ролей сотрудников могли бы ответить на него. How much of my perks + benefit have I spent
Этот вопрос не относится к общим, безличным документам отдела кадров. Этот вопрос должен быть отправлен агенту, который имеет доступ к данным сотрудника. Если вопрос относится к документации по персоналу, он должен пройти через DECISION_NODE и перейти к ANSWER_NODE.
Просмотрите выходные данные терминала, чтобы просмотреть вопрос llM и ответ от LLM.
Если вопрос не относится к документам отдела кадров, поток переходит непосредственно к концу.
Если агент LangChain.js принимает неверное решение, проблема может быть:
- Используемая модель LLM
- Количество документов из векторного хранилища
- Запрос, используемый в узле принятия решений.
Запуск агента LangChain.js из приложения
Чтобы вызвать агент LangChain.js из родительского приложения, например веб-API, необходимо предоставить вызов агента LangChain.js.
import { HumanMessage } from "@langchain/core/messages";
import { hr_documents_answer_graph as app } from "./graph.js";
const AIMESSAGE = "aimessage";
export async function ask_agent(question: string) {
const initialState = { messages: [new HumanMessage(question)], iteration: 0 };
const finalState = await app.invoke(initialState);
return finalState;
}
export async function get_answer(question: string) {
try {
const answerResponse = await ask_agent(question);
const answer = answerResponse.messages
.filter(
(m: any) =>
m &&
m.constructor?.name?.toLowerCase() === AIMESSAGE.toLocaleLowerCase(),
)
.map((m: any) => m.content)
.join("\n");
return answer;
} catch (e) {
console.error("Error in get_answer:", e);
throw e;
}
}
Две функции:
- ask_agent. Эта функция возвращает состояние, поэтому позволяет добавить агент LangChain.js в рабочий процесс LangChain с несколькими агентами.
- get_answer: эта функция возвращает только текст ответа. Эту функцию можно вызвать из API.
Устранение неполадок
- Для любых проблем с процедурой создайте проблему в примере репозитория кода.
Очистите ресурсы
Удалите группу ресурсов, содержащую ресурс поиска ИИ Azure и ресурс Azure OpenAI.