Разработка приложений с помощью семантического ядра и Azure AI Foundry
В этой статье вы узнаете, как использовать семантические ядра с моделями, развернутыми из каталога моделей ИИ Azure на портале Azure AI Foundry.
Необходимые компоненты
Проект ИИ Azure, как описано на портале Azure AI Foundry.
Модель, поддерживающая развернутый API вывода модели ИИ Azure. В этом примере мы используем
Mistral-Large
развертывание, но используйте любую модель вашего предпочтения. Для использования возможностей внедрения в LlamaIndex требуется модель внедрения, напримерcohere-embed-v3-multilingual
.- Инструкции по развертыванию моделей можно выполнить в качестве бессерверных API.
Python 3.10 или более поздней версии, включая pip.
Установленное семантическое ядро. Это можно сделать с помощью:
pip install semantic-kernel
В этом примере мы работаем с API вывода модели ИИ Azure, поэтому мы устанавливаем соответствующие зависимости Azure. Это можно сделать с помощью:
pip install semantic-kernel[azure]
Настройка среды
Чтобы использовать LLM, развернутые на портале Azure AI Foundry, вам потребуется конечная точка и учетные данные для подключения к нему. Выполните следующие действия, чтобы получить необходимые сведения из модели, которую вы хотите использовать:
Перейдите на портал Azure AI Foundry.
Откройте проект, в котором развернута модель, если она еще не открыта.
Перейдите к моделям и конечным точкам и выберите развернутую модель, как указано в предварительных требованиях.
Скопируйте URL-адрес конечной точки и ключ.
Совет
Если модель была развернута с поддержкой идентификатора Microsoft Entra ID, вам не нужен ключ.
В этом сценарии мы помещали URL-адрес конечной точки и ключ в следующие переменные среды:
export AZURE_AI_INFERENCE_ENDPOINT="<your-model-endpoint-goes-here>"
export AZURE_AI_INFERENCE_API_KEY="<your-key-goes-here>"
После настройки создайте клиент для подключения к конечной точке:
from semantic_kernel.connectors.ai.azure_ai_inference import AzureAIInferenceChatCompletion
chat_completion_service = AzureAIInferenceChatCompletion(ai_model_id="<deployment-name>")
Совет
Клиент автоматически считывает переменные AZURE_AI_INFERENCE_ENDPOINT
среды и AZURE_AI_INFERENCE_API_KEY
подключается к модели. Однако вы также можете передать конечную точку и ключ непосредственно клиенту через endpoint
конструктор и api_key
параметры.
Кроме того, если конечная точка поддерживает идентификатор Microsoft Entra, можно использовать следующий код для создания клиента:
export AZURE_AI_INFERENCE_ENDPOINT="<your-model-endpoint-goes-here>"
from semantic_kernel.connectors.ai.azure_ai_inference import AzureAIInferenceChatCompletion
chat_completion_service = AzureAIInferenceChatCompletion(ai_model_id="<deployment-name>")
Примечание.
При использовании идентификатора Microsoft Entra убедитесь, что конечная точка была развернута с помощью этого метода проверки подлинности и у вас есть необходимые разрешения для вызова.
Модели Azure OpenAI
Если вы используете модель Azure OpenAI, можно использовать следующий код для создания клиента:
from azure.ai.inference.aio import ChatCompletionsClient
from azure.identity.aio import DefaultAzureCredential
from semantic_kernel.connectors.ai.azure_ai_inference import AzureAIInferenceChatCompletion
chat_completion_service = AzureAIInferenceChatCompletion(
ai_model_id="<deployment-name>",
client=ChatCompletionsClient(
endpoint=f"{str(<your-azure-open-ai-endpoint>).strip('/')}/openai/deployments/{<deployment_name>}",
credential=DefaultAzureCredential(),
credential_scopes=["https://cognitiveservices.azure.com/.default"],
),
)
Параметры вывода
Вы можете настроить способ вывода с помощью AzureAIInferenceChatPromptExecutionSettings
класса:
from semantic_kernel.connectors.ai.azure_ai_inference import AzureAIInferenceChatPromptExecutionSettings
execution_settings = AzureAIInferenceChatPromptExecutionSettings(
max_tokens=100,
temperature=0.5,
top_p=0.9,
# extra_parameters={...}, # model-specific parameters
)
Вызов службы
Сначала вызовем службу завершения чата с простым журналом чата:
Совет
Семантический ядро — это асинхронная библиотека, поэтому для выполнения кода необходимо использовать асинхронную библиотеку.
import asyncio
async def main():
...
if __name__ == "__main__":
asyncio.run(main())
from semantic_kernel.contents.chat_history import ChatHistory
chat_history = ChatHistory()
chat_history.add_user_message("Hello, how are you?")
response = await chat_completion_service.get_chat_message_content(
chat_history=chat_history,
settings=execution_settings,
)
print(response)
Кроме того, можно передавать ответ от службы:
chat_history = ChatHistory()
chat_history.add_user_message("Hello, how are you?")
response = chat_completion_service.get_streaming_chat_message_content(
chat_history=chat_history,
settings=execution_settings,
)
chunks = []
async for chunk in response:
chunks.append(chunk)
print(chunk, end="")
full_response = sum(chunks[1:], chunks[0])
Создание длительной беседы
Вы можете создать длительный диалог с помощью цикла:
while True:
response = await chat_completion_service.get_chat_message_content(
chat_history=chat_history,
settings=execution_settings,
)
print(response)
chat_history.add_message(response)
chat_history.add_user_message(user_input = input("User:> "))
Если вы выполняете потоковую передачу ответа, можно использовать следующий код:
while True:
response = chat_completion_service.get_streaming_chat_message_content(
chat_history=chat_history,
settings=execution_settings,
)
chunks = []
async for chunk in response:
chunks.append(chunk)
print(chunk, end="")
full_response = sum(chunks[1:], chunks[0])
chat_history.add_message(full_response)
chat_history.add_user_message(user_input = input("User:> "))
Использование моделей внедрения
Настройте среду аналогично предыдущим шагам, но используйте AzureAIInferenceEmbeddings
класс:
from semantic_kernel.connectors.ai.azure_ai_inference import AzureAIInferenceTextEmbedding
embedding_generation_service = AzureAIInferenceTextEmbedding(ai_model_id="<deployment-name>")
В следующем коде показано, как получить внедрение из службы:
embeddings = await embedding_generation_service.generate_embeddings(
texts=["My favorite color is blue.", "I love to eat pizza."],
)
for embedding in embeddings:
print(embedding)