← 返回首页
🧠

LLM Microsoft Teams集成

📂 llm ⏱ 2 min 333 words

--- title: "LLM Microsoft Teams集成" description: "详细介绍大语言模型与Microsoft Teams的集成方案,包括智能助手开发、会议摘要和协作增强" tags: ["Microsoft Teams", "LLM集成", "智能助手", "会议摘要", "协作"] category: "llm" icon: "🧠"

LLM Microsoft Teams集成

Microsoft Teams是企业协作的重要平台,集成了聊天、会议、文件共享和应用集成功能。将大语言模型(LLM)与Teams结合,可以构建智能助手Bot,自动生成会议摘要、增强团队协作、提升工作效率。本文将从Bot框架、会议摘要和协作增强三个方面深入讲解集成方案。

Teams Bot开发框架

Microsoft Teams提供了完善的Bot Framework SDK,支持多种编程语言。构建LLM驱动的Teams Bot需要注册Azure AD应用,配置Bot Framework注册,并实现消息处理逻辑。

from botbuilder.core import ActivityHandler, MessageFactory
from botbuilder.schema import ChannelAccount
import openai
import os

class LLMBot(ActivityHandler):
    def __init__(self):
        super().__init__()
        self.openai_client = openai.OpenAI(api_key=os.environ["OPENAI_API_KEY"])
    
    async def on_message_activity(self, turn_context):
        user_message = turn_context.activity.text
        
        if "@LLMBot" in user_message:
            clean_message = user_message.replace("@LLMBot", "").strip()
            response = self.openai_client.chat.completions.create(
                model="gpt-4",
                messages=[
                    {"role": "system", "content": "你是Teams团队的智能助手。"},
                    {"role": "user", "content": clean_message}
                ],
                max_tokens=1000
            )
            reply = MessageFactory.text(response.choices[0].message.content)
            await turn_context.send_activity(reply)
    
    async def on_members_added_activity(self, members_added, turn_context):
        for member in members_added:
            if member.id != turn_context.activity.recipient.id:
                welcome = MessageFactory.text("你好!我是AI助手,可以直接向我提问。")
                await turn_context.send_activity(welcome)

Bot Framework SDK的ActivityHandler类提供了消息处理的生命周期钩子。通过重写on_message_activity方法,可以拦截用户消息,提取@提及后的内容发送给LLM处理。on_members_added_activity用于在用户加入团队时发送欢迎消息。

会议摘要自动生成

Teams会议的核心痛点是会后整理会议纪要。通过LLM集成,可以自动录制会议内容,生成结构化的会议摘要、行动项列表和决策记录。

from botbuilder.core import TurnContext
import json
from datetime import datetime

class MeetingSummarizer:
    def __init__(self, llm_client, teams_client):
        self.llm = llm_client
        self.teams = teams_client
    
    def summarize_meeting(self, transcript, meeting_title, attendees):
        prompt = f"""请将以下会议记录整理为结构化摘要:

会议标题:{meeting_title}
参会人员:{', '.join(attendees)}
会议时间:{datetime.now().strftime('%Y-%m-%d %H:%M')}

会议记录:
{transcript}

请输出以下格式:
1. 会议摘要(3-5句话)
2. 关键决策
3. 行动项(负责人+截止日期)
4. 待讨论事项"""
        
        response = self.llm.chat.completions.create(
            model="gpt-4",
            messages=[{"role": "user", "content": prompt}],
            max_tokens=1500
        )
        return response.choices[0].message.content
    
    async def post_summary_to_channel(self, channel_id, summary, meeting_title):
        card = {
            "type": "message",
            "attachments": [{
                "contentType": "application/vnd.microsoft.card.adaptive",
                "content": {
                    "type": "AdaptiveCard",
                    "body": [
                        {"type": "TextBlock", "text": f"📋 {meeting_title} 会议摘要", "weight": "Bolder"},
                        {"type": "TextBlock", "text": summary, "wrap": True}
                    ]
                }
            }]
        }
        await self.teams.send_to_conversation(channel_id, card)

通过MeetingSummarizer类,系统可以接收会议转录文本,调用LLM生成结构化摘要,并通过Adaptive Card格式将摘要推送到Teams频道。Adaptive Card支持富文本展示,比纯文本消息更加直观。

协作增强与知识管理

LLM与Teams的集成还可以扩展到知识管理领域。通过分析团队聊天记录和文件内容,可以构建团队知识库,支持智能搜索和问答。

class TeamKnowledgeBase:
    def __init__(self, llm_client, vector_store):
        self.llm = llm_client
        self.vector_store = vector_store
    
    def index_team_content(self, messages, files):
        for msg in messages:
            embedding = self.get_embedding(msg["text"])
            self.vector_store.upsert(
                id=msg["id"],
                vector=embedding,
                metadata={"type": "message", "author": msg["author"], "date": msg["date"]}
            )
        
        for file in files:
            content = self.extract_file_content(file)
            embedding = self.get_embedding(content)
            self.vector_store.upsert(
                id=file["id"],
                vector=embedding,
                metadata={"type": "file", "name": file["name"], "url": file["url"]}
            )
    
    def search_knowledge(self, query, top_k=5):
        query_embedding = self.get_embedding(query)
        results = self.vector_store.query(vector=query_embedding, top_k=top_k)
        
        context = "\n".join([r["metadata"]["text"] for r in results])
        response = self.llm.chat.completions.create(
            model="gpt-4",
            messages=[
                {"role": "system", "content": "基于团队知识库回答问题。"},
                {"role": "user", "content": f"知识库内容:\n{context}\n\n问题:{query}"}
            ]
        )
        return response.choices[0].message.content

知识库系统通过向量嵌入将团队消息和文件内容索引到向量数据库中,支持语义搜索。当用户提问时,系统先检索相关知识片段,再将上下文传递给LLM生成准确回答,避免了LLM幻觉问题。

部署与权限管理

Teams Bot的部署需要通过Azure进行,包括Bot注册、Azure AD应用配置和权限管理。生产环境需要设置合适的权限范围,确保Bot只能访问必要的频道和数据。

# Azure AD配置
AZURE_TENANT_ID = os.environ["AZURE_TENANT_ID"]
AZURE_CLIENT_ID = os.environ["AZURE_CLIENT_ID"]
AZURE_CLIENT_SECRET = os.environ["AZURE_CLIENT_SECRET"]

# 权限范围
SCOPES = [
    "https://graph.microsoft.com/Chat.ReadWrite",
    "https://graph.microsoft.com/ChannelMessage.Send",
    "https://graph.microsoft.com/Calendars.ReadWrite"
]

通过Microsoft Graph API,Bot可以访问用户的日历、文件和聊天记录,为LLM提供更丰富的上下文信息。合理配置权限范围是保障数据安全的关键。

总结

LLM与Microsoft Teams的集成为企业协作带来了智能化革命。从基础的Bot问答到复杂的会议摘要和知识管理,LLM能力的注入让团队协作更加高效。开发者可以利用Bot Framework SDK和Microsoft Graph API,构建满足企业需求的智能协作解决方案。