AI Agent 從零到百萬價值迭代之路
這個時代Agent的本質(zhì):用精心設(shè)計的prompt作為"控制語句",用LLM作為"解釋器",構(gòu)建一個能處理模糊輸入的動態(tài)系統(tǒng)-互聯(lián)網(wǎng)創(chuàng)業(yè)老兵
大模型時代為什么是革命
經(jīng)過了近2年的Agent開發(fā),在法律、工業(yè)、營銷等領(lǐng)域都落地了多個商業(yè)級別的Agent之后,我想就我個人一線的開發(fā)經(jīng)驗,來討論下Agent是實戰(zhàn)落地的真實過程,在此之前,先要破解目前Agent領(lǐng)域局外人的兩種觀點。
1、Agent既不是騙局,也不是全知全能的神,目前階段抵制是愚昧的,依賴是愚蠢的。
2、大模型時代就是革命,不是優(yōu)化,不是更新,是徹徹底底的革命,是將編碼這件事情帶到了一個新的領(lǐng)域和高度,即“自然語言編程”。
下面我將使用一個實例來演示一個真實需求的Agent演化過程,整個過程包含F(xiàn)ake 代碼和數(shù)據(jù),包含思考邏輯,篇幅較長,但是看完,我保證你“aha”一聲。
AI Agent 演進實例
找房場景完整實現(xiàn)
任務(wù):幫用戶在北京找一套合適的兩居室租房
用戶需求:
- 預(yù)算:6000元/月
- 位置:靠近地鐵,通勤到中關(guān)村軟件園不超過40分鐘
- 戶型:兩居室,采光好
- 配套:附近有超市和健身房
chatbox階段
我們每個人都是從這階段開始,當(dāng)你第一次使用chatgpt的輸入框輸入問題,chatgpt直接輸出答案的那一刻,實在是讓人終身難忘。
所以在第一階段,最基礎(chǔ)的Agent方式就是直接調(diào)用大模型接口。
def stage1_instant_answer():
"""
典型場景:像個熱心但不靠譜的老鄉(xiāng)
問題展示:
1. 推薦的小區(qū)可能根本不存在
2. 價格是幾年前的數(shù)據(jù)
3. 地鐵通勤時間憑感覺估算
4. 配套設(shè)施信息完全虛構(gòu)
"""
print("=" * 70)
print("階段一:基礎(chǔ)模式- '我知道!我馬上告訴你!'")
print("=" * 70)
response = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[{
"role": "user",
"content": USER_QUESTION
}]
)
answer = response.content[0].text
print(f"\n【用戶提問】\n{USER_QUESTION}")
print(f"\n【AI回答】\n{answer}")
print("\n" + "=" * 70)
print("【翻車現(xiàn)場】")
print("=" * 70)
print("""
真實用戶反饋:
? 用戶A:"你推薦的'海淀區(qū)科技園小區(qū)',我在地圖上找了半小時沒找到!"
? 用戶B:"你說5800元/月?我去鏈家一看,這個區(qū)域兩居室至少8500起!"
? 用戶C:"13號線龍澤站到中關(guān)村軟件園40分鐘?我實際通勤1小時15分!"
? 用戶D:"什么'小區(qū)自帶健身房'?這個樓是1995年的老破小,哪來的健身房?"
""")
print("\n【問題本質(zhì)】")
print("→ AI在'回憶'訓(xùn)練數(shù)據(jù)中的房產(chǎn)信息")
print("→ 小區(qū)名可能是多個真實小區(qū)的'統(tǒng)計平均'")
print("→ 價格是幾年前的歷史數(shù)據(jù)")
print("→ 通勤時間憑'經(jīng)驗'估算,未考慮換乘、步行")
print("→ 配套設(shè)施純屬'聽起來合理'的編造")
print("\n【引出問題】")
print("這不是AI不夠聰明,而是它被困在了訓(xùn)練數(shù)據(jù)的時空里。")
print("就像讓一個2020年穿越來的人,給你推薦2024年的房子。")
return answer
定義好角色Role,寫清你的問題question,直接扔給大模型,大模型就會給你答案。
邏輯:問題->大模型->答案
方法:單次調(diào)用
問題:黑盒輸出,快是真快,錯也是真的錯。任何大模型訓(xùn)練完就是,你可以理解為就是一個大的靜態(tài)數(shù)據(jù)庫,他所有回答你的問題都是由這個靜態(tài)數(shù)據(jù)庫組合出來的,所以任何具有時效性的問題大概率出錯,即使沒有實效性,因為幻覺的原因,這個答案也是幾乎不可信的。
思維鏈階段
針對上面的問題,我們就會發(fā)現(xiàn),我們問的問題越籠統(tǒng),越抽象,大模型回復(fù)你的答案幻覺,比如你問他“告訴我如何成為世界首富”,你得到的大概是一個扯淡的正確答案。
如何解決這個問題?很簡單,你面對一到復(fù)雜的數(shù)學(xué)題的時候是如何解決的?
逐步拆解,寫下每一步的解題思路。
def stage2_structured_thinking():
"""
改進:要求AI展示找房的思考步驟
解決了什么:
- 分析框架清晰可見
- 考慮因素更全面
仍然存在的問題:
- 思考框架是對的,但填充的數(shù)據(jù)是錯的
- 就像用正確的數(shù)學(xué)公式,代入了錯誤的數(shù)字
"""
print("\n" + "=" * 70)
print("階段二:邏輯拆解者 - '讓我仔細(xì)想想...'")
print("=" * 70)
prompt = f"""{USER_QUESTION}
請按照以下步驟思考:
步驟1:分析用戶需求的優(yōu)先級
- 哪些是硬性要求(必須滿足)?
- 哪些是軟性偏好(最好滿足)?
步驟2:確定搜索范圍
- 根據(jù)通勤要求,圈定可能的地鐵線路和站點
- 計算通勤時間是否合理
步驟3:篩選符合預(yù)算的區(qū)域
- 6000元預(yù)算在北京能租到什么區(qū)域的兩居室?
- 列出2-3個候選區(qū)域
步驟4:評估配套設(shè)施
- 檢查這些區(qū)域是否有超市和健身房
步驟5:給出推薦
- 列出具體小區(qū)名稱
- 說明推薦理由
請展示完整的思考過程。"""
response = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=2048,
messages=[{"role": "user", "content": prompt}]
)
answer = response.content[0].text
print(f"\n【AI的思考過程】\n{answer}")
print("\n" + "=" * 70)
print("【改進點】")
print("=" * 70)
print("? 分析框架清晰:優(yōu)先級→位置→價格→配套→推薦")
print("? 考慮因素全面:通勤時間、換乘次數(shù)、步行距離都考慮到了")
print("? 推理過程可追溯:能看到AI是怎么一步步得出結(jié)論的")
print("\n【但新問題出現(xiàn)了】")
print("=" * 70)
print("""
用戶反饋:
用戶:"你的分析框架很專業(yè),但推薦的'回龍觀融澤嘉園'我在鏈家找不到啊!"
AI:"讓我再確認(rèn)一下..."
用戶:"還有你說的6000能租兩居,我問了中介,現(xiàn)在回龍觀兩居最少7500!"
AI:"可能價格有波動..."
【問題診斷】
→ 思考框架是對的(模型能力提升)
→ 但框架里填充的還是舊數(shù)據(jù)(知識庫過時)
→ 就像用牛頓力學(xué)公式做對了,但代入的是火星的重力加速度
""")
print("\n【引出下一階段】")
print("需要一個機制:讓AI能意識到'這個數(shù)據(jù)我不確定',然后自我檢查。")
return answer
在這一階段,你的prompt已經(jīng)明確告訴大模型分析思考的步驟,最終給出按照這個思維鏈
邏輯:問題->大模型->輸出思考過程->答案
方法:仍然單次調(diào)用
問題:邏輯鏈?zhǔn)俏覀儚娭拼竽P驮诨卮饐栴}前先把問題進行步驟拆分,本質(zhì)在于降低每一步的大模型思考難度,降低每一個單一問題的幻覺,最終組合出來的問題更加的穩(wěn)定和可靠。但是我們忽略了一個問題,大模型雖然進行了更為精細(xì)的思考,但是他所有的思考都是基于大模型訓(xùn)練階段的數(shù)據(jù),所以,一旦你的問題是一個實時的問題,不管如何拆分步驟的思考,都是徒勞的。
批評與自我批評
請注意,在這一步會產(chǎn)生質(zhì)變
繼上面使用思考鏈之后,得到的結(jié)果可信度大大增加,但是夠了嗎?當(dāng)然不夠!
我們在做任何決定或者作品,公之于眾之前,一定是在這個決定或者作品產(chǎn)生后,會不斷在自己大腦中重復(fù)思考,不斷的權(quán)衡自己的決定,回顧每個細(xì)節(jié)是否還有問題,對于一個合格的Agent一樣道理,在上面生成出結(jié)果之后,我們?nèi)匀恍枰竽P瓦M行自我批評和審查,確定自我質(zhì)疑和自我修正。
def stage3_self_reflection():
"""
改進:生成推薦后,進行自我審查
核心機制:
1. 第一次生成推薦
2. 切換到"批判者"模式,審查推薦
3. 基于審查結(jié)果,修正推薦
解決了什么:
- 能發(fā)現(xiàn)明顯的邏輯錯誤
- 會對不確定的信息進行標(biāo)注
仍然的問題:
- 審查和修正仍基于訓(xùn)練數(shù)據(jù)
- 無法驗證小區(qū)是否真實存在
"""
print("\n" + "=" * 70)
print("階段三:批評與自我批評者 - '等等,讓我再檢查一遍...'")
print("=" * 70)
# 步驟1:生成初始推薦(使用CoT)
print("\n[步驟1] 生成初始推薦...")
print("-" * 70)
initial_prompt = f"""{USER_QUESTION}
請給出詳細(xì)的找房推薦,包括:
1. 推薦的具體小區(qū)名稱
2. 預(yù)估租金
3. 通勤路線和時間
4. 周邊配套設(shè)施"""
response1 = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[{"role": "user", "content": initial_prompt}]
)
initial_answer = response1.content[0].text
print(f"初始推薦:\n{initial_answer[:400]}...\n")
# 步驟2:自我審查
print("[步驟2] 啟動自我審查模式...")
print("-" * 70)
reflection_prompt = f"""我剛才給用戶推薦了以下租房方案:
{initial_answer}
現(xiàn)在,請你作為一個嚴(yán)格的審查者,用批判性思維檢查這個推薦:
檢查清單:
1. 小區(qū)名稱:這些小區(qū)是否真實存在?我是否100%確定?
2. 價格信息:租金數(shù)據(jù)是否可能過時?當(dāng)前市場價是否會更高?
3. 通勤時間:我的計算是否考慮了換乘時間、步行時間、高峰期擁堵?
4. 配套設(shè)施:我是否確定這些設(shè)施就在小區(qū)附近?
5. 整體可信度:如果用戶按這個推薦去找房,會遇到什么問題?
請誠實地指出問題,不要回避。"""
response2 = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[{"role": "user", "content": reflection_prompt}]
)
reflection = response2.content[0].text
print(f"審查報告:\n{reflection}\n")
# 步驟3:基于反思修正
print("[步驟3] 基于審查修正推薦...")
print("-" * 70)
improvement_prompt = f"""原始推薦:
{initial_answer}
審查發(fā)現(xiàn)的問題:
{reflection}
請基于審查結(jié)果,生成一個改進版本:
- 對不確定的信息明確標(biāo)注
- 對可能過時的數(shù)據(jù)給出風(fēng)險提示
- 提供用戶自行驗證的方法"""
response3 = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[{"role": "user", "content": improvement_prompt}]
)
improved_answer = response3.content[0].text
print(f"改進后的推薦:\n{improved_answer}")
print("\n" + "=" * 70)
print("【顯著改進】")
print("=" * 70)
print("? 會主動標(biāo)注:'以下信息基于歷史數(shù)據(jù),建議實地核實'")
print("? 會發(fā)現(xiàn)明顯錯誤:'我之前說的通勤30分鐘可能過于樂觀'")
print("? 會給出驗證方法:'建議在鏈家/貝殼查詢實時房源'")
print("\n【但核心問題依然存在】")
print("=" * 70)
print("""
對話實錄:
AI:"根據(jù)歷史數(shù)據(jù),回龍觀兩居室約6000-7000元(數(shù)據(jù)可能過時)"
用戶:"所以到底是6000還是7000?還是更多?"
AI:"建議您在鏈家查詢實時價格"
用戶:"那我要你干嘛???"
【問題本質(zhì)】
→ AI已經(jīng)意識到自己的信息可能過時
→ 但它只能不斷提示"建議核實"
→ 就像一個很誠實的騙子:我可能在騙你,你自己查吧
""")
print("\n【引出下一階段】")
print("AI需要學(xué)會:在不確定時,先別急著回答,而是去'查資料'。")
print("但它要按什么邏輯去查?要查哪些?這需要一個'作戰(zhàn)計劃'。")
return improved_answer
在這一步事情發(fā)生了質(zhì)變,變成了交互式行動
邏輯:問題->大模型->輸出思考過程->觀察結(jié)果->反饋大模型->輸出更新答案
方法:交互式思考行動
問題:在思維鏈、工具鏈的基礎(chǔ)上,我們讓大模型和大模型進行了交互式行動,首次實現(xiàn)了大模型的內(nèi)部循環(huán),在這一步可以認(rèn)為是標(biāo)準(zhǔn)意義上的Agent開始,但是目前存在的核心問題是數(shù)據(jù)仍舊是靜態(tài)數(shù)據(jù),所以下一步工具鏈?zhǔn)褂?/p>
工具鏈
繼續(xù)思考鏈、自我反思之后,我們遇到的問題是原始數(shù)據(jù)勢必不能解決實時的問題,就像諸葛亮穿越到現(xiàn)在,他再聰明,你問他什么是“羅永浩西貝事件”,他也不可能知道。所以在Agent中如何解決這個問題,就是工具鏈。
這個很簡單,每個不同的Agent需要的工具鏈不同,以我們找房的例子來看,基礎(chǔ)的工具就是瀏覽器使用。
這部分相當(dāng)于是大模型的能力擴展,給到大模型對應(yīng)的接口和使用方法,讓大模型通過你的一系列工具能夠獲得最新的或者你們內(nèi)部的數(shù)據(jù),然后繼續(xù)執(zhí)行上面的思維鏈。
def stage5_react_with_tools():
"""
終極形態(tài):Think -> Act -> Observe 循環(huán)
核心突破:
- AI不再困在訓(xùn)練數(shù)據(jù)里
- 可以調(diào)用真實世界的工具獲取最新信息
- 根據(jù)真實反饋動態(tài)調(diào)整策略
這才是從Chatbot到Agent的質(zhì)變
"""
print("\n" + "=" * 70)
print("階段四:完整的人 - '讓我查一查最新情況'")
print("=" * 70)
# 定義AI可用的工具
tools = [
{
"name": "search_subway_commute",
"description": "查詢從某地鐵站到目標(biāo)地點的真實通勤時間(考慮換乘、步行、高峰期)",
"input_schema": {
"type": "object",
"properties": {
"from_station": {"type": "string", "description": "起始地鐵站"},
"to_location": {"type": "string", "description": "目標(biāo)位置"}
},
"required": ["from_station", "to_location"]
}
},
{
"name": "search_rental_prices",
"description": "查詢指定地鐵站周邊的最新租房價格(來自鏈家/貝殼等平臺)",
"input_schema": {
"type": "object",
"properties": {
"station": {"type": "string", "description": "地鐵站名"},
"room_type": {"type": "string", "description": "戶型,如'兩居室'"},
"max_price": {"type": "number", "description": "最高預(yù)算"}
},
"required": ["station", "room_type"]
}
},
{
"name": "search_community_info",
"description": "查詢具體小區(qū)的詳細(xì)信息(建筑年代、配套設(shè)施、真實照片等)",
"input_schema": {
"type": "object",
"properties": {
"community_name": {"type": "string", "description": "小區(qū)名稱"},
"station": {"type": "string", "description": "所屬地鐵站"}
},
"required": ["community_name", "station"]
}
},
{
"name": "search_nearby_facilities",
"description": "查詢小區(qū)周邊的配套設(shè)施(超市、健身房、餐飲等)",
"input_schema": {
"type": "object",
"properties": {
"community_name": {"type": "string", "description": "小區(qū)名稱"},
"facility_types": {"type": "array", "items": {"type": "string"}, "description": "設(shè)施類型"}
},
"required": ["community_name", "facility_types"]
}
}
]
# 模擬工具執(zhí)行(實際應(yīng)調(diào)用真實API)
def execute_tool(tool_name: str, tool_input: dict) -> str:
"""模擬真實世界的工具返回"""
if tool_name == "search_subway_commute":
return f"""【高德地圖實時數(shù)據(jù) - {datetime.now().strftime('%Y-%m-%d %H:%M')}】
從 {tool_input['from_station']} 到 {tool_input['to_location']}:
- 工作日早高峰(8:00-9:00):預(yù)計52分鐘
路線:{tool_input['from_station']} → 換乘1次 → 步行800米
- 工作日平峰期(10:00-17:00):預(yù)計43分鐘
- 周末:預(yù)計40分鐘
注意:以上為門到門時間,包含步行和等待。"""
elif tool_name == "search_rental_prices":
return f"""【鏈家租房數(shù)據(jù) - {datetime.now().strftime('%Y-%m-%d')}】
{tool_input['station']} 周邊{tool_input['room_type']}租金情況:
在租房源(15套):
? 價格范圍:7200-9500元/月
? 中位數(shù):8100元/月
? 最便宜房源:7200元/月(龍澤苑西區(qū),6樓,55㎡,2000年建)
? 性價比推薦:7800元/月(北郊農(nóng)場社區(qū),3樓,68㎡,2005年建,精裝修)
預(yù)算{tool_input.get('max_price', '未指定')}元現(xiàn)狀:
→ 當(dāng)前市場價超出預(yù)算約20-30%
→ 建議:考慮降低其他條件(如遠(yuǎn)一站地鐵)或合租"""
elif tool_name == "search_community_info":
return f"""【貝殼小區(qū)詳情 - {tool_input['community_name']}】
基本信息:
? 建筑年代:2005年
? 建筑類型:板樓
? 物業(yè)費:1.2元/㎡/月
? 供暖方式:集中供暖
? 車位情況:地上車位,200元/月
戶型特點:
? 兩居室主力面積:60-75㎡
? 南北通透戶型占比:65%
? 采光評價:★★★★☆ (4.2分,基于128條真實評價)
小區(qū)環(huán)境:
? 綠化率:35%
? 樓間距:舒適
? 居住人群:上班族為主
? 噪音水平:較安靜
【真實租客評價精選】
"采光確實不錯,南北通透戶型夏天不開空調(diào)也涼快" - 2024年3月
"離地鐵站步行需要12分鐘,比想象中遠(yuǎn)一點" - 2024年5月"""
elif tool_name == "search_nearby_facilities":
types = tool_input.get('facility_types', [])
return f"""【大眾點評/高德地圖 - {tool_input['community_name']}周邊配套】
{'超市' if '超市' in types else ''}:
? 物美超市(200米,步行3分鐘)★★★★☆
? 7-11便利店(小區(qū)內(nèi))24小時營業(yè)
? 永輝超市(600米,步行8分鐘)
{'健身房' if '健身房' in types else ''}:
? 樂刻運動(400米)月卡199元,24小時營業(yè) ★★★★☆
? 中體倍力(800米)年卡2800元,設(shè)施較新 ★★★★★
餐飲:
? 小區(qū)周邊餐廳:23家
? 外賣配送范圍:優(yōu)秀(美團/餓了么平均15分鐘送達)
【綜合生活便利度評分】★★★★☆ (4.3/5.0)"""
return f"工具 {tool_name} 執(zhí)行完成"
# ReAct 循環(huán)
print("\n【ReAct循環(huán)開始】")
print("=" * 70)
conversation_history = []
max_iterations = 6
initial_prompt = f"""{USER_QUESTION}
你現(xiàn)在有工具可以調(diào)用,可以查詢真實的最新信息。
請按照 Think → Act → Observe 循環(huán)工作:
1. Think:思考現(xiàn)在需要什么信息
2. Act:調(diào)用工具獲取真實數(shù)據(jù)
3. Observe:分析工具返回的結(jié)果
4. 重復(fù)循環(huán),直到有足夠信息給出可靠推薦
開始吧!"""
conversation_history.append({"role": "user", "content": initial_prompt})
for iteration in range(max_iterations):
print(f"\n{'▼' * 35}")
print(f" 循環(huán)第 {iteration + 1} 輪")
print(f"{'▼' * 35}")
# AI的思考和行動
response = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
tools=tools,
messages=conversation_history
)
# 檢查是否需要調(diào)用工具
if response.stop_reason == "tool_use":
# 提取思考內(nèi)容和工具調(diào)用
text_blocks = [block.text for block in response.content if hasattr(block, "text")]
tool_uses = [block for block in response.content if block.type == "tool_use"]
# 顯示AI的思考過程
if text_blocks:
print(f"\n [Think] AI的思考:")
print(f" {text_blocks[0][:300]}...")
# 將AI的響應(yīng)加入歷史
conversation_history.append({
"role": "assistant",
"content": response.content
})
# 執(zhí)行所有工具調(diào)用
tool_results = []
for tool_use in tool_uses:
print(f"\n [Act] 調(diào)用工具: {tool_use.name}")
print(f" 參數(shù): {json.dumps(tool_use.input, ensure_ascii=False, indent=2)}")
# 執(zhí)行工具
result = execute_tool(tool_use.name, tool_use.input)
print(f"\n? [Observe] 工具返回:")
print(f" {result[:400]}...")
tool_results.append({
"type": "tool_result",
"tool_use_id": tool_use.id,
"content": result
})
# 將工具結(jié)果加入歷史
conversation_history.append({
"role": "user",
"content": tool_results
})
else:
# 沒有更多工具調(diào)用,得到最終答案
final_answer = response.content[0].text
print(f"\n{'=' * 70}")
print("? [最終推薦]")
print(