部署一个鲜花网络电商的人脉工具

我们来做一个小程序,这个小程序需要把LangChain中各个组件灵活的组合起来,融会贯通。其需求为,希望利用微博或小红书等平台的网红,明星作为推手,从而推广鲜花。

那么这就需要我们能够根据想要推荐的鲜花,从而找到合适的明星或者网红,并给出一个联络方案。

具体的技术方案为

  1. 根据鲜花种类搜索微博找到合适的大V
  2. 根据大V的UID,获取到大V的信息,以JSON的方式返回大V数据
  3. 通过大V的JSON数据,通过LLM生成一个文案,要求文案符合大V的风格
  4. 利用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了

成功得到了大 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中的链,代理,输出解释器,模板,自定义的工具。

发表评论

邮箱地址不会被公开。 必填项已用*标注