医学视频
174.86MB · 2025-11-20
传统RAG(检索增强生成)依赖向量化检索,流程复杂且资源消耗大。而Agentic RAG提供了一种更轻量的替代方案——无需向量化,仅需结构化内存数据库即可实现高效检索+生成。
<图片源于:LLM大模型>
Agentic RAG在传统RAG流程的基础上加入了一个重要角色——Agent(智能体) 。它不仅能检索,还能根据任务动态选择工具、拆解问题、调用外部API,甚至多轮迭代优化结果。这意味着它可以:
本期给大家分享的是由和鲸社区创作者 @StarTap 分享的Agentic RAG 全面教程:从理论到实战项目中的餐厅智能推荐系统,就是一个典型例子。
推荐理由:
项目中不仅清晰说明了Agentic RAG的理论基础(包含技术架构、工作原理以及与传统RAG的区别),还用极简的实现方式,构建了一个基于Agentic RAG思路的餐厅推荐系统,而且完全无需向量化,检索逻辑清晰、执行效率高,十分适合中小规模数据的业务场景。对于需要快速验证想法、构建轻量级智能推荐功能的团队来说,这将是一个很好的参考案例。
整个系统的核心逻辑非常直接:
关键在于:数据检索是纯Python条件过滤,不需要向量化。
项目中用了一个简化的餐厅数据集,每条数据包含:
数据示例(Python表示):
restaurants = [
{"shopType": 10,"shopName": "居民楼火锅","branchName": "万松园店","address": "万松小区","phoneNo": "17771857933","phoneNo2": "18871569657","avgPrice": 50,"suitableFor": 3
},
{"shopType": 10,"shopName": "重庆老火锅","branchName": "江汉路店","address": "江汉路步行街","phoneNo": "13800138000","avgPrice": 60,"suitableFor": 4
}
]
核心实现
1、检索函数
它的工作很直接:按菜系、人数、人均价格范围过滤餐厅。价格范围放宽到 ±20%,增加匹配灵活性。
def query_restaurants(numOfPeople: int, avgOfAmount: int, cuisine_type: str) -> list:
results = []
type_code = CUISINE_TYPE_MAP.get(cuisine_type, None)if type_code is None:return []for restaurant in restaurants:if restaurant['shopType'] != type_code:continue
if restaurant['suitableFor'] < numOfPeople:continue
if not (0.8 * avgOfAmount <= restaurant['avgPrice'] <= 1.2 * avgOfAmount):continue
results.append(restaurant)return results
2、参数抽取
通过正则匹配从用户输入中抽取关键信息,比如“3个人”“人均50”“重庆火锅”等。
def extract_query_params(user_input: str):import re
num_match = re.search(r'(d+)s*人', user_input)
numOfPeople = int(num_match.group(1)) if num_match else 2
avg_match = re.search(r'人均(d+)', user_input)
avgOfAmount = int(avg_match.group(1)) if avg_match else 50
cuisine_type = None
for k in CUISINE_TYPE_MAP.keys():if k in user_input:
cuisine_type = kbreak
if not cuisine_type:
cuisine_type = list(CUISINE_TYPE_MAP.keys())[0]return numOfPeople, avgOfAmount, cuisine_type
3、大模型API调用
这里的亮点是流式输出,让推荐结果像聊天一样即时出现。
from openai import OpenAI
from dotenv import load_dotenv
import os
def run_agentic_rag():
load_dotenv()print("欢迎使用 Agentic RAG 餐厅推荐系统(无需向量化)!n")while True:
user_input = input("请输入您的需求:")if user_input.strip().lower() == 'q':break
numOfPeople, avgOfAmount, cuisine_type = extract_query_params(user_input)
results = query_restaurants(numOfPeople, avgOfAmount, cuisine_type)if results:
r = results[0]
answer = f"按您的要求,我找到了{r['shopName']}({r['branchName']}),位于{r['address']},电话是{r['phoneNo']},是一家{cuisine_type},人均消费{r['avgPrice']}元,适合{r['suitableFor']}个人用餐。"else:
answer = "没有找到符合条件的餐厅。"
system_prompt = "你是餐饮推荐专家,请根据用户需求和检索到的结果,生成简洁、友好、准确的中文回复。"
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": f"用户需求:{user_input}n检索结果:{answer}"}
]
client = OpenAI(
api_key="api_key",
base_url="",
)
completion = client.chat.completions.create(
model="deepseek-r1",
messages=messages,
stream=True,
)for chunk in completion:if len(chunk.choices) > 0:if hasattr(chunk.choices[0].delta, 'reasoning_content') and chunk.choices[0].delta.reasoning_content:print(chunk.choices[0].delta.reasoning_content, end="", flush=True)else:print(chunk.choices[0].delta.content, end="", flush=True)print()
️由于openai版本原因,在fork项目时,需手动升级安装最新版openai
通过这个轻量级的餐厅推荐系统案例,我们可以看到Agentic RAG的核心价值:
如果你想更深入地学习大模型,以下是一些非常有价值的学习资源,这些资源将帮助你从不同角度学习大模型,提升你的实践能力。