You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenAI与Azure AI Search集成中Intent功能机制及实现问询

OpenAI聊天补全与Azure AI Search集成的Intent功能复刻方案

一、Intent功能核心逻辑

在RAG场景中,Intent字段的作用是将上下文依赖的模糊用户查询(如指代性提问)重构为语义完整、适合搜索的独立查询语句,同时生成多个表述变体,提升Azure AI Search的召回精准度和覆盖率。比如示例中的"How old was he at that time?"会被转化为包含具体实体的多个明确问句,避免搜索因缺少上下文而无法匹配。

二、复刻的核心思路:自定义查询重构Prompt

OpenAI官方未公开该功能的内部Prompt,但可以通过还原其核心逻辑设计自定义Prompt,实现相同效果:

  • 核心目标:基于完整对话历史,替换所有指代(如"他"→"尼尔·阿姆斯特朗"),生成3-5个语义等价但表述不同的独立查询
  • 约束要求:问句需自然通顺,符合搜索习惯,无模糊指代,覆盖不同的提问角度
  • 输出格式:返回JSON数组,仅包含重构后的查询语句

参考Prompt示例

基于以下对话历史,将用户最后一条查询重构为3-5个语义明确、适合搜索的完整问句,要求替换所有指代(比如"他"换成具体人名),每个问句表述方式略有不同,只返回JSON格式的数组,不要其他解释:

对话历史:
{chat_history}

重构后的查询数组:

三、无状态LangChain Agent中的实现步骤

无状态场景下需每次传入完整对话历史,具体实现分为3步:

1. 定义查询重构Chain

用LangChain的PromptTemplate+LLMChain实现查询重构逻辑:

from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain

# 初始化LLM(可替换为Azure OpenAI)
llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo")

# 定义查询重构Prompt
refine_prompt = PromptTemplate(
    input_variables=["chat_history", "user_query"],
    template="""基于以下对话历史,将用户最后一条查询{user_query}重构为3-5个语义明确、适合搜索的完整问句,要求替换所有指代(比如"他"换成具体人名),每个问句表述方式略有不同,只返回JSON格式的数组,不要其他解释:

对话历史:
{chat_history}

重构后的查询数组:"""
)

# 创建重构Chain
refine_chain = LLMChain(llm=llm, prompt=refine_prompt)

2. 处理无状态对话历史

无状态Agent需将每次请求的完整对话序列(user/assistant消息)格式化为字符串传入Chain:

# 示例对话历史(无状态场景下需从请求中获取完整上下文)
chat_history = """用户:谁是第一个登上月球的人?
助手:第一个登上月球的人是尼尔·阿姆斯特朗。
用户:他当时多大年纪?"""
user_current_query = "他当时多大年纪?"

# 生成重构后的查询数组
refined_queries = refine_chain.run(chat_history=chat_history, user_query=user_current_query)

3. 集成到Agent的搜索流程

将重构后的查询数组传入LangChain的Azure AI Search工具,可通过多查询合并结果提升召回率:

from langchain.tools import AzureCognitiveSearchTool
import json

# 初始化搜索工具
search_tool = AzureCognitiveSearchTool(
    azure_cognitive_search_endpoint="YOUR_SEARCH_ENDPOINT",
    azure_cognitive_search_key="YOUR_SEARCH_KEY",
    azure_cognitive_search_index_name="YOUR_INDEX_NAME"
)

# 解析重构后的查询数组(生产环境建议用json.loads替代eval)
try:
    query_list = json.loads(refined_queries)
except json.JSONDecodeError:
    query_list = []

# 用多个重构查询执行搜索并合并结果
search_results = []
for query in query_list:
    results = search_tool.run(query)
    search_results.extend(results)

# 去重处理后传入Agent生成最终回答
unique_results = list({item["id"]: item for item in search_results}.values())

四、相关说明

  • 标准聊天补全中无需依赖Azure集成的特殊字段,直接通过自定义Prompt调用普通Chat Completions接口即可实现查询重构
  • OpenAI官方未公开该Intent功能的具体内部Prompt,上述方案是基于功能逻辑的通用复刻实现

内容的提问来源于stack exchange,提问作者R_Student

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 05:22:15