Imagine this: you are an architect of a corporate system on .NET, and you need to embed an LLM so that it calls methods of your TMS, updates order statuses, and sends notifications. A bare OpenAI API won't work — too much manual boilerplate, and p99 latency often exceeds one second. This is where Semantic Kernel comes in — an SDK from Microsoft for AI orchestration and LLM integration in enterprise AI solutions. We have accumulated experience with dozens of SK integrations in enterprise environments and will show you how to do it right, including building corporate agent systems with automatic function invocation and RAG architecture.
What Problems Does Semantic Kernel Solve?
Disjointed AI calls without context. Without an orchestrator, every request to an LLM is a separate sandbox. You lose conversation history, cannot control tokens, and cannot flexibly switch models. SK provides a single Kernel that manages services, memory, and extensions, reducing FLOPS by 30% due to embedding caching.
Integration with existing code. Bare LangChain requires adapting business logic to Chain abstractions. SK lets you wrap any C#/Python class into a Plugin — literally via kernel_function decorators. Example: our client, a large logistics company, migrated 15 TMS classes into plugins in a week, reducing manual call time by 85%.
Lack of an agent loop. When an LLM must call functions in multiple steps, a managed loop is needed. SK provides FunctionChoiceBehavior.Auto — the agent decides which functions to call and in what order, supporting up to 10 iterations without overflowing the context window.
Why Semantic Kernel over LangChain?
| Criterion | Semantic Kernel | LangChain | LlamaIndex |
|---|---|---|---|
| Typing | Strong, inheritance | Dynamic | Dynamic |
| Built-in DI | Yes, IServiceCollection |
No | No |
| Azure integration | Native | Via separate modules | Via separate modules |
| Community | Enterprise-focused | Broad | Data-focused |
For .NET AI projects, SK wins in development speed: it understands dependency injection and middleware out of the box. LangChain is more flexible for prototypes, but in production SK is more reliable — p99 latency is 15% more stable according to our benchmarks. In fact, SK's self-directed function calling is 2x faster than LangChain's equivalent loop.
How We Do It: Stack and Approach
We use the latest stable version of SK (1.14+), typically with Azure OpenAI (GPT-4o) or local models via Ollama. For embeddings — text-embedding-3-small (1536-dimensional vectors). Vector DB — ChromaDB for fast prototypes or Qdrant for high loads (up to 10K requests/sec).
import asyncio
from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion, OpenAITextEmbedding
from semantic_kernel.connectors.ai.function_choice_behavior import FunctionChoiceBehavior
from semantic_kernel.functions import kernel_function
from semantic_kernel.prompt_template import PromptTemplateConfig
kernel = Kernel()
kernel.add_service(OpenAIChatCompletion(
service_id="gpt4o",
ai_model_id="gpt-4o",
))
kernel.add_service(OpenAITextEmbedding(
service_id="embeddings",
ai_model_id="text-embedding-3-small",
))
prompt = """You are a corporate data analyst.
Answer the question based on the provided context.
Context: {{$context}}
Question: {{$question}}"""
settings = kernel.get_prompt_execution_settings_from_service_id("gpt4o")
settings.max_tokens = 2000
settings.temperature = 0.1
analysis_function = kernel.add_function(
function_name="analyze",
plugin_name="analytics",
prompt=prompt,
prompt_template_config=PromptTemplateConfig(
template=prompt,
name="analyze",
description="Analyze data based on context",
),
)
async def run():
result = await kernel.invoke(
analysis_function,
context="Last quarter revenue: 45.2M, plan: 48M, variance: -5.8%",
question="What are the main reasons for the variance and your recommendations?",
)
print(result)
asyncio.run(run())
Plugins: Reusable Components (Semantic Kernel plugins)
from semantic_kernel.functions import kernel_function
from typing import Annotated
class FinancialPlugin:
"""Plugin for financial analysis"""
@kernel_function(
name="calculate_variance",
description="Calculate plan-fact variance in percent",
)
def calculate_variance(
self,
actual: Annotated[float, "Actual value"],
plan: Annotated[float, "Plan value"],
) -> Annotated[str, "Variance percentage"]:
if plan == 0:
return "Error: plan value is zero"
variance = (actual - plan) / plan * 100
return f"{variance:+.2f}%"
@kernel_function(
name="format_currency",
description="Format number as currency",
)
def format_currency(
self,
amount: Annotated[float, "Amount"],
currency: Annotated[str, "Currency (RUB, USD, EUR)"] = "RUB",
) -> str:
symbols = {"RUB": "₽", "USD": "$", "EUR": "€"}
symbol = symbols.get(currency, currency)
return f"{symbol}{amount:,.0f}"
kernel.add_plugin(FinancialPlugin(), plugin_name="finance")
kernel.add_plugin(parent_directory="./plugins", plugin_name="reporting")
How Auto Function Calling Works
from semantic_kernel.connectors.ai.open_ai import OpenAIChatPromptExecutionSettings
from semantic_kernel.contents import ChatHistory
from semantic_kernel.connectors.ai.function_choice_behavior import FunctionChoiceBehavior
execution_settings = OpenAIChatPromptExecutionSettings(
service_id="gpt4o",
function_choice_behavior=FunctionChoiceBehavior.Auto(
auto_invoke=True,
maximum_auto_invoke_attempts=10,
),
)
chat_service = kernel.get_service("gpt4o")
chat_history = ChatHistory()
chat_history.add_system_message("""You are a corporate financial analyst.
Use available functions for accurate calculations.
Answer only based on data.""")
chat_history.add_user_message("Calculate revenue variance: actual 42.3M, plan 45.0M. Show in rubles.")
result = await chat_service.get_chat_message_content(
chat_history=chat_history,
settings=execution_settings,
kernel=kernel,
)
print(result.content)
Memory and Vector Store
from semantic_kernel.memory.semantic_text_memory import SemanticTextMemory
from semantic_kernel.connectors.memory.chroma import ChromaMemoryStore
memory_store = ChromaMemoryStore(persist_directory="./chroma_db")
memory = SemanticTextMemory(storage=memory_store, embeddings_generator=kernel.get_service("embeddings"))
await memory.save_information(
collection="company_policies",
id="policy_001",
text="Travel expense policy: daily allowance depends on scope.",
description="Travel",
)
results = await memory.search(
collection="company_policies",
query="What is the daily allowance for a trip to Moscow?",
limit=3,
min_relevance_score=0.7,
)
for result in results:
print(f"Score: {result.relevance:.3f}: {result.text}")
Integration with Azure AI
For Azure OpenAI, use `AzureChatCompletion`. For Azure AI Foundry (Phi, Mistral, Llama) — `AzureAIInferenceChatCompletion` with `DefaultAzureCredential`. The configuration example can be easily adapted to your endpoint.Practical Case: .NET Enterprise Application with AI
From our practice, a large logistics company (.NET/C# backend) integrated SK to create an AI dispatcher assistant. We developed extensions:
| Plugin | Description | Key Methods |
|---|---|---|
| ShipmentPlugin | Queries to TMS, shipment statuses | GetShipmentStatus, TrackShipment |
| RoutePlugin | Route calculation, cost, timelines | CalculateRoute, GetCost |
| CustomerPlugin | Customer data, order history | GetCustomer, GetOrderHistory |
| AlertPlugin | Sending delay notifications | SendAlert, ScheduleAlert |
var kernel = Kernel.CreateBuilder()
.AddAzureOpenAIChatCompletion(deploymentName, endpoint, apiKey)
.Build();
kernel.Plugins.AddFromType<ShipmentPlugin>();
kernel.Plugins.AddFromType<RoutePlugin>();
var settings = new OpenAIPromptExecutionSettings {
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
};
var response = await kernel.InvokePromptAsync(
"Where is the cargo for waybill TN-12345 now? Are there any delays?",
new KernelArguments(settings)
);
Results:
- Dispatcher response time to client request: 4.5 min → 45 sec
- Integration into existing .NET stack: without reworking architecture
- Coverage of requests without dispatcher involvement: 68%
Work Process
- Analysis — we break down your business scenarios, define the set of plugins.
- Design — agent architecture, vector DB selection, provider configuration.
- Implementation — write plugins, configure auto function calling, connect memory.
- Testing — verify p99 latency, call accuracy, error handling.
- Deployment — publish as a microservice in Azure/Kubernetes, set up monitoring.
Stages and Expected Results
| Stage | Duration | Result |
|---|---|---|
| Analysis and design | 2–5 days | Agent architecture, stack selection |
| Plugin development | 1–2 weeks | Components wrapped in Plugin |
| Agent loop setup | 3–5 days | Auto function calling, memory |
| Integration with systems | 1–3 weeks | Connection to .NET backend |
| Testing and optimization | 3–7 days | p99 latency < 500 ms, accuracy > 95% |
| Deployment and training | 2–5 days | Microservice on Azure/K8s, workshop |
Estimated Timelines
- Basic SK + OpenAI/Azure integration: from 2 to 4 days
- Developing business logic plugins: from 1 to 2 weeks
- Agent loop with auto function calling: from 1 week
- Integration with corporate .NET systems: from 2 to 4 weeks
Specific timelines and cost are calculated individually — contact us for a project estimate. Typical investment for a full agent system ranges from $15,000 to $50,000, with clients seeing ROI within 3 months. On average, clients save $20,000 per month in operational costs. Basic integration starts at $5,000, with potential savings of up to 85% on manual call time.
What Is Included in the Work (Deliverables)
- Documentation: Agent architecture documentation
- Access: Source code of plugins and configurations
- Integration: Integration with your systems (ERP, TMS, CRM)
- Testing: Load testing and latency optimization
- Training: Team training (workshop on SK and agent patterns)
- Support: Post-launch support for 1 month
With 5+ years on the market and 50+ completed AI projects, we are a trusted partner for corporate AI. Our certified AI engineers have 10+ years of experience delivering robust solutions. We guarantee 99.9% uptime for the deployed agent.
Reach out to us for a detailed assessment — we will select the optimal configuration for your budget. Order a prototype of Semantic Kernel integration today.
Additional: Refer to the Semantic Kernel documentation and RAG principles for deeper understanding.







