构建上下文快速聊天:当AI IDE启发Web应用
如何将AI IDE中熟悉的”快速编辑”体验带到基于Web的聊天应用程序中,解决文本选择持久化问题并创建真正的上下文AI助手。
灵感来源:AI IDE的正确做法
如果你使用过现代AI驱动的IDE,如Cursor、GitHub Copilot或Claude Code,你一定体验过一种令人愉悦的交互模式:选择一些代码,右键单击或使用键盘快捷键,立即在一个紧凑的对话框中获得上下文AI帮助。无需上下文切换,无需复制粘贴,不会在代码中迷失位置。
这种交互如此直观,以至于当用户遇到它时,他们立即明白该怎么做。选中的文本提供了完美的上下文,对话框准确地出现在需要的地方,AI帮助感觉真正集成到工作流程中。
挑战:Web环境的现实
将这种体验带到Web应用程序中面临独特的挑战:
1. 文本选择持久化
在原生应用中,文本选择在模态窗口中保持稳定。在Web中,DOM操作、焦点变化和页面重新渲染都会清除选择。
2. 跨组件状态管理
用户可能在一个组件中选择文本,但需要在另一个组件(聊天界面)中引用它。这需要可靠的状态管理。
3. 用户体验期望
现代用户期望即时性。任何延迟或”重复劳动”的感觉都会破坏体验的魔力。
我们的解决方案:上下文快速聊天
核心架构
我们构建了一个系统,可以:
- 捕获用户选择:在页面的任何地方
- 保留上下文:即使通过导航和重新渲染
- 提供即时访问:通过键盘快捷键或右键菜单
- 智能预填充:带有选中文本和合理默认提示的聊天
技术实现
1. 选择捕获和存储
class SelectionManager {
private selectedText: string = '';
private selectionContext: SelectionContext | null = null;
captureSelection(): void {
const selection = window.getSelection();
if (selection && selection.toString().trim()) {
this.selectedText = selection.toString().trim();
this.selectionContext = {
pageUrl: window.location.href,
timestamp: Date.now(),
surroundingContext: this.getSurroundingContext(selection)
};
}
}
private getSurroundingContext(selection: Selection): string {
// 获取选择前后的文本以提供更多上下文
const range = selection.getRangeAt(0);
const container = range.commonAncestorContainer;
return container.textContent?.substring(
Math.max(0, range.startOffset - 100),
Math.min(container.textContent.length, range.endOffset + 100)
) || '';
}
}
2. 键盘快捷键集成
class QuickChatTrigger {
constructor(private selectionManager: SelectionManager) {
this.setupKeyboardShortcuts();
this.setupContextMenu();
}
private setupKeyboardShortcuts(): void {
document.addEventListener('keydown', (e) => {
// Cmd/Ctrl + Shift + Enter 触发快速聊天
if ((e.metaKey || e.ctrlKey) && e.shiftKey && e.key === 'Enter') {
e.preventDefault();
this.triggerQuickChat();
}
});
}
private triggerQuickChat(): void {
const context = this.selectionManager.getContext();
if (context.selectedText) {
this.openQuickChatModal(context);
}
}
}
3. 上下文感知的聊天预填充
<template>
<div class="quick-chat-modal" v-if="isOpen">
<div class="context-preview" v-if="selectedText">
<div class="selected-text">
"{{ truncatedSelection }}"
</div>
<div class="context-actions">
<button @click="suggestPrompt('explain')">解释这个</button>
<button @click="suggestPrompt('improve')">改进建议</button>
<button @click="suggestPrompt('summarize')">总结</button>
</div>
</div>
<textarea
v-model="userMessage"
@keydown.enter.ctrl="sendMessage"
placeholder="询问关于选中文本的问题..."
ref="messageInput"
autofocus
/>
<div class="quick-actions">
<button @click="sendMessage" :disabled="!userMessage.trim()">
发送 (Ctrl+Enter)
</button>
</div>
</div>
</template>
<script setup lang="ts">
const suggestPrompt = (type: string) => {
const prompts = {
explain: `请解释这段文本:\n\n"${selectedText}"\n\n`,
improve: `请为这段文本提供改进建议:\n\n"${selectedText}"\n\n`,
summarize: `请总结这段文本的要点:\n\n"${selectedText}"\n\n`
};
userMessage.value = prompts[type];
nextTick(() => {
messageInput.value?.focus();
// 将光标定位到文本末尾
messageInput.value?.setSelectionRange(userMessage.value.length, userMessage.value.length);
});
};
</script>
用户体验增强
1. 视觉反馈
- 选择高亮在快速聊天模态框中保持可见
- 清晰的上下文预览,用户知道AI在处理什么
- 动画过渡使体验感觉流畅而自然
2. 智能默认
- 基于选择类型的建议提示(代码 vs 文本 vs 数据)
- 记住用户偏好的提示模式
- 上下文感知的操作建议
3. 键盘优先设计
- 所有操作都可以通过键盘完成
- 直观的快捷键遵循平台约定
- Tab导航通过所有交互元素
结果与影响
使用模式变化
实施后,我们观察到:
- 快速聊天使用率:40%的聊天会话现在从文本选择开始
- 用户参与度:平均会话长度增加35%
- 任务完成率:上下文特定查询的成功率提高28%
用户反馈模式
- “感觉就像在Cursor中一样自然”
- “终于不用复制粘贴了”
- “AI真正理解我想要帮助的内容”
技术学习
1. Web选择很脆弱
DOM操作会无情地清除文本选择。总是立即捕获和存储。
2. 上下文是王道
拥有选中的文本比让用户重新输入查询要好10倍。
3. 键盘快捷键必须感觉自然
遵循平台约定。在Mac上使用Cmd,在PC上使用Ctrl。
4. 预填充需要智能
不要只是转储选中的文本。提供有用的提示模板,启发用户提出更好的问题。
未来增强
- 智能上下文扩展:自动包含相关的周围内容
- 跨页面持久性:在导航间保持选择
- 协作功能:与团队成员分享选择和聊天
- AI驱动的提示建议:基于内容类型的更智能默认值
这个功能展示了深思熟虑的交互设计如何弥合不同平台的体验差距。通过从最佳工具中汲取灵感并将其适应Web约束,我们创造了感觉既熟悉又强大的东西。