取代Jina,打造稳定好用的网页助理

环境:dify 14.2 docker 版本;

工具:craw4ai

模型:glm-4-flash

一、背景

Dify 中内置了知名的页面爬取工具 jina,该工具可用于爬取网页内容,并进行清洗以及转化为 markdown 格式,用于后续的大模型处理。不过,在国内的网络环境中,其使用体验不尽如人意,常常会因超时问题而导致页面内容爬取失败。

二、解决思路

采用本地化部署开源爬虫工具 craw4ai,并借助 flask 提供 api 接口服务。在 dify 中以自定义工具或者代码工具的方式读取网页链接,取代 jina,以此完成工作流中的网页爬取任务,进而增强工作流的稳定性。

三、准备工作
  1. 安装 flask,craw4ai 和 aiohttp 包;

    pip install flask aiohttp crawl4ai
    
  2. 自定义 craw4ai 接口服务,端口指定为 20009,记得开启防火墙端口:

    创建文件 craw4.py:

    from flask import Flask, request, jsonify
    import asyncio
    from crawl4ai import AsyncWebCrawler
    import aiohttp
    import urllib.parse
    
    app = Flask(__name__)
    
    # 设置响应头部,确保返回的JSON是UTF-8编码
    app.config['JSON_AS_ASCII'] = False
    app.config['JSONIFY_MIMETYPE'] = 'application/json; charset=utf-8'
    
    @app.route('/fetch_content', methods=['GET'])
    def fetch_content():
        url = request.args.get('url')
        if not url:
            return jsonify({'error': 'URL参数是必需的'}), 400
    
        # 验证URL是否有效(简单的检查,实际应用中可能需要更复杂的验证)
        try:
            result = urllib.parse.urlparse(url)
            if not all([result.scheme, result.netloc]):
                return jsonify({'error': '无效的URL'}), 400
        except ValueError:
            return jsonify({'error': '无效的URL'}), 400
    
        try:
            loop = asyncio.new_event_loop()
            asyncio.set_event_loop(loop)
            result = loop.run_until_complete(fetch_url_content(url))
            return jsonify({'content': result}), 200
        except aiohttp.ClientError as e:
            return jsonify({'error': '网络错误:' + str(e)}), 500
        except Exception as e:
            return jsonify({'error': '发生错误:' + str(e)}), 500
    
    async def fetch_url_content(url):
        try:
            async with AsyncWebCrawler(verbose=True) as crawler:
                result = await crawler.arun(
                    url=url,
                    bypass_cache=True,
                    magic=True,
                    word_count_threshold=10,        # Minimum words per block
                    exclude_external_links=True,    # Remove external links
                    exclude_external_images=True,   # Remove external images
                    excluded_tags=['form', 'nav'],   # Remove specific HTML tags)
                    remove_overlay_elements=True
                    )
                # 确保返回的文本是UTF-8编码
                # return result.markdown.encode('utf-8').decode('utf-8')
                return result.markdown
        except Exception as e:
            raise Exception(f"从{url}获取内容失败:{str(e)}")
    
    if __name__ == '__main__':
        app.run(debug=True, host='0.0.0.0', port=20009)
    
  3. 启动服务:

    python craw4.py
    
  4. 测试接口:可以直接用浏览器访问地址:http://你的 ip 地址:20009/fetch_content?url=爬取地址;

    例如:http://192.168.3.86:20009/fetch_content?url=https://www.36kr.com/p/3018968349779203

四、Dify 工作流应用
  1. 我们以使用代码工具为例,介绍如何在 dify 中使用 craw4ai 接口服务;

    import requests
    import re
    
    def main(arg1: str) -> dict:
        try:
            # 构造请求的URL和参数
            url = 'http://192.168.3.86:20009/fetch_content'
            test_url = arg1
    
            # 发送GET请求
            response = requests.get(url, params={'url': test_url})
    
            # 检查响应状态码
            if response.status_code == 200:
                # 请求成功,处理结果
                result = response.json()
                # 将结果转换为字符串
                result_str = str(result)
    
                # 移除字符串中的所有链接格式
                result_str = re.sub(r'http\S+', '', result_str)
    
                # 检查结果长度并截断至80000字以内
                if len(result_str) > 80000:
                    result_str = result_str[:80000] + '... (截断)'
                return {
                    "result": result_str
                }
            else:
                # 请求失败,返回错误信息
                error_msg = response.json().get('error', 'Unknown error')
                return {
                    "result": str(error_msg)
                }
        except requests.RequestException as e:
            # 网络请求异常,返回异常信息
            error_msg = f"请求失败:{str(e)}"
            return {
                "result": error_msg
            }
    
  2. 通过代码调用 craw4ai 接口服务,并在下一步中将获取到的内容传递给大模型,让大模型进行分析和输出。

五、应用效果

关注微信公众号【红岸解码室】,发送“网页助理”,获取网页助理 DSL 文件!

适合人群:本课程适合编程初学者、AI爱好者、IT转型者、产品经理、高校学生、创业者及中小企业主等,以及对Dify平台感兴趣的各界专业人士。通过系统学习,你将会学到:学员将从0基础开始,逐步学习并掌握Dify的开发技能,包括模型配置、应用管理、工作流编排等学员将从0基础开始,逐步学习并掌握Dify的开发技能,包括模型配置、应用管理、工作流编排等核心功能。通过课程的学习,学员将能够独立完成Dify应用的开发,提升个人在智能化应用开发领域的竞争力。课程包含丰富的实战案例,学员将通过实际操作,了解如何在实际业务场景中部署Dify应用。学员将学习如何构建智能客服系统、企业知识库等实际应用,积累宝贵的实战经验,为未来的职业发展打下坚实基课程将帮助学员建立敏锐的市场洞察力,发掘潜在的职业机会,为未来的职业发展创造更多可能性。课程简介:Dify平台基础入门平台概述:介绍Dify平台的背景、特点、应用场景及优势。安装与配置:详细讲解Dify平台的安装步骤、配置方法以及常见问题的解决方法。界面导航:引导学员熟悉Dify平台的界面布局、菜单栏、工具栏、工作区及状态栏等功能区域。核心功能解析多语言模型集成:介绍Dify平台如何兼容并集成主流AI语言模型,如OpenAI GPT-4/GPT-3.5、Anthropic Claude、Google Gemini等。Prompt工程:深入讲解Prompt的概念、作用及优化方法,帮助学员提高AI交互效果。数据处理与分析:展示如何利用Dify平台的数据处理功能,包括数据导入、清洗、转换及可视化等。实战操作与案例分析对话型AI应用构建:通过实际案例,演示如何创建对话型AI应用,包括设置对话流程、配置Prompt、测试与迭代等步骤。文本生成工具开发:指导学员开发文本生成工具,如自动生成博客文章、产品描述、社交媒体文案等。智能客服系统搭建:分析智能客服系统的应用场景,教授学员如何搭建并优化智能客服系统,提高响应效率。高级应用技巧与拓展自定义函数与脚本编写:教授学员如何编写自定义函数或脚本,以实现特定功能的自动化处理。协同工作与版本控制:介绍Dify平台的协同工作功能,以及如何利用版本控制功能管理项目历史版本。API扩展与业务集成:讲解如何将Dify平台创建的AI应用发布为API,或嵌入到Web页面中实现业务集成。实战项目演练项目选题与需求分析:引导学员进行项目选题,并进行需求分析,明确项目目标和要求。项目设计与实施:指导学员进行项目设计,包括选择AI模型、配置Prompt、搭建应用框架等,并实施项目开发。项目测试与优化:教授学员如何进行项目测试,包括功能测试、性能测试等,并根据测试结果进行优化。未来趋势与职业发展AI应用开发趋势分析:分析AI应用开发领域的未来发展趋势,帮助学员把握行业脉搏。职业规划与能力提升:为学员提供职业规划建议,以及提升AI应用开发能力的方法和途径。通过本课程的学习,学员将能够全面掌握Dify平台的使用技巧,具备独立开发AI应用的能力,并在实战中不断提升自己的专业技能和创新思维。
### Jina Embedding Usage and Implementation In the context of Jina, embeddings are used extensively within document processing pipelines where documents (text, images, audio, etc.) get transformed into numerical vectors that capture semantic information about their content. These embeddings facilitate tasks such as similarity search, classification, clustering, among others. For implementing embeddings with Jina: A Flow object defines how data travels through different components called Executors which perform specific operations on this data including generating embeddings from input documents[^3]. An Executor specialized in creating embeddings might use pre-trained models like BERT for text inputs or ResNet for image inputs to generate high-dimensional vector representations. To demonstrate using an embedding executor in Python code: ```python from jina import Flow, DocumentArray, Document f = ( Flow() .add(uses='jinahub+sandbox://SimpleIndexer', name='indexer') ) with f: da = DocumentArray([Document(text='hello world')]) response = f.post(on='/encode', inputs=da) ``` This script sets up a flow adding an indexer component capable of handling encoding requests. A `DocumentArray` containing one textual document gets passed along; upon posting `/encode`, each document traverses defined executors transforming its contents accordingly—potentially extracting features via neural networks before storing results internally or forwarding them further down the pipeline. Regarding managing these processes efficiently alongside other functionalities mentioned previously concerning plugin management systems, similar principles apply regarding lifecycle events but tailored specifically towards indexing/searching workflows rather than generalized extension points found outside Jina's ecosystem[^1].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值