Constrói uma aplicação de tradução com o LangChain

Este artigo mostra-lhe como construir uma aplicação de tradução usando o Foundry Local SDK e o LangChain. Use um modelo local para traduzir texto entre línguas.

Pré-requisitos

Antes de começares este tutorial, precisas de:

  • Python 3.11 ou posterior instalado no seu computador. Pode descarregar Python do site oficial.

Repositório de samples

O código de exemplo completo deste artigo está disponível no repositório foundry-samples do GitHub. Para clonar o repositório e navegar até ao exemplo de uso:

git clone https://github.com/microsoft-foundry/foundry-samples.git
cd foundry-samples/samples/python/foundry-local/langchain-integration

Pacotes de instalação

Se estiver a desenvolver ou a enviar no Windows, selecione o separador Windows. O pacote Windows integra-se com o runtime Windows ML — fornece a mesma área de superfície da API com uma maior amplitude de aceleração por hardware.

pip install foundry-local-sdk-winml openai

Também precisa de instalar o seguinte pacote LangChain:

pip install langchain[openai]

Criar uma aplicação de tradução

Crie um novo ficheiro Python chamado translation_app.py no seu IDE favorito e adicione o seguinte código:

from foundry_local_sdk import Configuration, FoundryLocalManager
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser


# Initialize the Foundry Local SDK
config = Configuration(app_name="foundry_local_samples")
FoundryLocalManager.initialize(config)
manager = FoundryLocalManager.instance

# Download and register all execution providers.
current_ep = ""


def _ep_progress(ep_name: str, percent: float):
    global current_ep
    if ep_name != current_ep:
        if current_ep:
            print()
        current_ep = ep_name
    print(f"\r  {ep_name:<30}  {percent:5.1f}%", end="", flush=True)


manager.download_and_register_eps(progress_callback=_ep_progress)
if current_ep:
    print()

# Load a model
model = manager.catalog.get_model("qwen2.5-0.5b")
model.download(
    lambda progress: print(
        f"\rDownloading model: {progress:.2f}%",
        end="",
        flush=True,
    )
)
print()
model.load()
print("Model loaded.")

# Start the web service to expose an OpenAI-compatible endpoint
manager.start_web_service()
base_url = f"{manager.urls[0]}/v1"

# Create a LangChain ChatOpenAI instance pointing to the local endpoint
llm = ChatOpenAI(
    base_url=base_url,
    api_key="none",
    model=model.id,
)

# Create a translation chain
prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "You are a translator. Translate the following text to {language}. Only output the translation, nothing else.",
        ),
        ("user", "{text}"),
    ]
)

chain = prompt | llm | StrOutputParser()

# Run the chain
result = chain.invoke({"language": "Spanish", "text": "Hello, how are you today?"})
print(f"Translation: {result}")

# Clean up
model.unload()
manager.stop_web_service()

Referências

Nota

Um dos principais benefícios do Foundry Local é que seleciona automaticamente a variante de modelo mais adequada para o hardware do utilizador. Por exemplo, se o utilizador tiver uma GPU, descarrega a versão GPU do modelo. Se o utilizador tiver uma NPU (Unidade de Processamento Neural), descarrega a versão da NPU. Se o utilizador não tiver nem GPU nem NPU, descarrega a versão CPU do modelo.

Para executar a aplicação, abre um terminal e navega até ao diretório onde guardaste o translation_app.py ficheiro. Depois, execute o seguinte comando:

python translation_app.py

Terminas quando vês uma Response: linha com o texto traduzido.

Deverias ver resultados semelhantes a:

Translating 'I love to code.' to French...
Response: <translated text>

Pré-requisitos

Antes de começares este tutorial, precisas de:

  • Node.js 20 ou uma versão posterior instalada no teu computador. Pode descarregar Node.js no site oficial.

Repositório de samples

O código de exemplo completo deste artigo está disponível no repositório foundry-samples do GitHub. Para clonar o repositório e navegar até ao exemplo de uso:

git clone https://github.com/microsoft-foundry/foundry-samples.git
cd foundry-samples/samples/javascript/foundry-local/langchain-integration-example

Pacotes de instalação

Se estiver a desenvolver ou a enviar no Windows, selecione o separador Windows. O pacote Windows integra-se com o runtime Windows ML — fornece a mesma área de superfície da API com uma maior amplitude de aceleração por hardware.

npm install foundry-local-sdk-winml openai

Instalar pacotes LangChain

Também precisa de instalar os seguintes pacotes Node.js:

npm install @langchain/openai @langchain/core

Criar uma aplicação de tradução

Crie um novo ficheiro JavaScript nomeado translation_app.js no seu IDE favorito e adicione o seguinte código:

import { ChatOpenAI } from "@langchain/openai";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { FoundryLocalManager } from 'foundry-local-sdk';

// Initialize the Foundry Local SDK
console.log('Initializing Foundry Local SDK...');

const endpointUrl = 'http://localhost:5764';

const manager = FoundryLocalManager.create({
    appName: 'foundry_local_samples',
    logLevel: 'info',
    webServiceUrls: endpointUrl
});
console.log('✓ SDK initialized successfully');

// Download and register all execution providers.
let currentEp = '';
await manager.downloadAndRegisterEps((epName, percent) => {
    if (epName !== currentEp) {
        if (currentEp !== '') process.stdout.write('\n');
        currentEp = epName;
    }
    process.stdout.write(`\r  ${epName.padEnd(30)}  ${percent.toFixed(1).padStart(5)}%`);
});
if (currentEp !== '') process.stdout.write('\n');

// Get the model object
const modelAlias = 'qwen2.5-0.5b'; // Using an available model from the list above
const model = await manager.catalog.getModel(modelAlias);

// Download the model
console.log(`\nDownloading model ${modelAlias}...`);
await model.download((progress) => {
    process.stdout.write(`\rDownloading... ${progress.toFixed(2)}%`);
});
console.log('\n✓ Model downloaded');

// Load the model
console.log(`\nLoading model ${modelAlias}...`);
await model.load();
console.log('✓ Model loaded');

// Start the web service
console.log('\nStarting web service...');
manager.startWebService();
console.log('✓ Web service started');


// Configure ChatOpenAI to use your locally-running model
const llm = new ChatOpenAI({
    model: model.id,
    configuration: {
        baseURL: endpointUrl + '/v1',
        apiKey: 'notneeded'
    },
    temperature: 0.6,
    streaming: false
});

// Create a translation prompt template
const prompt = ChatPromptTemplate.fromMessages([
    {
        role: "system",
        content: "You are a helpful assistant that translates {input_language} to {output_language}."
    },
    {
        role: "user",
        content: "{input}"
    }
]);

// Build a simple chain by connecting the prompt to the language model
const chain = prompt.pipe(llm);

const input = "I love to code.";
console.log(`Translating '${input}' to French...`);

// Run the chain with your inputs
await chain.invoke({
    input_language: "English",
    output_language: "French",
    input: input
}).then(aiMsg => {
    // Print the result content
    console.log(`Response: ${aiMsg.content}`);
}).catch(err => {
    console.error("Error:", err);
});

// Tidy up
console.log('Unloading model and stopping web service...');
await model.unload();
manager.stopWebService();
console.log(`✓ Model unloaded and web service stopped`);

#To executar a aplicação, abrir um terminal e navegar até ao diretório onde guardou o translation_app.js ficheiro. Depois, execute o seguinte comando:

node translation_app.js

Terminas quando vês uma Response: linha com o texto traduzido.

Deverias ver resultados semelhantes a:

Translating 'I love to code.' to French...
Response: J'aime le coder

Resolução de problemas

  • Se detetar um erro na ligação ao serviço, reinicie o serviço local da Foundry e tente novamente.
  • A primeira execução pode demorar mais porque o Foundry Local pode fazer o download do modelo.
  • Se o Node.js falhar com um erro de importação ou await no nível superior, confirme que o seu projeto está configurado para módulos ES.