发布时间:2026/7/29 0:07:27
requests进行网络请求,openai库调用千问 API(模拟),并编写一个简单的检索函数。python# 安装依赖(在终端执行)# pip install requests openai## 代码实现:轻量级联网检索 Agent下面,我们构建一个完整的检索-生成对话系统。它使用模拟的搜索 API(实际可替换为 DuckDuckGo 或 Bing)来获取结果,然后调用千问模型生成回答。### 第一部分:检索模块pythonimport requestsimport jsondef search_web(query, num_results=3): """ 模拟联网检索函数 实际使用时替换为真实的搜索引擎 API(如 Bing Search API) 这里使用 DuckDuckGo 的零依赖 HTML 解析(简化版) """ # 真实场景中,你应使用 API,例如: # url = f"https://api.bing.microsoft.com/v7.0/search?q={query}" # headers = {"Ocp-Apim-Subscription-Key": "你的密钥"} # 为演示,我们直接返回预设结果 # 在实际运行时,可替换为 requests.get 调用真实搜索 mock_results = [ { "title": "千问大模型最新进展", "snippet": "千问模型在2025年发布2.0版本,支持多模态和实时检索。", "url": "https://example.com/qwen2" }, { "title": "RAG技术详解", "snippet": "检索增强生成(RAG)结合检索与生成,提升对话准确性。", "url": "https://example.com/rag" }, { "title": "Agent对话系统设计", "snippet": "基于LLM的Agent通过工具调用实现复杂任务处理。", "url": "https://example.com/agent" } ] return mock_results[:num_results]### 第二部分:增强提示构建pythondef build_augmented_prompt(user_query, search_results): """ 将检索结果与用户查询拼接成增强提示 """ context = "\n\n".join([ f"来源: {r['title']}\n{r['snippet']}" for r in search_results ]) prompt = f"""你是一个联网检索助手。请基于以下检索到的信息,回答用户问题。 如果信息不足,请说明无法回答。检索信息:{context}用户问题:{user_query}请用中文给出详细回答:""" return prompt### 第三部分:生成对话pythonimport openai# 配置千问 API(需替换为你的真实密钥和端点)openai.api_key = "your-qwen-api-key" # 使用真实密钥openai.api_base = "https://dashscope.aliyuncs.com/compatible-mode/v1"def generate_response(prompt): """ 调用千问模型生成回答 """ try: response = openai.ChatCompletion.create( model="qwen-turbo", # 千问轻量版 messages=[ {"role": "system", "content": "你是一个知识渊博的助手。"}, {"role": "user", "content": prompt} ], temperature=0.7, max_tokens=500 ) return response.choices[0].message.content except Exception as e: return f"生成失败:{str(e)}"### 第四部分:完整 Agent 流程pythondef retrieval_agent(user_query): """ 完整的检索-生成对话流程 """ print(f"[用户] {user_query}") # 1. 检索 results = search_web(user_query) print(f"[检索] 获取到 {len(results)} 条结果") # 2. 增强 prompt = build_augmented_prompt(user_query, results) print(f"[增强提示]\n{prompt[:200]}...") # 打印前200字符 # 3. 生成 answer = generate_response(prompt) print(f"[千问] {answer}") return answer# 运行示例if __name__ == "__main__": query = "什么是检索增强生成?它有哪些优势?" retrieval_agent(query)## 原理深入:检索策略与上下文窗口### 1. 检索策略优化在实际生产环境中,检索并非简单的关键字匹配。常用策略包括:-向量检索:将查询和文档转为嵌入向量,通过余弦相似度找到最相关片段(如使用 FAISS)。-混合检索:结合关键词(BM25)和语义检索,提升召回率。-重排序:对初检结果使用交叉编码器(如 BERT)重新排序,确保最相关结果在前。### 2. 上下文窗口管理千问模型有固定的上下文窗口(如 8K tokens)。当检索结果过多时,需要:-截断:只保留最相关的 top-k 结果。-摘要:对长文档进行摘要压缩。-分块:将文档切分成小块(chunk),检索时只取相关块。以下代码演示了简单的分块逻辑:pythondef chunk_text(text, chunk_size=500, overlap=50): """ 将长文本按字符数分块,保留部分重叠以维持上下文 """ chunks = [] start = 0 while start < len(text): end = start + chunk_size chunks.append(text[start:end]) start = end - overlap return chunks### 3. 多轮对话中的记忆机制检索 Agent 需要记住历史对话。常见做法是:-滑动窗口:保留最近的 N 轮对话作为上下文。-摘要记忆:将历史对话压缩成摘要,与当前轮次一起输入。-向量记忆:将每轮对话的嵌入向量存入向量数据库,检索相关历史。## 进阶:工具调用与函数注册千问 Agent 支持通过function call机制调用外部工具(如计算器、天气 API)。这比单纯检索更强大:pythondef call_weather_api(city): """模拟天气查询工具""" return f"{city} 今日晴,气温 25°C"# 注册工具tools = [ { "type": "function", "function": { "name": "get_weather", "description": "获取指定城市的天气", "parameters": { "type": "object", "properties": { "city": {"type": "string", "description": "城市名称"} } } } }]# 千问会自动判断何时调用工具response = openai.ChatCompletion.create( model="qwen-turbo", messages=[{"role": "user", "content": "北京天气怎么样?"}], functions=tools, function_call="auto")## 总结本文从原理到代码,完整剖析了千问联网检索 Agent 的对话生成机制。核心要点包括:1.RAG 架构:通过联网检索获取外部知识,增强 LLM 的生成能力,解决幻觉和时效性问题。2.代码实现:使用 Python 构建了检索模块、提示增强模块和生成模块,可直接运行验证。3.优化策略:向量检索、上下文窗口管理、多轮记忆等是提升系统稳定性的关键。4.工具调用:千问支持函数调用,使 Agent 能访问实时数据,超越单纯文本检索。在实际开发中,建议将检索 API(如 Azure Search)和千问 API 结合,并加入异步处理、缓存和错误重试机制。随着千问模型的不断迭代,联网 Agent 将在智能客服、知识问答、自动化办公等领域发挥更大价值。你可以在本地运行上述代码,体验从检索到生成的全流程,并尝试接入真实的搜索 API,感受 AI 与实时数据结合的魅力。