從0到1保姆級(jí)實(shí)戰(zhàn):用 Dify Agent + Python 打造自動(dòng)化競(jìng)品分析AI助手(附完整代碼)

0 評(píng)論 1674 瀏覽 11 收藏 12 分鐘

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é)議

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 目前還沒評(píng)論,等你發(fā)揮!