1 基础使用
1.1 多轮对话
代码语言:python代码运行次数:0复制model = 'ernie-3.5'
messages = [{'role': 'user', 'content': "请问你能以《你好,世界》为题,写⼀⾸现代诗吗?"}]
first_response = erniebot.ChatCompletion.create(
model=model,
messages=messages,
)
print(first_response.get_result())
messages.append(first_response.to_message())
messages.append({'role': 'user', 'content': "谢谢你!请问你能把这⾸诗改写成七⾔绝句吗?"})
代码语言:python代码运行次数:0复制你好,喧嚣⼜静谧的世界,
你好,早晨的阳光,带来希望的诺⾔。
我推开窗户,呼吸新鲜的空⽓,
仿佛听到万物⽣⻓的旋律。
你好,繁忙的街道,⻋⽔⻢⻰,
你好,孤独的⾏⼈,各⾃怀揣梦想。
我踏上路途,步履匆匆,
在这⼈海中,寻找⾃⼰的⽅向。
你好,书籍的海洋,知识的宝库,
你好,每⼀⻚的字句,传递智慧的⽕种。
我翻开书⻚,如饥似渴,
在墨⾹中,探索未知的宇宙。
你好,⼭川河流,⼤地的⼉⼥,
你好,⻛⾬雷电,⾃然的交响乐团。
我踏上旅途,⾛过千⼭万⽔,
在⼤⾃然的怀抱中,感受⽣命的律动。
你好,亲朋好友,温暖的港湾,
你好,爱⼈的怀抱,甜蜜的避⻛港。
我停下脚步,与你们共度时光,
在爱的滋润中,感受⽣活的甜美。
你好,梦想与希望,未来的灯塔,
你好,挫折与困惑,成⻓的伴侣。
我勇往直前,⽆畏⽆惧,
在追逐梦想的路上,绽放⽣命的光彩。
你好,世界,你是我的舞台,
在这⼴袤的天地,我尽情地歌唱。
⽆论⻛⾬,⽆论坎坷,
我都会以微笑,迎接每⼀个新的挑战。
# 再次执行python simple.py
宇宙⽆垠浩渺烟,
星⾠闪烁似眸前。
凌晨暗尽曙光现,
⽣命如诗诉世间。
# 再次执行python simple.py
你好,世界
清晨的阳光,
你好,世界。
空⽓微凉,露⽔晶莹,
我醒来,迎接新的⼀天。
街头巷尾,喧嚣声起,
城市如潮,⼈海如流。
擦肩⽽过,⾯孔匆匆,
我们都是过客,也是主⼈。
⻛轻轻吹过,树叶摇曳,
绿意盎然,⽣机勃勃。
花⼉微笑,⻦⼉欢歌,
⾃然的乐章,悠远⽽和谐。
⾼楼林⽴,灯⽕辉煌,
⼈间烟⽕,温暖如诗。
梦想与现实,交织碰撞,
我们在这⾥,欢笑,哭泣。
⻩昏降临,天空渐暗,
星星闪烁,⽉亮⾼悬。
夜晚的宁静,如梦如幻,
让我们沉淀,思考,感悟。
你好,世界,如此美好,
有时喧嚣,有时宁静。
感谢有你,伴我成⻓,
让我懂得,珍惜每⼀刻。
愿我们都能,热爱这个世界,
⽆论⻛⾬,⽆论坎坷。
因为这⾥,有我们的故事,
有我们的笑,有我们的泪。
清晨醒来世界好,
喧嚣宁静皆相宜。
⼈海如流梦与泪,
珍惜每⼀刻时光。
1.2 语义向量
代码语言:javascript复制import numpy as np
response = erniebot.Embedding.create(
model='ernie-text-embedding',
input=[
"我是百度公司开发的⼈⼯智能语⾔模型,我的中⽂名是⽂⼼⼀⾔,英⽂名是ERNIE-Bot。",
]
)
for embedding in response.get_result():
embedding = np.array(embedding)
print(embedding)
代码语言:javascript复制[ 1.05796956e-01 5.54055907e-02 7.05274269e-02 6.80853873e-02
2.19543446e-02 -8.23291615e-02 5.80838742e-03 -3.95872444e-02
-6.67352304e-02 6.36451393e-02 2.38892473e-02 -5.38846627e-02
-1.38354721e-02 6.17682897e-02 -1.20219052e-01 -1.80966649e-02
2.67774030e-03 2.98716705e-02 2.02097371e-02 2.81390417e-02
-1.81193538e-02 -1.42875379e-02 -2.74522286e-02 -3.99198793e-02
2.82987747e-02 -5.53232767e-02 4.74652238e-02 8.74237940e-02
8.49522371e-03 -4.90075152e-04 -3.19835804e-02 -7.75019005e-02
3.95072177e-02 -4.12306823e-02 -2.93791015e-02 2.04885248e-02
-2.41762819e-03 5.51483557e-02 -2.76580034e-03 -4.78615006e-03
-6.95221275e-02 1.82033679e-03 6.79030642e-02 -4.98030446e-02
4.57640179e-02 -5.11501618e-02 -8.33012164e-02 4.38632257e-02
-7.27836490e-02 -1.50356228e-02 4.07841243e-02 -3.58146569e-03
7.91437924e-02 -7.24523962e-02 1.43934460e-02 -5.13507379e-03
-5.56587055e-02 -1.04998769e-02 2.27469485e-02 -2.75466628e-02
-4.02328148e-02 -3.16361561e-02 5.19508263e-03 -1.08803719e-01
1.01775415e-01 2.43589636e-02 3.94213647e-02 1.81834418e-02
-1.67791601e-02 1.47812366e-02 4.10323543e-03 4.59933989e-02
-8.88352171e-02 9.38988179e-02 1.15360558e-01 4.45992872e-02
-4.93527539e-02 2.50529908e-02 -1.24783618e-02 -1.05745741e-03
5.53896427e-02 -1.21540688e-02 3.29398215e-02 -2.64890995e-02
-5.65348454e-02 4.73656170e-02 -5.08274063e-02 -2.12998204e-02
3.03340480e-02 -1.17116421e-03 -8.34121630e-02 -1.44359097e-01
4.35920581e-02 -7.42861032e-02 -4.87634651e-02 6.26977533e-02
-4.89826165e-02 -6.96981279e-03 4.14343253e-02 -2.13833973e-02
-1.53256943e-02 -3.02240215e-02 5.09763397e-02 -5.36648743e-02
4.80750650e-02 -6.14303052e-02 -8.61920118e-02 -1.47142649e-01
1.28216036e-02 1.99202565e-03 -5.23411259e-02 6.01450205e-02
-7.86271691e-03 2.82727033e-02 -8.65496416e-03 3.98108028e-02
-6.28771679e-03 -5.05168363e-02 1.60338439e-03 -9.21090841e-02
-9.83563885e-02 4.56203260e-02 -4.12734970e-02 7.89025873e-02
8.46971106e-03 -2.97649615e-02 -1.05914578e-01 -5.97295724e-03
1.85222793e-02 1.24933913e-01 8.96089431e-03 2.24596560e-02
-6.27063066e-02 2.11080853e-02 8.20125863e-02 3.21913995e-02
-4.45441576e-03 1.06502213e-02 -1.44699905e-02 5.52752912e-02
4/21 -1.98988654e-02 5.83804138e-02 -6.11526752e-03 -3.06658037e-02
2.53539365e-02 2.62746699e-02 -4.70754877e-02 1.09676026e-01
-4.20754328e-02 4.63351794e-02 3.69115151e-03 1.46047156e-02
-2.23591505e-03 -3.45837958e-02 -5.32594509e-02 -1.81983169e-02
2.05144957e-02 -4.00835909e-02 -3.27899754e-02 -2.43276148e-03
-4.79984507e-02 -1.08704250e-03 -7.03660846e-02 -1.51871517e-02
2.08570994e-02 -8.44927505e-02 -2.58132499e-02 4.30639163e-02
3.36906239e-02 -4.37748954e-02 1.33909693e-03 4.81758118e-02
7.18222111e-02 -3.71486358e-02 -6.59052059e-02 4.53401767e-02
9.22728106e-02 9.50537398e-02 2.28160936e-02 -1.45495860e-02
7.87882954e-02 -6.50347993e-02 -1.27899088e-02 4.71387319e-02
1.04115466e-02 2.98030749e-02 1.28394021e-02 6.47417307e-02
2.86678001e-02 -8.85844380e-02 -4.08285558e-02 9.11005884e-02
1.02176555e-01 -1.05631712e-03 5.43922652e-03 5.76323317e-03
-6.80931238e-03 -4.48360853e-02 -1.60924867e-02 -5.31150810e-02
7.17285722e-02 -4.10918874e-05 3.73796150e-02 1.04598083e-01
7.24801943e-02 -2.56096609e-02 7.14072287e-02 2.66870633e-02
5.97805753e-02 -2.29491889e-02 1.35155752e-01 -3.87752727e-02
-9.93911028e-02 -4.87911329e-03 -2.74928827e-02 1.41570549e-02
-3.75559479e-02 -3.32118832e-02 1.00173160e-01 -3.30628874e-03
-3.07313167e-04 -8.01729411e-02 4.08987552e-02 1.68337096e-02
-2.75139492e-02 -1.37142243e-03 6.08680993e-02 6.78621652e-03
6.74144402e-02 -3.14514339e-02 3.61052491e-02 -1.03836469e-01
-1.19487848e-02 6.30652979e-02 -7.57822476e-04 4.91176210e-02
-2.53641736e-02 -6.86529651e-02 1.17008025e-02 -3.23090591e-02
-8.54287222e-02 -2.80731395e-02 1.98654225e-03 -8.57517403e-03
7.56616751e-03 -6.09347261e-02 4.75902520e-02 9.53900293e-02
-5.60597032e-02 -3.66395861e-02 -4.37575057e-02 -1.56072807e-02
-7.80187955e-04 7.58661255e-02 7.43950065e-03 -3.73762697e-02
0.00000000e 00 0.00000000e 00 0.00000000e 00 0.00000000e 00
0.00000000e 00 0.00000000e 00 0.00000000e 00 0.00000000e 00
2.49789312e-01 0.00000000e 00 0.00000000e 00 1.73813768e-03
0.00000000e 00 0.00000000e 00 -1.20364074e-02 0.00000000e 00
0.00000000e 00 0.00000000e 00 0.00000000e 00 0.00000000e 00
0.00000000e 00 0.00000000e 00 1.48895502e-01 0.00000000e 00
0.00000000e 00 0.00000000e 00 -2.91786268e-02 0.00000000e 00
0.00000000e 00 0.00000000e 00 0.00000000e 00 0.00000000e 00
-1.69333875e-01 0.00000000e 00 0.00000000e 00 0.00000000e 00
0.00000000e 00 0.00000000e 00 0.00000000e 00 0.00000000e 00
0.00000000e 00 1.70734599e-01 0.00000000e 00 0.00000000e 00
0.00000000e 00 0.00000000e 00 -1.44376457e-01 0.00000000e 00
0.00000000e 00 0.00000000e 00 0.00000000e 00 -1.70605540e-01
0.00000000e 00 0.00000000e 00 0.00000000e 00 0.00000000e 00
0.00000000e 00 -2.67611220e-02 0.00000000e 00 0.00000000e 00
2 进阶使用
2.1 通过参数调节响应结果多样性
ERNIE Bot⽀持设定top_p和temperature参数,影响模型在采样过程中的⾏为,进⽽控制模型响应结果的多
样性。通常来说,top_p和temperature参数只需要设置其中⼀个即可。
设置top_p参数可以使⽣成的token从概率和恰好达到或超过top_p的token集合中采样得到。设置top_p参数
时需注意以下几点:
top_p影响⽣成⽂本的多样性,取值越⼤,⽣成⽂本的多样性越强;
top_p的默认取值为0.8,取值范围为[0, 1.0]。
temperature参数也⽤于控制采样的随机性。设置temperature参数需要注意如下⼏点:
较⾼的temperature会使⽣成结果更加随机,⽽较低的数值会使结果更加集中和确定; temperature的默认取值为0.95,取值范围为(0, 1.0],不能为0。
代码语言:python代码运行次数:0复制# 设置top_p和temperature的例⼦如下:
response = erniebot.ChatCompletion.create(
model='ernie-3.5',
messages=[{'role': 'user', 'content': "请帮我制定⼀份深圳⼀⽇游计划”"}],
top_p=0.2,
)
print(response.get_result())
代码语言:python代码运行次数:0复制深圳⼀⽇游计划
早上:
* 7:00 - 8:00:早餐。推荐在蛇⼝⽼街享⽤早餐,这⾥有各种美味的⼩吃,如肠粉、⾖浆油条等。
* 8:30 - 10:30:深圳湾滨海休闲带⻄段散步。这⾥可以欣赏到美丽的海景,吹吹海⻛,享受悠闲的时光。
中午:
* 11:00 - 12:30:午餐。回到蛇⼝⽼街,可以在海鲜市场购买新鲜的海鲜,然后找⼀家餐厅加⼯,享受⼀顿
美味的海鲜⼤餐。
下午:
* 13:30 - 15:30:参观深圳博物馆。这⾥可以了解到深圳的历史和⽂化,对深圳有更深⼊的了解。
* 16:00 - 18:00:游览深圳莲花⼭公园。这⾥可以俯瞰深圳的全景,同时也可以在公园内休息,享受⼤⾃然
的宁静。
晚上:
* 18:30 - 20:00:晚餐。推荐在蛇⼝⽼街附近的餐厅享⽤晚餐,这⾥有很多特⾊⼩吃和美⻝。
* 20:30 - 22:00:深圳湾公园夜游。在这⾥可以欣赏到深圳湾的夜景,感受深圳的繁华和活⼒。
以上就是⼀份深圳⼀⽇游的计划,希望对你有所帮助。在游玩的过程中,请注意安全,遵守当地的规章制度,保
护环境,享受美好的旅⾏时光。
代码语言:javascript复制深圳⼀⽇游计划
早上:中英街
开始您的⼀天之旅,⾸站是中英街。这⾥的⼀街两制特⾊,让您在短时间内就能体验到不同的⽂化氛围。吹吹海
⻛,和爱⼈漫步街头,感受极致的浪漫。不妨在这⾥拍⼀些美美的照⽚,留下美好的回忆。
中午:东⻔⽼街美⻝之旅
午餐时间,带您前往深圳著名的购物和美⻝街区——东⻔⽼街。这⾥有各种特⾊⼩吃和餐厅,如鲜虾云吞、⽜杂、
煲仔饭等,让您⼤饱⼝福。在这⾥,您可以⼀边品味美⻝,⼀边享受购物的乐趣。
下午:地王⼤厦观景台
下午,前往地王⼤厦。登上384⽶⾼的顶层69楼,您可以往南眺望⾹港,向北俯瞰深圳。在这⾥,您可以欣赏到
深圳市区的美丽⻛光,感受深圳的快速发展。
晚上:⼤悦城美⻝⼴场
晚上,带您来到⼤悦城美⻝⼴场。这⾥汇集了各种⼩吃和餐厅,环境⼲净整洁,价格实惠。在这⾥,您可以继续
品尝深圳的美⻝,感受深圳的夜⽣活。
晚上:购物休闲
最后,您可以选择在深圳的各⼤商场或特⾊市场进⾏购物。深圳是⼀个购物的天堂,有许多商场和特⾊市场可以
满⾜您的购物需求。在这⾥,您可以挑选⼀些⼼仪的商品,作为纪念或礼物。
这就是您的⼀天深圳之旅。希望这份攻略能帮助您更好地规划⾏程,享受美好的旅⾏时光。祝您旅途愉快!
2.2 流式传输
代码语言:python代码运行次数:0复制# stream=True
response_stream = erniebot.ChatCompletion.create(
model='ernie-3.5',
messages=[{'role': 'user', 'content': "请写⼀篇200字的⽂案,介绍⽂⼼⼀⾔"}],
stream=True,
)
for response in response_stream:
print(response.get_result(), end='', flush=True)
print("")
2.3 设定模型行为
erniebot.ChatCompletion.create API的另⼀个有⽤的参数是 system ,该参数可⽤于设定模型的行为,例如给予模型人设或是要求模型以特定格式回答问题。
代码语言:python代码运行次数:0复制response = erniebot.ChatCompletion.create(
model='ernie-3.5',
messages=[{'role': 'user', 'content': "你好呀,和我打个招呼吧"}],
system="你是⼀个爱笑的智能助⼿,请在每个回答之后添加“哈哈哈”",
)
print(response.get_result())
2.4 函数调用
文心一言提供函数调用功能,模型根据⽤户需求以及对函数的描述确定何时以及如何调⽤函数。借由函数调用,⽤户可以从⼤模型获取结构化数据,进⽽利⽤编程⼿段将⼤模型与已有的内外部API结合以构建应⽤。
文心大模型函数调⽤功能的典型使用流程如下:
1.⽤户提供对⼀组函数的名称、功能、请求参数(输⼊参数)和响应参数(返回值)的描述;
2.模型根据⽤户需求以及函数描述信息,智能确定是否应该调⽤函数、调⽤哪⼀个函数、以及在调⽤该函数
时需要如何设置输⼊参数;
3.⽤户根据模型的提示调⽤函数,并将函数的响应传递给模型;
4.模型综合对话上下⽂信息,以⾃然语⾔形式给出满⾜⽤户需求的回答。
代码语言:python代码运行次数:0复制import erniebot
# 引⼊json包,⽤于解析⽂⼼返回的JSON格式数据
import json
# 定义使⽤的令牌为aistudio平台的,这是访问⽂⼼⼀⾔API的必要凭证
erniebot.api_type = 'aistudio'
# 引⼊⾃⼰的令牌,该令牌⽤于验证API请求的身份
# 注意:此处的令牌是⼀个示例,实际使⽤时需要替换成⾃⼰的令牌
erniebot.access_token = "********"
info_dict = {
'李⼩明': {
'age': 31,
'email': 'lxm@bidu.com',
'mbti': 'ESFJ',
'hobbies': ['健身', '篮球', '游泳', '烹饪'],
},
'王刚': {
'age': 28,
'email': 'wg123@bidu.com',
'mbti': 'INTP',
'hobbies': ['游戏', '⾳乐', '电影', '旅游'],
},
'张⼀⼀': {
'age': 26,
'email': 'z11@bidu.com',
'mbti': 'ENTP',
'hobbies': ['摄影', '美⻝', '桌游', '编程'],
},
}
def get_friend_info(name, field=None):
info = info_dict[name]
if field is not None:
return {'name': name, field: info[field]}
else:
return {'name': name, ** info}
get_friend_info_desc = {
'name': 'get_friend_info',
'description': "获取好友的个⼈信息",
'parameters': {
'type': 'object',
'properties': {
'name': {
'type': 'string',
'description': "好友姓名",
},
},
'field': {
'type': 'string',
'description': "想要获取的字段名称,如果不指定则返回所有字段",
'enum': [
'age',
'email',
'mbti',
'hobbies',
],
},
},
'required': ['name', ],
},
'responses': {
'type': 'object',
'properties': {
'name': {
'type': 'string',
'description': "姓名",
},
'age': {
'type': 'integer',
'description': "年龄",
'minimum': 0,
},
'email': {
'type': 'string',
'description': "电⼦邮箱地址",
'format': 'email',
},
'mbti': {
'type': 'string',
'description': "好友的MBTI⼈格类型",
},
'hobbies': {
'type': 'array',
'description': "兴趣爱好列表",
'items': {
'type': 'string',
},
},
},
'required': ['name', ],
},
}
def update_email_address(name, email):
try:
info = info_dict[name]
info['email'] = email
except Exception as e:
return {'status': False, 'error_message': f"{type(e)}: {str(e)}"}
else:
return {'status': True}
update_email_address_desc = {
'name': 'update_email_address',
'description': "更新好友的电⼦邮箱地址",
'parameters': {
'type': 'object',
'properties': {
'name': {
'type': 'string',
'description': "好友姓名",
},
'email': {
'type': 'string',
'description': "新的邮箱地址",
},
},
'required': ['name', 'email', ],
},
'responses': {
'type': 'object',
'properties': {
'status': {
'type': 'boolean',
'description': "更新操作是否成功,true表示成功,false表示失败",
},
'error_message': {
'type': 'string',
'description': "更新操作失败原因",
},
},
'required': ['status', ],
},
}
def send_email(to, content):
return {'status': True}
send_email_desc = {
'name': 'send_email',
'description': "向好友发送邮件",
'parameters': {
'type': 'object',
'properties': {
'to': {
'type': 'string',
'description': "收件⼈姓名",
},
'content': {
'type': 'string',
'description': "邮件内容",
}
},
'required': ['to', 'content', ]
},
'responses': {
'type': 'object',
'properties': {
'status': {
'type': 'boolean',
'description': "邮件发送状态,true表示成功到达对⽅服务器,false表示发送失败",
},
},
},
}
import json
name2function = {
'get_friend_info': get_friend_info,
'update_email_address': update_email_address,
'send_email': send_email,
}
functions = [
get_friend_info_desc,
update_email_address_desc,
send_email_desc,
]
messages = []
def to_pretty_json(obj):
return json.dumps(obj, ensure_ascii=False, indent=2)
def chat(message, system=None, use_functions=True, auto_func_call=True, _max_recur_depth=3):
# 当`auto_func_call`参数为True时,根据模型响应⾃动调⽤函数,并将调⽤结果回传给模型
if isinstance(message, str):
message = {'role': 'user', 'content': message}
messages.append(message)
create_kwargs = {
'model': 'ernie-3.5',
'messages': messages,
}
if system:
create_kwargs['system'] = system
if use_functions:
create_kwargs['functions'] = functions
response = erniebot.ChatCompletion.create(**create_kwargs)
if response.is_function_response:
# 模型建议调⽤函数
function_call = response.get_result()
messages.append(response.to_message())
if auto_func_call:
# 从模型响应中解析函数名称和请求参数
func_name = function_call['name']
try:
func = name2function[func_name]
except KeyError as e:
raise KeyError(f"函数`{func_name}`不存在") from e
func_args = function_call['arguments']
try:
func_args = json.loads(func_args)
except json.JSONDecodeError as e:
raise ValueError(f"⽆法从{repr(func_args)}解析参数") from e
# 调⽤函数
if not isinstance(func_args, dict):
raise TypeError(f"{repr(func_args)}不是字典")
print(f"【函数调⽤】函数名称:{func_name},请求参数:{to_pretty_json(func_args)}")
func_res = func(**func_args)
print(f"【函数调⽤】响应参数:{to_pretty_json(func_res)}")
# 将函数响应回传给模型
message = {
'role': 'function',
'name': func_name,
'content': json.dumps(func_res, ensure_ascii=False),
}
# 根据允许的最⼤递归层级判断是否应该设置`use_functions`和`auto_func_call`为`False`
# 这样做主要是为了限制调⽤函数的次数,防⽌⽆限递归
return chat(
message,
use_functions=(use_functions and _max_recur_depth > 1),
auto_func_call=(auto_func_call and _max_recur_depth > 1),
_max_recur_depth=_max_recur_depth-1,
)
else:
return function_call
else:
# 模型返回普通的⽂本消息
result = response.get_result()
messages.append(response.to_message())
return result
messages = []
# 为了使模型能够得到更充⾜的提示,我们借助`system`参数对模型说明它需要扮演的⻆⾊以及⼀些注意事项
system = """
你是⼀个智能社交助理,能够帮助我查询好友信息、更新好友邮箱地址、发送电⼦邮件以及给出社交建议。
在我们的对话中,我提到的所有⼈名都是好友的名称。请尽可能使⽤我提供的函数解决问题。
"""
# 默认进⾏单轮对话,修改传给`range`的数字可进⾏多轮对话
for _ in range(1):
result = chat(input("请输⼊:"), system=system)
print(result)
代码语言:javascript复制请问李⼩明今年⼏岁?
代码语言:javascript复制【函数调⽤】函数名称:get_friend_info,请求参数:{
"name": "李⼩明",
"field": "age"
}
【函数调⽤】响应参数:{
"name": "李⼩明",
"age": 31
}
根据我们的好友信息记录,李⼩明今年31岁。如果您需要更多关于李⼩明的信息或有其他问题,请随时告诉我。
代码语言:javascript复制张⼀⼀和我说她的邮箱地址换成了zyy@bidu.com,请你帮我更新⼀下。
请问张⼀⼀的邮箱是多少?
代码语言:txt复制实测没更新邮箱
附:⼀⾔插件开发 https://yiyan.baidu.com/developer/doc#oll6a352c
参考:
https://ernie-bot-agent.readthedocs.io/zh-cn/latest/