Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu öğreticide, NorthWind şirket çalışanlarının insan kaynaklarıyla ilgili sorular sormasını sağlayan bir LangChain.js aracısı oluşturmak için LangChain.js kullanacaksınız. Çerçeveyi kullanarak genellikle LangChain.js aracıları ve Azure hizmet tümleştirmesi için gereken ortak kodlardan kaçınarak iş gereksinimlerinize odaklanabilirsiniz.
Bu eğitimde, siz:
- LangChain.js ajanı kurmak
- Azure kaynaklarını LangChain.js aracınızla tümleştirme
- İsteğe bağlı olarak LangChain.js aracınızı LangSmith Studio'da test edin
NorthWind iki veri kaynağına dayanır: tüm çalışanlar tarafından erişilebilen genel İk belgeleri ve hassas çalışan verilerini içeren gizli bir İk veritabanı. Bu öğretici, bir çalışanın sorusunun kamuya açık İK belgeleri kullanılarak yanıtlanıp yanıtlanamadığını belirleyen bir LangChain.js aracısı oluşturmaya odaklanır. Bu durumda, LangChain.js aracısı yanıtı doğrudan sağlar.
Uyarı
Bu makalede kaynaklara erişmek için anahtarlar kullanılır. Üretim ortamında önerilen en iyi yöntem Azure RBAC ve yönetilen kimlik kullanmaktır. Bu yaklaşım anahtarları yönetme veya döndürme gereksinimini ortadan kaldırarak güvenliği artırır ve erişim denetimini basitleştirir.
Önkoşullar
- Etkin bir Azure hesabı. Hesabınız yoksa ücretsiz bir hesap oluşturun.
- Node.js LTS sisteminize yüklendi.
- TypeScript'ı kullanarak TypeScript kodu yazmak ve derlemek.
- Ajanı oluşturmak içinLangChain.jskitaplığı.
- İsteğe bağlı: Yapay zeka kullanımını izlemek için LangSmith . Proje adı, anahtarı ve uç noktası gerekir.
- İsteğe bağlı: LangGraph zincirlerinin ve LangChain.js aracılarının hatalarını ayıklamak için LangGraph Studio .
- Azure AI Search kaynağı: Kaynak uç noktasına, yönetici anahtarına (belge ekleme için), sorgu anahtarına (belgeleri okumak için) ve dizin adına sahip olduğunuzdan emin olun.
-
Azure OpenAI kaynağı: Kaynak örneği adına, anahtarına ve API sürümlerine sahip iki modele ihtiyacınız vardır:
- gibi
text-embedding-ada-002
bir ekleme modeli. - Büyük bir dil modeli olan
gpt-4o
gibi.
- gibi
Ajan mimarisi
LangChain.js çerçevesi, LangGraph olarak akıllı aracılar oluşturmaya yönelik bir karar akışı sağlar. Bu öğreticide, İnsan Kaynakları ile ilgili soruları yanıtlamak için Azure AI Search ve Azure OpenAI ile entegre olan bir LangChain.js aracısı oluşturacaksınız. Aracının mimarisi şu amaçla tasarlanmıştır:
- Bir sorunun İnsan Kaynakları belgeleriyle ilgili olup olmadığını belirleyin.
- Azure AI Search'ten ilgili belgeleri alın.
- Alınan belgelere ve LLM modeline göre bir yanıt oluşturmak için Azure OpenAI kullanın.
Temel Bileşenler:
Graf yapısı: LangChain.js aracısı bir grafik olarak temsil edilir ve burada:
- Düğümler karar alma veya veri alma gibi belirli görevleri gerçekleştirir.
- Kenarlar düğümler arasındaki akışı tanımlar ve işlem sırasını belirler.
Azure AI Search tümleştirmesi:
- İnsan Kaynakları (İK) belgelerini gömme olarak vektör deposuna ekler.
- Bu eklemeleri oluşturmak için bir ekleme modeli (
text-embedding-ada-002
) kullanır. - Kullanıcı istemine göre ilgili belgeleri alır.
Azure OpenAI tümleştirmesi:
- Aşağıdakiler için büyük bir dil modeli (
gpt-4o
) kullanır:- Bir sorunun genel insan kaynakları belgelerinden yanıtlanıp yanıtlanamayacağını belirler.
- Belgelerden ve kullanıcı sorunundan bağlamı kullanarak istemle yanıt oluşturur.
- Aşağıdakiler için büyük bir dil modeli (
Aşağıdaki tabloda, genel İnsan kaynakları belgelerinden ilgili ve yanıtlanabilir olmayan kullanıcı soruları örnekleri verilmiştir:
Soru | İnsan Kaynakları Belgeleriyle İlgililik |
---|---|
Does the NorthWind Health Plus plan cover eye exams? |
Alakalı. Çalışan el kitabı gibi İK belgeleri yanıt sağlamalıdır. |
How much of my perks + benefits have I spent? |
İlgili değil. Bu soru, bu aracının kapsamı dışında olan gizli çalışan verilerine erişim gerektirir. |
Çerçeveyi kullanarak genellikle LangChain.js aracıları ve Azure hizmet tümleştirmesi için gereken ortak kodlardan kaçınarak iş gereksinimlerinize odaklanabilirsiniz.
Node.js projenizi başlatma
Yeni bir dizinde TypeScript aracınız için Node.js projenizi başlatın. Aşağıdaki komutları çalıştırın:
npm init -y
npm pkg set type=module
npx tsc --init
Ortam dosyası oluşturma
Azure kaynakları ve LangGraph için ortam değişkenlerini depolamak üzere yerel geliştirme için bir .env
dosya oluşturun. Gömme ve LLM için kaynak örneği adının uç nokta yerine yalnızca kaynak adı olduğundan emin olun.
İsteğe bağlı: LangSmith kullanıyorsanız, yerel geliştirme için LANGSMITH_TRACING
ayarını true
'e getirin. Devre dışı bırakın (false
) veya üretim ortamında kaldırın.
Bağımlılıkları yükleme
Azure AI Search için Azure bağımlılıklarını yükleyin:
npm install @azure/search-documents
Aracı oluşturmak ve kullanmak için LangChain.js bağımlılıkları yükleyin:
npm install @langchain/community @langchain/core @langchain/langgraph @langchain/openai langchain
Yerel geliştirme için geliştirme bağımlılıklarını yükleyin:
npm install --save-dev dotenv
Azure AI arama kaynağı yapılandırma dosyaları oluşturma
Bu öğreticide kullanılan çeşitli Azure kaynaklarını ve modellerini yönetmek için her kaynak için belirli yapılandırma dosyaları oluşturun. Bu yaklaşım, endişelerin netliğini ve ayrımını sağlayarak yapılandırmaları yönetmeyi ve korumayı kolaylaştırır.
Belgeleri vektör deposuna yüklemek için yapılandırma
Azure AI Search yapılandırma dosyası, belgeleri vektör deposuna eklemek için yönetici anahtarını kullanır. Bu anahtar, Azure AI Search'e veri alımını yönetmek için gereklidir.
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 AI Search'e veri alımı için şema tanımlama gereksinimini özetleyerek çoğu senaryo için uygun bir varsayılan şema sağlar. Bu soyutlama işlemi basitleştirir ve özel şema tanımları gereksinimini azaltır.
Vektör deposu sorgulama yapılandırması
Vektör deposunu sorgulamak için ayrı bir yapılandırma dosyası oluşturun:
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,
},
};
Vektör deposunu sorgularken bunun yerine sorgu anahtarını kullanın. Anahtarların bu şekilde ayrılması, kaynağa güvenli ve verimli erişim sağlar.
Azure OpenAI kaynak yapılandırma dosyaları oluşturma
eklemeler ve LLM olmak üzere iki farklı modeli yönetmek için ayrı yapılandırma dosyaları oluşturun. Bu yaklaşım, endişelerin netliğini ve ayrımını sağlayarak yapılandırmaları yönetmeyi ve korumayı kolaylaştırır.
Vektör deposu için ekleme yapılandırması
Azure AI Search vektör deposuna belge eklemeye yönelik eklemeler oluşturmak için bir yapılandırma dosyası oluşturun:
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'nin yanıt oluşturma yapılandırması
Büyük dil modelinden yanıtlar oluşturmak için bir yapılandırma dosyası oluşturun:
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,
};
Sabitler ve uyarılar
Yapay zeka uygulamaları genellikle sabit dizelere ve istemlere dayanır. Bu sabitleri ayrı dosyalarla yönetin.
Sistem istemini oluşturun:
export const SYSTEM_PROMPT = `Answer the query with a complete paragraph based on the following context:`;
Düğüm sabitlerini oluşturun:
export const ANSWER_NODE = "vector_store_retrieval";
export const DECISION_NODE = "requires_hr_documents";
export const START = "__start__";
export const END = "__end__";
Örnek kullanıcı sorguları oluşturun:
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?",
];
Belgeleri Azure AI Search'e yükleme
Belgeleri Azure AI Search'e yüklemek için LangChain.js kullanarak işlemi basitleştirin. PDF olarak depolanan belgeler eklemelere dönüştürülür ve vektör deposuna eklenir. Bu işlem, belgelerin verimli bir şekilde alınması ve sorgulanması için hazır olmasını sağlar.
Dikkat Edilmesi Gereken Önemli Noktalar:
- LangChain.js soyutlama: LangChain.js, şema tanımları ve istemci oluşturma gibi karmaşıklıkların büyük bir kısmını ele alır ve işlemi basit hale getirir.
- Azaltma ve yeniden deneme mantığı: Örnek kodda en az bekleme işlevi olsa da, üretim uygulamaları azaltma ve geçici hataları yönetmek için kapsamlı hata işleme ve yeniden deneme mantığı uygulamalıdır.
Belgeleri yükleme adımları
PDF Belgelerini bulun: Belgeler veri dizininde depolanır.
PDF'leri LangChain.jsyükleyin : Belgeleri yüklemek için
loadPdfsFromDirectory
fonksiyonunu kullanın. Bu işlev, her dosyayı okumak ve birPDFLoader.load
dizi döndürmek için LangChain.js topluluğununDocument[]
yöntemini kullanır. Bu dizi standart bir LangChain.js belge biçimidir.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 AI Search'e belge ekleme: Belge dizisini
loadDocsIntoAiSearchVector
Azure AI Search vektör deposuna göndermek için işlevini kullanın. Bu işlev, belgeleri işlemek için embeddings istemcisini kullanır ve hızı kontrol etmek amacıyla temel bir bekleme işlevi içerir. Üretim için sağlam bir yeniden deneme/geri alma mekanizması uygulayın.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; }
Aracı iş akışı oluşturma
LangChain.jsiçinde, langgraph ile LangChain.js aracısını oluşturun. LangGraph, düğümleri ve kenarları tanımlamanızı sağlar:
- Düğüm: işin gerçekleştirildiği yer.
- Edge: Düğümler arasındaki bağlantıyı tanımlar.
İş akışı bileşenleri
Bu uygulamada iki iş düğümü şunlardır:
- requiresHrResources: Sorunun Azure OpenAI Büyük Dil Modeli (LLM) kullanarak İK belgeleriyle ilgili olup olmadığını belirler.
- getAnswer: yanıtı alır. Yanıt, Azure AI Search'ten belge eklemelerini kullanan ve bunları Azure OpenAI LLM'ye gönderen LangChain.js bir retriever zincirinden gelir. Geri alma ile artırılmış oluşturmanın özü budur.
Kenarlar başlangıç, bitiş ve getAnswer düğümünü çağırmak için gereken koşulu tanımlar.
Grafiği dışarı aktarma
Grafiği çalıştırmak ve hatalarını ayıklamak için LangGraph Studio'yu kullanarak, onu kendi nesnesi olarak dışarı aktarın.
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 ve addConditionalEdges yöntemlerinde ilk parametre, grafik içindeki nesneyi tanımlamak için dize olarak bir addır. İkinci parametre, bu adımda çağrılması gereken işlev veya çağrılacak düğümün adıdır.
addEdge yöntemi için adı START (./src/config/nodes.ts dosyasında tanımlanan başlangıç) şeklindedir ve her zaman DECISION_NODE çağırır. Bu düğüm iki parametresiyle tanımlanır: birincisi adı, DECISION_NODE ve ikincisi requiresHrResources adlı işlevdir.
Ortak işlevsellik
Bu uygulama genel LangChain işlevselliği sağlar:
Durum yönetimi:
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: () => [], }), });
Yol sonlandırma:
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; };
Bu uygulama için tek özel yol routeRequiresHrResources yoludur. Bu yol requiresHrResources düğümünden gelen yanıtın kullanıcının sorusunun ANSWER_NODE düğümüne devam etmesi gerektiğini belirtip belirtmediğini belirlemek için kullanılır. Bu yol requiresHrResources çıkışını aldığından, aynı dosyadadır.
Azure OpenAI kaynaklarını tümleştirme
Azure OpenAI tümleştirmesi iki farklı model kullanır:
- Eklemeler: Belgeleri vektör deposuna eklemek için kullanılır.
- LLM: Vektör deposunu sorgulayarak ve yanıtlar oluşturarak soruları yanıtlamak için kullanılır.
Embeddings istemcisi ve LLM istemcisi farklı amaçlara hizmet eder. Bunları tek bir modele veya istemciye küçültmeyin.
Eklemeler modeli
Vektör deposundan belgeler alındığında embeddings istemcisi her zaman gereklidir. Geçici hataları işlemek için maxRetries yapılandırması içerir.
import { AzureOpenAIEmbeddings } from "@langchain/openai";
import { EMBEDDINGS_CONFIG } from "../config/embeddings.js";
export function getEmbeddingClient(): AzureOpenAIEmbeddings {
return new AzureOpenAIEmbeddings({ ...EMBEDDINGS_CONFIG, maxRetries: 1 });
}
LLM modeli
LLM modeli iki tür soruyu yanıtlamak için kullanılır:
- İK ile İlgililik: Kullanıcının sorusunun İK belgeleriyle ilgili olup olmadığını belirler.
- Yanıt oluşturma: Azure AI Search'ten alınan belgelerle genişletilen kullanıcının sorusuna bir yanıt sağlar.
Bir yanıt gerektiğinde LLM istemcisi oluşturulur ve çağrılır.
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 aracısı, sorunun İK belgelerine mi yönelik olduğunu veya iş akışının grafın sonuna mı yönlendirilmesi gerektiğini belirlemek için LLM'yi kullanır.
// @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 işlevi, içerikle güncelleştirilmiş HR resources required detected
durumda bir ileti ayarlar.
routeRequiresHrResources yönlendiricisi, iletilerin nereye gönderileceğini belirlemek için bu içeriği arar.
Vektör deposu için Azure AI Search kaynağını tümleştirme
Azure AI Search tümleştirmesi, LLM'nin getAnswer düğümü için yanıtı artırabilmesi için vektör deposu belgelerini sağlar. LangChain.js, gerekli kodun çok az olması için soyutlamanın büyük bir kısmını tekrar sağlar. İşlevler şunlardır:
- getReadOnlyVectorStore: sorgu anahtarıyla istemciyi alır.
- getDocsFromVectorStore: Kullanıcının sorusuyla ilgili belgeleri bulur.
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 tümleştirme kodu, vektör deposundan ilgili belgelerin alınmasını son derece kolaylaştırır.
LLM'den yanıt almak için kod yazma
Tümleştirme bileşenleri oluşturulduğuna göre, ilgili vektör deposu belgelerini almak ve LLM kullanarak bir yanıt oluşturmak için getAnswer işlevini oluşturun.
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],
};
}
Bu işlev, biri kullanıcının sorusu ve diğeri bağlam için olmak üzere iki yer tutucu içeren bir istem sağlar. Bağlam, AI arama vektör deposunda yer alan tüm ilgili belgelerdir. Bir LLM Zinciri oluşturmak için, isteği ve LLM istemcisini createStuffDocumentsChain'e geçirin. İstemi, ilgili belgeleri ve LLM'yi içeren bir zincir oluşturmak için LLM zincirini createRetrievalChain'e geçirin.
Yanıtı almak için zincirleri retrievalChain.invoke ve kullanıcının sorusunu girdiler olarak çalıştırın. Yanıtı mesajlar durumu içinde geri ver.
Aracı paketi oluştur
package.json üzerine TypeScript uygulamasını oluşturmak için bir komut dosyası ekleyin.
"build": "tsc",
LangChain.js aracısını oluşturun.
npm run build
İsteğe bağlı - LangChain Studio ile yerel geliştirmede LangChain.js aracısını çalıştırın
İsteğe bağlı olarak, yerel geliştirme için LangChain.js aracınızla çalışmak için LangChain Studio'yu kullanın.
Grafiği tanımlamak için bir
langgraph.json
dosya oluşturun.{ "dependencies": [], "graphs": { "agent": "./src/graph.ts:hr_documents_answer_graph" }, "env": "../.env" }
LangGraph CLI'yi yükleyin.
npm install @langchain/langgraph-cli --save-dev
package.json içinde LangGraph CLI'ya dosyayı geçirmek için bir betik oluşturun.
"studio": "npx @langchain/langgraph-cli dev",
CLI terminalinizde çalışır ve LangGraph Studio'ya bir tarayıcı açar.
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
LangGraph Studio'da LangChain.js aracısını görüntüleyin.
Kullanıcı sorusu eklemek için + İleti'yi ve ardından Gönder'i seçin.
Soru İnsan Kaynakları belgeleriyle ilgili Does the NorthWind Health plus plan cover eye exams?
Bu soru İK ile ilgilidir ve çalışan el kitabı, yan haklar el kitabı ve çalışan rol rehberi gibi İK belgelerinin bu soruyu yanıtlayabilmesi gerekir. What is included in the NorthWind Health plus plan that is not included in the standard?
Bu soru İK ile ilgilidir ve çalışan el kitabı, yan haklar el kitabı ve çalışan rol rehberi gibi İK belgelerinin bu soruyu yanıtlayabilmesi gerekir. How much of my perks + benefit have I spent
Bu soru genel, kişilik dışı İK belgeleriyle ilgili değildir. Bu soru, çalışan verilerine erişimi olan bir aracıya gönderilmelidir. Soru İK belgeleriyle ilgiliyse, DECISION_NODE ve ANSWER_NODE'dan geçmelidir.
LLM'ye soruyu ve LLM'den gelen yanıtı görmek için terminal çıkışını izleyin.
Soru İK belgeleriyle ilgili değilse, akış doğrudan sona gider.
LangChain.js aracısı yanlış bir karar veriyorsa sorun şu olabilir:
- Kullanılan LLM modeli
- Vektör deposundaki belge sayısı
- Karar düğümünde kullanılan istem.
LangChain.js aracısını bir uygulamadan çalıştırma
Web API'si gibi bir üst uygulamadan LangChain.js aracısını çağırmak için LangChain.js aracısının çağrısını sağlamanız gerekir.
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;
}
}
İki işlev şunlardır:
- ask_agent: Bu işlev durum döndürerek LangChain.js aracısını bir LangChain çok aracılı iş akışına eklemenize olanak tanır.
- get_answer: Bu işlev yalnızca yanıtın metnini döndürür. Bu işlev bir API'den çağrılabilir.
Sorun giderme
- Yordamla ilgili sorunlar için örnek kod deposunda bir sorun oluşturun
Kaynakları temizle
Azure AI Search kaynağını ve Azure OpenAI kaynağını içeren kaynak grubunu silin.