部署一个鲜花网络电商的人脉工具
我们来做一个小程序,这个小程序需要把LangChain中各个组件灵活的组合起来,融会贯通。其需求为,希望利用微博或小红书等平台的网红,明星作为推手,从而推广鲜花。
那么这就需要我们能够根据想要推荐的鲜花,从而找到合适的明星或者网红,并给出一个联络方案。
具体的技术方案为
- 根据鲜花种类搜索微博找到合适的大V
- 根据大V的UID,获取到大V的信息,以JSON的方式返回大V数据
- 通过大V的JSON数据,通过LLM生成一个文案,要求文案符合大V的风格
- 利用Flask创建一个APP,部署在服务器供营销人员使用。
那么我们一步步的来:
第一步,找到大V
这里我们准备一个python文件进行搜索,这里面我们定义一个方法
lookup_V(flower_type:str)
根据一个花的类型来获取到大V的UID
其需要用到我们之前说的ReAct框架
# 通过LangChain代理找到UID的函数
def lookup_V(flower_type: str) : # 初始化大模型 llm = ChatOpenAI(temperature=0, model_name=”gpt-3.5-turbo”) # 寻找UID的模板 template = “””given the {flower} I want you to get a related 微博 UID. Your answer should contain only a UID. The URL always starts with https://weibo.com/u/ for example, if https://weibo.com/u/1669879400 is her 微博, then 1669879400 is her UID This is only the example don’t give me this, but the actual UID””” # 完整的提示模板 prompt_template = PromptTemplate( input_variables=[“flower”], template=template ) # 代理的工具 tools = [ Tool( name=”Crawl Google for 微博 page”, func=get_UID, description=”useful for when you need get the 微博 UID”, ) ] # 初始化代理 agent = initialize_agent( tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True ) # 返回找到的UID ID = agent.run(prompt_template.format_prompt(flower=flower_type)) return ID |
这里面的重点在于我们在Tools中使用到的get_UID
get_UID是我们专门针对搜索微博书写的一个工具函数
def get_UID(flower: str):
# search = SerpAPIWrapper()
search = CustomSerpAPIWrapper()
res = search.run(f”{flower}”)
return res
在其中我们声明了一个Wrapper,是利用的原本的SerpAPIWrapper进行封装的。
这个封装的原因主要是因为我们在搜索微博的过程中,得到的结果往往是Snippet,也就是摘要,而我们更需要了解到的是URL,通过URL中解析UID
所以进行了客制化处理
if “snippet” in first_organic_result.keys():
# snippets.append(first_organic_result[“snippet”]) snippets.append(first_organic_result[“link”]) |
故此我们可以通过获取URL来获取到大V的UID了
之后就是根据UID获取到这个大V的相关资料了
# 根据UID爬取大V信息
person_info = get_data(UID) print(person_info) # 移除无用的信息 remove_non_chinese_fields(person_info) print(person_info) |
首先是获取到相关数据,之后再是移除额外的信息
这两个函数都和LLM没有关系,就是简单的爬虫+python函数
关于get_data
def get_data(id):
url = “https://weibo.com/ajax/profile/detail?uid={}”.format(id) headers = { “User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36”, “Referer”: “https://weibo.com” } cookies = { “cookie”: ”’your cookie”’ } html = requests.get(url, headers=headers, cookies=cookies) time.sleep(3) # 加上3s 的延时防止被反爬 response = json.loads(html.text) return response |
本质上就是获取response并进行返回
然后是remove_non_chinese_fields,移除非中文的字段
def remove_non_chinese_fields(d):
if isinstance(d, dict): to_remove = [key for key, value in d.items() if isinstance(value, (str, int, float, bool)) and (not contains_chinese(str(value)))] for key in to_remove: del d[key] for key, value in d.items(): if isinstance(value, (dict, list)): remove_non_chinese_fields(value) elif isinstance(d, list): to_remove_indices = [] for i, item in enumerate(d): if isinstance(item, (str, int, float, bool)) and (not contains_chinese(str(item))): to_remove_indices.append(i) else: remove_non_chinese_fields(item) for index in reversed(to_remove_indices): d.pop(index) |
根据是否为中文进行移除
这样就获取到了详细的信息。
接下来我们继续
将这个获取到的信息,传递给LLM,生成介绍文章
并且利用Output Parser输出特定格式的文档
将信息传递给LLM的同时,我们还需要设计好一个模板
这里我们先明确需要返回的格式
也就是定义一个OutputParser
class TextParsing(BaseModel):
summary: str = Field(description=”大V个人简介”) # 大V的简介或背景信息 facts: List[str] = Field(description=”大V的特点”) # 大V的一些显著特点或者事实 interest: List[str] = Field(description=”这个大V可能感兴趣的事情”) # 大V可能感兴趣的主题或活动 letter: List[str] = Field(description=”一篇联络这个大V的邮件”) # 联络大V的建议邮件内容 # 将模型对象转换为字典 def to_dict(self): return { “summary”: self.summary, “facts”: self.facts, “interest”: self.interest, “letter”: self.letter, } # 创建一个基于Pydantic模型的解析器,用于将文本输出解析为特定的结构 letter_parser: PydanticOutputParser = PydanticOutputParser( pydantic_object=TextParsing ) |
这里我们定义了一个模式,其包含四个字段,分别是summary简介,facts 特点
Interest 兴趣点 letter 联络邮件
之后我们利用这个output parser指定大模型的输出
# 生成文案的函数
def generate_letter(information): # 设计提示模板 letter_template = “”” 下面是这个人的微博信息 {information} 请你帮我: 1. 写一个简单的总结 2. 挑两件有趣的特点说一说 3. 找一些他比较感兴趣的事情 4. 写一篇热情洋溢的介绍信 \n{format_instructions}””” prompt_template = PromptTemplate( input_variables=[“information”], template=letter_template, partial_variables={ “format_instructions”: letter_parser.get_format_instructions() }, ) # 初始化大模型 llm = ChatOpenAI(model_name=”gpt-3.5-turbo”) # 初始化链 chain = LLMChain(llm=llm, prompt=prompt_template) # 生成文案 result = chain.run(information = information) return result |
通过这种方式,初始化大模型,进行文案的生成。
这样,我们得到了一个包含上面指定的格式的json文档。
最后我们要实现第五步,将这个工具部署到服务器上,提供对外访问的接口
这里我们使用flask app来实现
首先我们创建一个HTML文件
并init 一个 app
# 实例化Flask应用
app = Flask(__name__) # 主页路由,返回index.html模板 @app.route(“/”) def index(): return render_template(“index.html”) # 处理请求的路由,仅允许POST请求 @app.route(“/process”, methods=[“POST”]) def process(): # 获取提交的花的名称 flower = request.form[“flower”] # 使用find_bigV函数获取相关数据 response_str = find_bigV(flower=flower) # 使用json.loads将字符串解析为字典 response = json.loads(response_str) # 返回数据的json响应 return jsonify( { “summary”: response[“summary”], “facts”: response[“facts”], “interest”: response[“interest”], “letter”: response[“letter”], } ) # 判断是否是主程序运行,并设置Flask应用的host和debug模式 if __name__ == “__main__”: app.run(host=”0.0.0.0″, debug=True) |
主要是在
Process函数中
我们首先获取到了flower这个入参数
之后是利用find函数,获取到对应的response
最后解析后返回
那么我们总结一下,我们实现了一个具有搜索微博,并将搜索结果一个特定格式返回的程序,我们利用了LangChain中的链,代理,输出解释器,模板,自定义的工具。