你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本文介绍如何将现有的 Azure AI 搜索索引与 Azure AI 搜索工具配合使用。
先决条件
完成 Azure AI 搜索工具设置。
创建 Azure AI 客户端
首先,使用项目的终结点创建 Azure AI 客户端。
import os
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
# Retrieve the endpoint from environment variables
project_endpoint = os.environ["PROJECT_ENDPOINT"]
# Initialize the AIProjectClient
project_client = AIProjectClient(
endpoint=project_endpoint,
credential=DefaultAzureCredential(exclude_interactive_browser_credential=False),
api_version="latest",
)
配置 Azure AI 搜索工具
使用 Azure AI 搜索资源的连接 ID,将 Azure AI 搜索工具配置为使用 Azure AI 搜索索引。
from azure.ai.agents.models import AzureAISearchTool, AzureAISearchQueryType
from azure.ai.projects.models import ConnectionType
# Define the Azure AI Search connection ID and index name
azure_ai_conn_id = project_client.connections.get_default(ConnectionType.AZURE_AI_SEARCH).id
# find the index name in your AI Search Azure resource page under Search Management -> Indexes
index_name = "sample_index"
# Initialize the Azure AI Search tool
ai_search = AzureAISearchTool(
index_connection_id=azure_ai_conn_id,
index_name=index_name,
query_type=AzureAISearchQueryType.SIMPLE, # Use SIMPLE query type
top_k=3, # Retrieve the top 3 results
filter="", # Optional filter for search results
)
使用已启用 Azure AI 搜索工具创建代理
使用附加的 Azure AI 搜索工具创建代理。 将模型更改为项目中部署的模型。
# Define the model deployment name
model_deployment_name = os.environ["MODEL_DEPLOYMENT_NAME"]
# Create an agent with the Azure AI Search tool
agent = project_client.agents.create_agent(
model=model_deployment_name,
name="my-agent",
instructions="You are a helpful agent",
tools=ai_search.definitions,
tool_resources=ai_search.resources,
)
print(f"Created agent, ID: {agent.id}")
向代理询问索引中的数据
创建代理后,请询问有关 Azure AI 搜索索引中的数据的问题。
from azure.ai.agents.models import MessageRole, ListSortOrder
# Create a thread for communication
thread = project_client.agents.threads.create()
print(f"Created thread, ID: {thread.id}")
# Send a message to the thread
message = project_client.agents.messages.create(
thread_id=thread.id,
role=MessageRole.USER,
content="What is the temperature rating of the cozynights sleeping bag?",
)
print(f"Created message, ID: {message['id']}")
# Create and process a run with the specified thread and agent
run = project_client.agents.runs.create_and_process(thread_id=thread.id, agent_id=agent.id)
print(f"Run finished with status: {run.status}")
# Check if the run failed
if run.status == "failed":
print(f"Run failed: {run.last_error}")
# Fetch and log all messages in the thread
messages = project_client.agents.messages.list(thread_id=thread.id, order=ListSortOrder.ASCENDING)
for message in messages.data:
print(f"Role: {message.role}, Content: {message.content}")
清理资源
完成作后,删除代理以清理资源。
# Delete the agent
project_client.agents.delete_agent(agent.id)
print("Deleted agent")
创建项目客户端
创建一个客户端对象,其中包含用于连接到 AI 项目和其他资源的项目终结点。
using Azure;
using Azure.AI.Agents.Persistent;
using Azure.Identity;
using Microsoft.Extensions.Configuration;
using System;
using System.Threading;
// Get Connection information from app configuration
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.Build();
var projectEndpoint = configuration["ProjectEndpoint"];
var modelDeploymentName = configuration["ModelDeploymentName"];
var azureAiSearchConnectionId = configuration["AzureAiSearchConnectionId"];
// Create the Agent Client
PersistentAgentsClient agentClient = new(projectEndpoint, new DefaultAzureCredential());
配置 Azure AI 搜索工具
使用 AI 搜索连接 ID,将 Azure AI 搜索工具配置为使用 Azure AI 搜索索引。
AzureAISearchToolResource searchResource = new(
indexConnectionId: azureAiSearchConnectionId,
indexName: "sample_index",
topK: 5,
filter: "category eq 'sleeping bag'",
queryType: AzureAISearchQueryType.Simple
);
ToolResources toolResource = new() { AzureAISearch = searchResource };
使用已启用 Azure AI 搜索工具创建代理
将模型更改为项目中部署的模型。 可以在“模型”选项卡下的 Azure AI Foundry 中找到模型名称。还可以更改代理的名称和说明,以满足你的需求。
// Create an agent with Tools and Tool Resources
PersistentAgent agent = agentClient.Administration.CreateAgent(
model: modelDeploymentName,
name: "my-agent",
instructions: "Use the index provided to answer questions.",
tools: [new AzureAISearchToolDefinition()],
toolResources: toolResource
);
向代理询问索引中的数据
创建代理后,请询问有关 Azure AI 搜索索引中的数据的问题。
// Create thread for communication
PersistentAgentThread thread = agentClient.Threads.CreateThread();
// Create message and run the agent
PersistentThreadMessage message = agentClient.Messages.CreateMessage(
thread.Id,
MessageRole.User,
"What is the temperature rating of the cozynights sleeping bag?");
ThreadRun run = agentClient.Runs.CreateRun(thread, agent);
等待代理完成并打印输出
等待代理完成运行并将输出输出打印到控制台。
// Wait for the agent to finish running
do
{
Thread.Sleep(TimeSpan.FromMilliseconds(500));
run = agentClient.Runs.GetRun(thread.Id, run.Id);
}
while (run.Status == RunStatus.Queued
|| run.Status == RunStatus.InProgress);
// Confirm that the run completed successfully
if (run.Status != RunStatus.Completed)
{
throw new Exception("Run did not complete successfully, error: " + run.LastError?.Message);
}
// Retrieve the messages from the agent client
Pageable<PersistentThreadMessage> messages = agentClient.Messages.GetMessages(
threadId: thread.Id,
order: ListSortOrder.Ascending
);
// Process messages in order
foreach (PersistentThreadMessage threadMessage in messages)
{
Console.Write($"{threadMessage.CreatedAt:yyyy-MM-dd HH:mm:ss} - {threadMessage.Role,10}: ");
foreach (MessageContent contentItem in threadMessage.ContentItems)
{
if (contentItem is MessageTextContent textItem)
{
// We need to annotate only Agent messages.
if (threadMessage.Role == MessageRole.Agent && textItem.Annotations.Count > 0)
{
string annotatedText = textItem.Text;
// If we have Text URL citation annotations, reformat the response to show title & URL for citations
foreach (MessageTextAnnotation annotation in textItem.Annotations)
{
if (annotation is MessageTextUriCitationAnnotation urlAnnotation)
{
annotatedText = annotatedText.Replace(
urlAnnotation.Text,
$" [see {urlAnnotation.UriCitation.Title}] ({urlAnnotation.UriCitation.Uri})");
}
}
Console.Write(annotatedText);
}
else
{
Console.Write(textItem.Text);
}
}
else if (contentItem is MessageImageFileContent imageFileItem)
{
Console.Write($"<image from ID: {imageFileItem.FileId}");
}
Console.WriteLine();
}
}
(可选)输出代理使用的运行步骤
// Retrieve the run steps used by the agent and print those to the console
Console.WriteLine("Run Steps used by Agent:");
Pageable<RunStep> runSteps = agentClient.Runs.GetRunSteps(run);
foreach (var step in runSteps)
{
Console.WriteLine($"Step ID: {step.Id}, Total Tokens: {step.Usage.TotalTokens}, Status: {step.Status}, Type: {step.Type}");
if (step.StepDetails is RunStepMessageCreationDetails messageCreationDetails)
{
Console.WriteLine($" Message Creation Id: {messageCreationDetails.MessageCreation.MessageId}");
}
else if (step.StepDetails is RunStepToolCallDetails toolCallDetails)
{
// We know this agent only has the AI Search tool, so we can cast it directly
foreach (RunStepAzureAISearchToolCall toolCall in toolCallDetails.ToolCalls)
{
Console.WriteLine($" Tool Call Details: {toolCall.GetType()}");
foreach (var result in toolCall.AzureAISearch)
{
Console.WriteLine($" {result.Key}: {result.Value}");
}
}
}
}
清理资源
请清理此示例中的资源。
// Clean up resources
agentClient.Threads.DeleteThread(thread.Id);
agentClient.Administration.DeleteAgent(agent.Id);
创建 Azure AI 客户端
首先,使用项目的终结点创建 Azure AI 客户端。
const projectEndpoint = process.env["PROJECT_ENDPOINT"];
if (!projectString) {
throw new Error("AZURE_AI_PROJECTS_CONNECTION_STRING must be set in the environment variables");
}
const client = new AgentsClient(projectEndpoint, new DefaultAzureCredential());
配置 Azure AI 搜索工具
使用 Azure AI 搜索资源的连接 ID,将 Azure AI 搜索工具配置为使用 Azure AI 搜索索引。
const connectionId = process.env["AZURE_AI_CONNECTION_ID"] || "<connection-name>";
const azureAISearchTool = ToolUtility.createAzureAISearchTool(connectionId, "ai-search-sample", {
queryType: "simple",
topK: 3,
filter: "",
indexConnectionId: "",
indexName: "",
});
使用已启用 Azure AI 搜索工具创建代理
将模型更改为项目中部署的模型。 可以在“模型”选项卡下的 Azure AI Foundry 中找到模型名称。还可以更改代理的名称和说明,以满足你的需求。
const agent = await client.agents.createAgent("gpt-4o-mini", {
name: "my-agent",
instructions: "You are a helpful agent",
tools: [azureAISearchTool.definition],
toolResources: azureAISearchTool.resources,
});
console.log(`Created agent, agent ID : ${agent.id}`);
向代理询问索引中的数据
创建代理后,请询问有关 Azure AI 搜索索引中的数据的问题。
// Create thread for communication
const thread = await client.threads.create();
console.log(`Created thread, thread ID: ${thread.id}`);
// Create message to thread
const message = await client.messages.create(
thread.id,
"user",
"What is the temperature rating of the cozynights sleeping bag?",
);
console.log(`Created message, message ID : ${message.id}`);
// Create and process agent run in thread with tools
let run = await client.runs.create(thread.id, agent.id);
while (run.status === "queued" || run.status === "in_progress") {
await delay(1000);
run = await client.runs.get(thread.id, run.id);
}
if (run.status === "failed") {
console.log(`Run failed:`, JSON.stringify(run, null, 2));
}
console.log(`Run finished with status: ${run.status}`);
// Fetch run steps to get the details of agent run
const runSteps = await client.runSteps.list(thread.id, run.id);
for await (const step of runSteps) {
console.log(`Step ID: ${step.id}, Status: ${step.status}`);
const stepDetails = step.stepDetails;
if (isOutputOfType(stepDetails, "tool_calls")) {
const toolCalls = stepDetails.toolCalls;
for (const toolCall of toolCalls) {
console.log(`Tool Call ID: ${toolCall.id}, Tool type: ${toolCall.type}`);
if (isOutputOfType(toolCall, "azure_ai_search")) {
{
const azureAISearch = toolCall.azureAISearch;
if (azureAISearch) {
console.log(`Azure AI Search Tool Call input: ${azureAISearch.input}`);
console.log(`Azure AI Search Tool Call output: ${azureAISearch.output}`);
}
}
}
}
}
}
// Delete the assistant when done
await client.deleteAgent(agent.id);
console.log(`Deleted agent, agent ID: ${agent.id}`);
// Fetch and log all messages
const messagesIterator = client.messages.list(thread.id);
console.log(`Messages:`);
// Get the first message
for await (const m of messagesIterator) {
if (m.content.length > 0) {
const agentMessage = m.content[0];
if (isOutputOfType(agentMessage, "text")) {
const textContent = agentMessage;
console.log(`Text Message Content - ${textContent.text.value}`);
}
}
break; // Just process the first message
}
请按照 REST API 快速入门 为环境变量 AGENT_TOKEN
、AZURE_AI_FOUNDRY_PROJECT_ENDPOINT
和 API_VERSION
设置正确的值。
获取 Azure AI 搜索资源的连接 ID
若要获取连接 ID,请导航到 Azure AI Foundry 中的项目,然后单击 “已连接资源 ”选项卡,然后选择 Azure AI 搜索资源。
在 URL 中,可以看到 wsid=/subscription/your-subscription-id...
,这是需要使用的连接 ID。 复制wsid=
之后的所有内容。
配置 Azure AI 搜索工具
使用上一步骤中获取的连接 ID,现在可以将 Azure AI 搜索工具配置为使用 Azure AI 搜索索引。
curl --request POST \
--url $AZURE_AI_FOUNDRY_PROJECT_ENDPOINT/assistants?api-version=$API_VERSION \
-H "Authorization: Bearer $AGENT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"instructions": "You are a helpful agent.",
"name": "my-agent",
"tools": [
{"type": "azure_ai_search"}
],
"model": "gpt-4o-mini",
"tool_resources": {
"azure_ai_search": {
"indexes": [
{
"index_connection_id": "/subscriptions/<your-subscription-id>/resourceGroups/<your-resource-group>/providers/Microsoft.MachineLearningServices/workspaces/<your-project-name>/connections/<your-azure-ai-search-connection-name>",
"index_name": "<your-index-name>",
"query_type": "semantic"
}
]
}
}
}'
向代理询问索引中的数据
创建代理后,请询问有关 Azure AI 搜索索引中的数据的问题。
创建线程
curl --request POST \
--url $AZURE_AI_FOUNDRY_PROJECT_ENDPOINT/threads?api-version=$API_VERSION \
-H "Authorization: Bearer $AGENT_TOKEN" \
-H "Content-Type: application/json" \
-d ''
将用户问题添加到线程
curl --request POST \
--url $AZURE_AI_FOUNDRY_PROJECT_ENDPOINT/threads/thread_abc123/messages?api-version=$API_VERSION \
-H "Authorization: Bearer $AGENT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"role": "user",
"content": "what are my health insurance plan coverage types?"
}'
运行线程
curl --request POST \
--url $AZURE_AI_FOUNDRY_PROJECT_ENDPOINT/threads/thread_abc123/runs?api-version=$API_VERSION \
-H "Authorization: Bearer $AGENT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"assistant_id": "asst_abc123",
}'
获取运行状态
curl --request GET \
--url $AZURE_AI_FOUNDRY_PROJECT_ENDPOINT/threads/thread_abc123/runs/run_abc123?api-version=$API_VERSION \
-H "Authorization: Bearer $AGENT_TOKEN"
检索代理响应
curl --request GET \
--url $AZURE_AI_FOUNDRY_PROJECT_ENDPOINT/threads/thread_abc123/messages?api-version=$API_VERSION \
-H "Authorization: Bearer $AGENT_TOKEN"