logo
11

文心一言API的json输出技巧

文心一言大模型4.0的api发布后就立即调试了一下,使用方法和以前的版本基本没有太大变换,只是发现对用户意图的理解更加精准了,下面就举个实际开发中的例子说明。
众所周知,程序接口中的数据格式最好的就是json了,但是LLM输出的结果都是文本,如何将文本转化为各种程序能够识别的结构化数据呢?

需求:读取网页内容给出摘要、关键词、标题、发布日期等

常规做法:

  1. 使用BeautifulSoup解析网页
  2. 标识正文、标题、日期等标签,并使用soap的方法逐个查找和识别,将从html中提取的文本存储到相关字段
  3. 将正文发送到文心一言API提取摘要和关键词
  4. 将上面的字段组织为json返回

存在弊端:

  1. 每个网页结构差异很大,要针对每个网页分析dom结构,再编写相关程序才能够提取这些字段
  2. 文心一言返回的结果是纯文本转化为结构化数据不方便

优化思路:

  1. 有没有统一从html提取文本的方法
  2. 文心一言API能不能直接从文本阅读理解中识别出摘要、关键词、标题、发布日期等内容并直接格式化为json

动手:

  1. BeautifulSoup的soap的get_text方法就可以把html里边的全部标签去除掉,只保留文本,这个就解决了第一个问题
  2. 文心一言的文本理解能力非常强大,直接把这些文本给到他,就可以提取这些内容,但是这里要有好的prompt给到文心一言,也就是本文的核心技巧所在

关键代码:

  • 提取网页文本
  
  
  
  
  
  
# 提取其他未知网站内容
def webpage_keywords_other(url):
try:
response = requests.get(url)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f'\n{e}')
return {"message":f"访问{url}异常","errCode":-101}
# 使用指定的编码方式解析网页内容
soup = BeautifulSoup(response.content, "html.parser", from_encoding="utf-8")
content=soup.get_text().replace('\n','').replace('\r','').replace('\t','')
return {"content":content,"errCode":0}
  • 调用文心一言API,给准确的prompt
  
  
  
  
  
  
# 提示词给 LLM 返回答案
def chat(prompt):
url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=" + get_access_token()
payload = json.dumps(
{
"messages": [
{
"role": "user",
"content": prompt
}
],
"system":"你是一名高级文秘,仔细阅读下面的文章后给出这篇文章的摘要(summary),前10个关键词(keywords),来源(source),标题(title),发布时间(public_time)等,结果必须用json代码的格式输出"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
# 字符串转化为 json
response = json.loads(response.text)
return(json.loads(str_to_json(response.get('result'))))
备注:
  1. 需要一json输出的数据要明确告诉LLM,并且指明key的英文表达,否则输出的就是中文,不利于程序读取
  2. 文心一言输出的json是文本形式的,必须编程转化
  • 对文心一言的输出进行格式转化
  
  
  
  
  
  
# 从字符串的第一个{开始到最后一个}结束,截取中间字符串
def str_to_json(data:str):
start_index = data.find("```json")
end_index = data.rfind("```")
result = data[start_index+8:end_index]
return result

执行结果:

优点:

  1. 不用再像以前分析每个网站的网页结构
  2. 结构化输出方便不同接口传递数据
  3. 基本达到了人工阅读网站的能力

期待:

AI能够阅读更丰富的多媒体内容,能够利用爬虫技术对一个完整的网站进行整理,总结。
评论
用户头像