学习笔记21《部署一个鲜花网络电商的人脉工具(下)》

133 阅读3分钟

项目概述

本项目旨在为易速鲜花电商创建一个人脉工具,通过LangChain技术,自动化地寻找并联系对特定鲜花感兴趣的微博大V,以推广鲜花产品。项目分为五个主要步骤:

  1. 搜索大V:使用LangChain的搜索工具,模糊搜索可能对特定鲜花感兴趣的大V,并返回UID。
  2. 爬取信息:根据UID,爬取大V的公开信息,并以JSON格式返回。
  3. 生成介绍文章:利用LLM生成一篇热情洋溢的介绍型文章,以谋求与大V的合作。
  4. 输出解析:使用LangChain的输出解析功能,生成格式化的数据结构,便于集成到HTML中展示。
  5. 部署工具:创建前端页面,并将工具部署到服务器,供市场营销人员使用。

详细步骤与代码解析

第三步:生成介绍文章
  • 代码重构:将生成文案的功能封装到tools/textgen_tool.py中的generate_letter函数。
  • 提示模板设计:设计一个提示模板,让LLM根据大V的个人信息生成文案。
  • 代码实现
    letter_template = """
        下面是这个人的微博信息 {information}
        请你帮我:
        1. 写一个简单的总结
        2. 挑两件有趣的事情说一说
        3. 找一些他比较感兴趣的事情
        4. 写一篇热情洋溢的介绍信
    """
    
第四步:加入输出解析
  • 创建解析模型:在tools/ParsingTool.py中定义一个名为TextParsing的Pydantic模型,用于解析大V信息。
  • 代码实现
    from pydantic import BaseModel, Field
    from typing import List
    
    class TextParsing(BaseModel):
        summary: str = Field(description="大V个人简介")
        facts: List[str] = Field(description="大V的特点")
        interest: List[str] = Field(description="这个大V可能感兴趣的事情")
        letter: List[str] = Field(description="一篇联络这个大V的邮件")
    
        def to_dict(self):
            return {
                "summary": self.summary,
                "facts": self.facts,
                "interest": self.interest,
                "letter": self.letter,
            }
    
第五步:部署人脉工具
  • HTML文件:创建templates/index.html,用于用户交互展示。
    <!-- templates/index.html -->
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
        <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> 
        <title>Ice Breaker</title>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.0/css/all.min.css" />
        <div class="spinner-container" id="spinner-container" style="display: none;">
            <i id="loading-spinner" class="fas fa-spinner fa-spin"></i>
        </div>
    </head>
    <body>
        <div class="container">
            <h1>易速鲜花人脉工具</h1>
            <form id="name-form">
                <input type="text" id="flower" name="flower" placeholder="输入一种花(或者其它东西也行)">
                <button id="magic-button" type="submit">找到大V</button>
            </form>
            <div id="result">
                <img id="profile-pic" src="" alt="Profile Picture" style="display: none; max-width: 100%; height: auto; border-radius: 50%; margin-bottom: 20px;">
                <h2>基本情况</h2>
                <p id="summary"></p>
                <h2>特色内容</h2>
                <div id="facts"></div>
                <h2>可能感兴趣的事儿</h2>
                <div id="interest"></div>
                <h2>联络邮件</h2>
                <div id="letter"></div>
            </div>
        </div>
        <script>
            $(document).ready(function () {
                $('#name-form').on('submit', function (e) {
                    e.preventDefault();
                    $('#spinner-container').show();
                    $.ajax({
                        url: '/process',
                        data: $('#name-form').serialize(),
                        type: 'POST',
                        success: function (response) {
                            $('#profile-pic').attr('src', '你的URL'); 
                            $('#profile-pic').show(); 
                            $('#summary').text(response.summary);
                            $('#facts').html('<ul>' + response.facts.map(fact => '<li>' + fact + '</li>').join('') + '</ul>');
                            $('#interest').html('<ul>' + response.interest.map(interest => '<li>' + interest + '</li>').join('') + '</ul>');
                            $('#letter').text(response.letter);
                        },
                        error: function (error) {
                            console.log(error);
                        },
                        complete: function () {
                            $('#spinner-container').hide();
                        }
                    });
                });
            });
        </script>
    </body>
    </html>
    
  • CSS文件:创建static/css/style.css,美化页面。
  • Flask应用:创建app.py,用于处理用户请求并返回数据。
    from flask import Flask, render_template, request, jsonify
    from findbigV import find_bigV
    import json
    
    app = Flask(__name__)
    
    @app.route("/")
    def index():
        return render_template("index.html")
    
    @app.route("/process", methods=["POST"])
    def process():
        flower = request.form["flower"]
        response_str = find_bigV(flower=flower)
        response = json.loads(response_str)
        return jsonify(
            {
                "summary": response["summary"],
                "facts": response["facts"],
                "interest": response["interest"],
                "letter": response["letter"],
            }
        )
    
    if __name__ == "__main__":
        app.run(host="0.0.0.0", debug=True)
    

思考题

  1. 修改提示模板:调整提示模板,生成更贴合业务需求的文案。
  2. 爬取其他网站数据:尝试爬取豆瓣等其他网站的公开数据,制作更全面的人脉工具。
  3. 程序鲁棒性:修改程序,提高其鲁棒性,确保在不同情况下都能稳定运行。

总结

本项目是一个结合了LangChain技术和Flask Web开发的实战案例,涵盖了从数据爬取、文本生成到Web部署的全过程。通过这个项目,我们可以学习到如何利用LangChain的链、代理、工具以及LLM的文本摘要和生成功能,来构建一个实用的商业工具。同时,项目也展示了如何通过自定义工具和输出解析,来满足特定的业务需求。