從0到1保姆級(jí)實(shí)戰(zhàn):用 Dify Agent + Python 打造自動(dòng)化競(jìng)品分析AI助手(附完整代碼)
AI 不只是概念,更是工具。本篇文章將帶你從 0 到 1,用 Dify Agent + Python 打造一個(gè)真正可用的自動(dòng)化競(jìng)品分析助手。不講空話,不玩炫技,完整代碼+實(shí)戰(zhàn)流程,適合產(chǎn)品人、數(shù)據(jù)人、運(yùn)營人快速上手復(fù)用。
今天,我們要挑戰(zhàn)一個(gè)幾乎讓每個(gè)產(chǎn)品經(jīng)理、市場(chǎng)分析師甚至創(chuàng)業(yè)者都“聞風(fēng)喪膽”的任務(wù)——競(jìng)品分析。傳統(tǒng)的方式不僅耗時(shí)耗力,而且信息零散,效率極低。我就在想,能不能讓AI來幫我們干這件苦差事?
于是,這個(gè)實(shí)驗(yàn)誕生了:我們要打造一個(gè)AI助手,你只需要丟給它一個(gè)競(jìng)品名稱,它就能自動(dòng)上網(wǎng)搜集信息,并生成一份結(jié)構(gòu)化的分析報(bào)告初稿。聽起來很酷?讓我們開始吧!
【核心1:踩坑與彎路】—— 我天真了
一開始,我以為這會(huì)很簡單。Dify 提供了強(qiáng)大的工作流(Workflow)和內(nèi)置的 Google Search 工具,我的初步構(gòu)想是:
“一步到位法” (已失敗)
用戶輸入 -> Google Search 找官網(wǎng) -> Dify的HTTP節(jié)點(diǎn)直接訪問官網(wǎng) -> LLM分析 -> 輸出報(bào)告。
結(jié)果呢?現(xiàn)實(shí)給了我一記響亮的耳光。幾乎所有稍微正規(guī)一點(diǎn)的網(wǎng)站都部署了反爬蟲機(jī)制(比如Cloudflare),我用HTTP節(jié)點(diǎn)發(fā)出的請(qǐng)求,就像一個(gè)沒帶通行證的游客,被無情地?fù)踉诹碎T外,返回的都是些無意義的錯(cuò)誤代碼或加載頁面。
這個(gè)坑告訴我們: Dify 的代碼執(zhí)行節(jié)點(diǎn)有安全沙箱,無法執(zhí)行網(wǎng)絡(luò)請(qǐng)求等I/O操作;而直接用HTTP節(jié)點(diǎn)去“裸奔”訪問,成功率極低。這是從“玩具”到“工具”必須邁過的第一道坎。
【核心2:頓悟與新方案】—— 專業(yè)的事交給專業(yè)的“特工”
在碰壁之后,我意識(shí)到,必須將“信息獲取”這個(gè)專業(yè)任務(wù)外包出去。Dify 應(yīng)該扮演“總指揮”的角色,負(fù)責(zé)編排整個(gè)流程;而網(wǎng)頁抓取,需要一個(gè)能模擬真實(shí)瀏覽器、應(yīng)對(duì)反爬蟲的“前線特工”。
這個(gè)“特工”,就是我們即將用 Python 和 Docker 構(gòu)建的一個(gè)獨(dú)立的網(wǎng)頁抓取微服務(wù)。它接收 Dify 指揮部發(fā)來的 URL,然后將“情報(bào)”(網(wǎng)頁純文本)傳回。
【核心3:實(shí)戰(zhàn)步驟】—— 保姆級(jí)“抄作業(yè)”指南
光說不練假把式,我們來動(dòng)手實(shí)現(xiàn)!
Step 1: 搭建“前線特工”(網(wǎng)頁抓取API)
這個(gè)服務(wù)的目標(biāo)很純粹:給它一個(gè)URL,它還你一個(gè)干凈的網(wǎng)頁文本。
1. 編寫代碼 (main.py)
from flask import Flask, request, jsonify
import requests
from bs4 import BeautifulSoup
import logging
logging.basicConfig(level=logging.INFO)
app = Flask(__name__)
@app.route(‘/scrape’, methods=[‘POST’])
def scrape_website():
data = request.json
if not data or ‘url’ not in data:
return jsonify({“error”: “Missing ‘url’ in request body”}), 400
url = data[‘url’]
logging.info(f”Received request to scrape URL: {url}”)
headers = {
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36’
}
try:
response = requests.get(url, headers=headers, timeout=15)
response.raise_for_status()
soup = BeautifulSoup(response.text, ‘html.parser’)
for script_or_style in soup([‘script’, ‘style’]):
script_or_style.decompose()
text = soup.get_text()
lines = (line.strip() for line in text.splitlines())
chunks = (phrase.strip() for line in lines for phrase in line.split(” “))
clean_text = ‘\n’.join(chunk for chunk in chunks if chunk)
logging.info(f”Successfully scraped content from {url}. Content length: {len(clean_text)}”)
return jsonify({“content”: clean_text})
except requests.exceptions.RequestException as e:
logging.error(f”Failed to scrape {url}. Error: {e}”)
return jsonify({“error”: f”Failed to fetch URL: {str(e)}”}), 500
except Exception as e:
logging.error(f”An unexpected error occurred. Error: {e}”)
return jsonify({“error”: f”An unexpected error occurred: {str(e)}”}), 500
if __name__ == ‘__main__’:
app.run(host=’0.0.0.0′, port=5000)
2. 定義依賴 (requirements.txt)
Flask==2.2.2
requests==2.28.1
beautifulsoup4==4.11.1
3. 容器化部署 (Dockerfile)
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install –no-cache-dir -r requirements.txt
COPY main.py .
EXPOSE 5000
CMD [“python”, “main.py”]
4. 啟動(dòng)服務(wù)
在包含以上三個(gè)文件的目錄下,打開終端執(zhí)行:
# 1. 構(gòu)建Docker鏡像
docker build -t competitor-scraper .
# 2. 運(yùn)行容器 (我們將外部端口映射為5001)
docker run -d -p 5001:5000 –name scraper-container competitor-scraper
現(xiàn)在,你的“前線特工”已經(jīng)在 http://localhost:5001/scrape 待命了!
Step 2: 配置 Dify“總指揮部”
進(jìn)入 Dify,創(chuàng)建一個(gè)新的對(duì)話型應(yīng)用,開始編排工作流。
1)「開始」節(jié)點(diǎn):
添加輸入字段,變量名設(shè)為 competitor_name。
2)「Google Search」節(jié)點(diǎn):
Query輸入: 引用變量 {{start.competitor_name}} official website。
3)「代碼執(zhí)行」節(jié)點(diǎn) (提取URL):
輸入變量: 添加一個(gè) search_results,引用自上一步Google搜索節(jié)點(diǎn)的 result。
代碼:
def main(search_results: list) -> dict:
first_url = “”
if isinstance(search_results, list) and len(search_results) > 0:
first_item = search_results[0]
if isinstance(first_item, dict) and ‘link’ in first_item:
first_url = first_item[‘link’]
return {‘first_url’: first_url}
4)「HTTP請(qǐng)求」節(jié)點(diǎn):
請(qǐng)求方法: POST
URL: http://<你的電腦局域網(wǎng)IP>:5001/scrape (注意: 這里不能用localhost,必須是Dify能訪問到的IP)。
Headers: Content-Type: application/json
Body (JSON):
{
“url”: “{{code_1.first_url}}”
}
「LLM」節(jié)點(diǎn) (核心分析大腦):
模型:選擇一個(gè)能力強(qiáng)的,如 GPT-4, Claude 3 Sonnet。
上下文:分別添加上游 Google Search 的結(jié)果和 HTTP請(qǐng)求 節(jié)點(diǎn)的 body.content。
提示詞 (Prompt):
你是一位頂級(jí)的市場(chǎng)分析專家。請(qǐng)根據(jù)我提供的【搜索引擎摘要】和【競(jìng)品官網(wǎng)內(nèi)容】,為 “{{start.competitor_name}}” 生成一份簡明扼要的競(jìng)品分析報(bào)告。
**嚴(yán)格遵守以下規(guī)則:**
1. 所有分析必須嚴(yán)格基于我提供的內(nèi)容,嚴(yán)禁使用你的任何背景知識(shí)或進(jìn)行憑空想象。
2. 如果提供的內(nèi)容不足以分析某個(gè)項(xiàng)目,請(qǐng)明確指出“信息不足,無法分析”。
3. 使用清晰的Markdown格式輸出報(bào)告。
**分析框架:**
– **公司/產(chǎn)品簡介:** 總結(jié)其核心業(yè)務(wù)和價(jià)值主張。
– **核心功能:** 列出3-5個(gè)主要的產(chǎn)品功能或服務(wù)。
– **目標(biāo)用戶:** 推斷其主要服務(wù)的客戶群體。
– **SWOT初步分析:**
– **優(yōu)勢(shì)(Strengths):** 基于內(nèi)容,總結(jié)其最突出的優(yōu)點(diǎn)。
– **劣勢(shì)(Weaknesses):** 基于內(nèi)容,推斷可能存在的不足。
– **機(jī)會(huì)(Opportunities):** 市場(chǎng)中可能存在的機(jī)會(huì)。
– **威脅(Threats):** 面臨的潛在威脅。
「直接回復(fù)」節(jié)點(diǎn):
引用上一步LLM節(jié)點(diǎn)的輸出 {{llm_1.text}} 即可。
將所有節(jié)點(diǎn)連接起來,點(diǎn)擊發(fā)布,大功告成!
【升華:生產(chǎn)級(jí)思考】—— 從Demo到實(shí)用工具
這個(gè)Demo本質(zhì)上是一個(gè)小型的 RAG (檢索增強(qiáng)生成) 應(yīng)用。它讓LLM在回答前,先去檢索(Google)和增強(qiáng)(抓取網(wǎng)頁)上下文,從而生成更準(zhǔn)確、更具時(shí)效性的答案,極大地避免了模型幻覺。
如果想讓它在真實(shí)世界更好用,我們還可以思考:
- 動(dòng)態(tài)內(nèi)容抓?。?/strong>當(dāng)前的抓取服務(wù)對(duì)付不了JavaScript動(dòng)態(tài)加載的網(wǎng)站,未來可以升級(jí)為使用Selenium或Playwright等更強(qiáng)大的工具。
- 信息源容錯(cuò):如果搜索到的第一個(gè)鏈接不是官網(wǎng)怎么辦?可以設(shè)計(jì)一個(gè)循環(huán)或判斷邏輯,嘗試多個(gè)鏈接。
- 深度分析:除了官網(wǎng),我們還可以讓它去抓取新聞稿、社交媒體評(píng)價(jià)等,為LLM提供更全面的分析材料。
【附贈(zèng):我的工具箱】
核心編排:Dify – 毫無疑問,可視化編排AI工作流的神器。
外部服務(wù):Python (Flask + Requests + BeautifulSoup) – 構(gòu)建API和網(wǎng)頁抓取的經(jīng)典組合,輕量且強(qiáng)大。
部署利器:Docker – 一次打包,到處運(yùn)行,現(xiàn)代軟件工程必備技能。
分析大腦:GPT-4 / Claude 3 Sonnet – 強(qiáng)大的LLM是保證分析質(zhì)量的核心。
【結(jié)尾:總結(jié)與回歸】
通過這個(gè)實(shí)驗(yàn),我們不僅構(gòu)建了一個(gè)非常實(shí)用的AI助手,更重要的是,我們完整地經(jīng)歷了一次從需求分析、架構(gòu)設(shè)計(jì)、技術(shù)攻堅(jiān)到最終實(shí)現(xiàn)的AI應(yīng)用工程落地過程。這比單純調(diào)用一個(gè)API要酷得多!
當(dāng)然,從這個(gè)Demo到真正成熟的生產(chǎn)級(jí)應(yīng)用還有很長的路要走,但這無疑是一個(gè)完美的起點(diǎn)。
我是阿亞,我們下次再聊!
本文由 @超人阿亞 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)作者許可,禁止轉(zhuǎn)載
題圖來自Unsplash,基于CC0協(xié)議
- 目前還沒評(píng)論,等你發(fā)揮!