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
相关产品推荐
相关产品推荐

