1. 非stream方式(requests)
import os
import json
import requests
def test_gemini_no_stream(apikey, text):
url = f'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key={apikey}'
headers = {'Content-Type': 'application/json'}
data = {
'contents': [
{
'parts': [
{
'text': text
}
]
}
]
}
response = requests.post(url, headers=headers, data=json.dumps(data))
# print(response.json())
print(response.json()['candidates'][0]['content']['parts'][0]['text'])
if __name__ == '__main__':
apikey = os.getenv('GEMINI_API_KEY')
text = '请将`我喜欢吃话梅糖`翻译成英文,只保留翻译后的结果!'
print('test_gemini_no_stream(apikey, text):')
test_gemini_no_stream(apikey, text)
2. google-generativeai非stream输出
# Python版本需至少为3.9,google-generativeai版本为0.3.1
pip install -U google-generativeai
import google.generativeai as genai
def genai_no_stream(apikey, text):
genai.configure(api_key=apikey)
# 支持的模型列表
for m in genai.list_models():
if 'generateContent' in m.supported_generation_methods:
print(m.name)
model = genai.GenerativeModel('gemini-pro')
response = model.generate_content(text)
print(response.text)
if __name__ == '__main__':
apikey = os.getenv('GEMINI_API_KEY')
text = '请将`我喜欢吃话梅糖`翻译成英文,只保留翻译后的结果!'
print('test_gemini_no_stream(apikey, text):')
genai_no_stream(apikey, text)
3. google-generativeai stream输出
流式输出只需将generate_content的stream设置为True即可
def genai_stream(apikey, text):
genai.configure(api_key=apikey)
model = genai.GenerativeModel('gemini-pro')
response = model.generate_content(text, stream=True)
for chunk in response:
print(chunk.text, end='', flush=True)
if __name__ == '__main__':
apikey = os.getenv('GEMINI_API_KEY')
#text = '请将`我喜欢吃话梅糖`翻译成英文,只保留翻译后的结果!'
print('test_gemini_no_stream(apikey, text):')
#est_gemini_no_stream(apikey, text)
#genai_no_stream(apikey, text)
text = '你是一个讲故事的专家并且擅长处理数据!首先你需要写一个500字的历史故事;然后你需要将故事中的人物关系以json格式展示出来。只保留故事和最后的json数据。'
genai_stream(apikey, text)
故事是流式输出的,json好像是一下出来的,速度很快(总共几秒钟就完成了)!
尝试下数据提取能力 (有默认英文偏向(中英文不稳定,如有需求请指定好))
def genai_stream(apikey, text):
genai.configure(api_key=apikey)
model = genai.GenerativeModel('gemini-pro')
response = model.generate_content(text, stream=True)
for chunk in response:
print(chunk.text, end='', flush=True)
if __name__ == '__main__':
apikey = os.getenv('GEMINI_API_KEY')
#text = '请将`我喜欢吃话梅糖`翻译成英文,只保留翻译后的结果!'
print('test_gemini_no_stream(apikey, text):')
#est_gemini_no_stream(apikey, text)
#genai_no_stream(apikey, text)
text = """
将下面故事里的人物名字提取出来,结果是python的list格式,结果只保留这个list!
**故事:**
在12世纪的英格兰,诺曼底的贵族威廉·德·伯格纳 (William de Bourgneuf) 踏上了萨塞克斯郡的海岸。他勇敢无畏,野心勃勃,并渴望征服这片土地。
威廉迅速征服了莱文斯 (Lewes) 城堡,并确立了自己的统治。他召集当地萨克森人效忠,承诺尊重他们的习俗和法律。然而,一些萨克森人仍然反对他的统治,其中包括一位名叫埃德蒙 (Edmund) 的勇敢战士。
埃德蒙率领着一群忠诚的追随者,发动了一场激烈的抵抗。他们在森林中发动游击战,伏击诺曼军队并破坏他们的补给线。威廉决心镇压叛乱,派出他的军队追击埃德蒙。
最终,在一次激烈的战斗中,埃德蒙被俘虏。威廉把他关进了莱文斯城堡的地牢,并计划将他处决。但埃德蒙的妹妹埃尔莎 (Aelfa) 向威廉求情,恳求他饶恕他的生命。
威廉被埃尔莎的美丽和决心所打动。他同意宽恕埃德蒙,但条件是埃尔莎必须嫁给他。埃尔莎勉强同意了,以拯救她兄弟的生命。
婚后,埃尔莎和埃德蒙对威廉忠诚,但他们心中永远铭记着他们的萨克森遗产。他们悄悄地支持抵抗运动,并向当地萨克森人提供庇护和支持。"""
genai_stream(apikey, text)
4. chat模式
使用chat模式可以自动获取上下文
def genai_chat(apikey, text):
genai.configure(api_key=apikey)
# 历史消息,必须为偶数
messages = [
{'role':'user',
'parts': ["请将我接下来的任何输入都提取人物名,并将人物名以python list的格式输出,只保留list!"]},
{'role':'model',
'parts': ["好的。我接下来将任何输入都提取人物名,并将人物名以python list的格式输出,只保留list!"]}
]
model = genai.GenerativeModel('gemini-pro')
chat = model.start_chat(history=messages)
response = chat.send_message(text)
print(response.text)
if __name__ == '__main__':
apikey = os.getenv('GEMINI_API_KEY')
#text = '请将`我喜欢吃话梅糖`翻译成英文,只保留翻译后的结果!'
#print('test_gemini_no_stream(apikey, text):')
#est_gemini_no_stream(apikey, text)
#genai_no_stream(apikey, text)
text = """
将下面故事里的人物名字提取出来,结果是python的list格式,结果只保留这个list!
**故事:**
在12世纪的英格兰,诺曼底的贵族威廉·德·伯格纳 (William de Bourgneuf) 踏上了萨塞克斯郡的海岸。他勇敢无畏,野心勃勃,并渴望征服这片土地。
威廉迅速征服了莱文斯 (Lewes) 城堡,并确立了自己的统治。他召集当地萨克森人效忠,承诺尊重他们的习俗和法律。然而,一些萨克森人仍然反对他的统治,其中包括一位名叫埃德蒙 (Edmund) 的勇敢战士。
埃德蒙率领着一群忠诚的追随者,发动了一场激烈的抵抗。他们在森林中发动游击战,伏击诺曼军队并破坏他们的补给线。威廉决心镇压叛乱,派出他的军队追击埃德蒙。
最终,在一次激烈的战斗中,埃德蒙被俘虏。威廉把他关进了莱文斯城堡的地牢,并计划将他处决。但埃德蒙的妹妹埃尔莎 (Aelfa) 向威廉求情,恳求他饶恕他的生命。
威廉被埃尔莎的美丽和决心所打动。他同意宽恕埃德蒙,但条件是埃尔莎必须嫁给他。埃尔莎勉强同意了,以拯救她兄弟的生命。
婚后,埃尔莎和埃德蒙对威廉忠诚,但他们心中永远铭记着他们的萨克森遗产。他们悄悄地支持抵抗运动,并向当地萨克森人提供庇护和支持。"""
#genai_stream(apikey, text)
print('\n')
genai_chat(apikey, text)
在获取上下文时,messages里的model信息正常情况下是由Gemini生成的。这里想人为进行设计的,似乎达不到想要的功能,但并不是说chat模式有问题,而是历史消息中的model信息没有正确设置为Gemini生成的内容。
5 多轮对话
def genai_loops_chat(apikey, text):
genai.configure(api_key=apikey)
model = genai.GenerativeModel('gemini-pro')
messages = [
{'role':'user',
'parts': ["简单地向孩子解释一下电脑是如何工作的。"]}
]
response = model.generate_content(messages)
messages.append({'role':'model',
'parts':[response.text]})
messages.append({'role':'user',
'parts':["好的,再给大学生一个更详细的解释?"]})
response = model.generate_content(messages)
print(response.text)
if __name__ == '__main__':
apikey = os.getenv('GEMINI_API_KEY')
#text = '请将`我喜欢吃话梅糖`翻译成英文,只保留翻译后的结果!'
#print('test_gemini_no_stream(apikey, text):')
#est_gemini_no_stream(apikey, text)
#genai_no_stream(apikey, text)
text = """ """
#genai_stream(apikey, text)
print('\n')
#genai_chat(apikey, text)
genai_loops_chat(apikey, text)
多模态 (gemini-pro-vision)
pip install pillow
def gemini_pro_vision(apikey, text, image_path):
import PIL.Image
genai.configure(api_key=apikey)
model = genai.GenerativeModel('gemini-pro-vision')
img = PIL.Image.open(image_path)
response = model.generate_content([text, img], stream=True)
response.resolve()
print(response.text)
if __name__ == '__main__':
apikey = os.getenv('GEMINI_API_KEY')
#text = '请将`我喜欢吃话梅糖`翻译成英文,只保留翻译后的结果!'
#print('test_gemini_no_stream(apikey, text):')
#est_gemini_no_stream(apikey, text)
#genai_no_stream(apikey, text)
#genai_stream(apikey, text)
print('\n')
#genai_chat(apikey, text)
#enai_loops_chat(apikey, text)
text = """对图片进行一个详细的描述,谢谢"""
image_path = '../img/二傻子.jpg'
gemini_pro_vision(apikey, text, image_path)
模型配置
Gemini也有与常规LLM或GPT相类似的配置方式
def genai_config(apikey, text):
genai.configure(api_key=apikey)
model = genai.GenerativeModel('gemini-pro')
response = model.generate_content(
text,
generation_config=genai.types.GenerationConfig(
# Only one candidate for now.
candidate_count=1,
stop_sequences=['x'],
max_output_tokens=20,
temperature=1.0)
)
print(response.text)
完整代码
import os
import json
import requests
# 非stream方式
def test_gemini_no_stream(apikey, text):
url = f'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key={apikey}'
headers = {'Content-Type': 'application/json'}
data = {
'contents': [
{
'parts': [
{
'text': text
}
]
}
]
}
response = requests.post(url, headers=headers, data=json.dumps(data))
# print(response.json())
print(response.json()['candidates'][0]['content']['parts'][0]['text'])
##########################################################################################
import google.generativeai as genai
def genai_no_stream(apikey, text):
genai.configure(api_key=apikey)
# 支持的模型列表
for m in genai.list_models():
if 'generateContent' in m.supported_generation_methods:
print(m.name)
#
model = genai.GenerativeModel('gemini-pro')
response = model.generate_content(text)
print(response.text)
###########################################################################################
def genai_stream(apikey, text):
genai.configure(api_key=apikey)
model = genai.GenerativeModel('gemini-pro')
response = model.generate_content(text, stream=True)
for chunk in response:
print(chunk.text, end='', flush=True)
##########################################################################################
def genai_chat(apikey, text):
genai.configure(api_key=apikey)
# 历史消息,必须为偶数
messages = [
{'role':'user',
'parts': ["请将我接下来的任何输入都提取人物名,并将人物名以python list的格式输出,只保留list!"]},
{'role':'model',
'parts': ["好的。我接下来将任何输入都提取人物名,并将人物名以python list的格式输出,只保留list!"]}
]
model = genai.GenerativeModel('gemini-pro')
chat = model.start_chat(history=messages)
response = chat.send_message(text)
print(response.text)
###########################################################################################
def genai_loops_chat(apikey, text):
genai.configure(api_key=apikey)
model = genai.GenerativeModel('gemini-pro')
messages = [
{'role':'user',
'parts': ["简单地向孩子解释一下电脑是如何工作的。"]}
]
response = model.generate_content(messages)
messages.append({'role':'model',
'parts':[response.text]})
messages.append({'role':'user',
'parts':["好的,再给大学生一个更详细的解释?"]})
response = model.generate_content(messages)
print(response.text)
##############################################################################################
def gemini_pro_vision(apikey, text, image_path):
import PIL.Image
genai.configure(api_key=apikey)
model = genai.GenerativeModel('gemini-pro-vision')
img = PIL.Image.open(image_path)
response = model.generate_content([text, img], stream=True)
response.resolve()
print(response.text)
if __name__ == '__main__':
apikey = os.getenv('GEMINI_API_KEY')
#text = '请将`我喜欢吃话梅糖`翻译成英文,只保留翻译后的结果!'
#print('test_gemini_no_stream(apikey, text):')
#est_gemini_no_stream(apikey, text)
#genai_no_stream(apikey, text)
text = """
将下面故事里的人物名字提取出来,结果是python的list格式,结果只保留这个list!
**故事:**
在12世纪的英格兰,诺曼底的贵族威廉·德·伯格纳 (William de Bourgneuf) 踏上了萨塞克斯郡的海岸。他勇敢无畏,野心勃勃,并渴望征服这片土地。
威廉迅速征服了莱文斯 (Lewes) 城堡,并确立了自己的统治。他召集当地萨克森人效忠,承诺尊重他们的习俗和法律。然而,一些萨克森人仍然反对他的统治,其中包括一位名叫埃德蒙 (Edmund) 的勇敢战士。
埃德蒙率领着一群忠诚的追随者,发动了一场激烈的抵抗。他们在森林中发动游击战,伏击诺曼军队并破坏他们的补给线。威廉决心镇压叛乱,派出他的军队追击埃德蒙。
最终,在一次激烈的战斗中,埃德蒙被俘虏。威廉把他关进了莱文斯城堡的地牢,并计划将他处决。但埃德蒙的妹妹埃尔莎 (Aelfa) 向威廉求情,恳求他饶恕他的生命。
威廉被埃尔莎的美丽和决心所打动。他同意宽恕埃德蒙,但条件是埃尔莎必须嫁给他。埃尔莎勉强同意了,以拯救她兄弟的生命。
婚后,埃尔莎和埃德蒙对威廉忠诚,但他们心中永远铭记着他们的萨克森遗产。他们悄悄地支持抵抗运动,并向当地萨克森人提供庇护和支持。"""
#genai_stream(apikey, text)
print('\n')
#genai_chat(apikey, text)
#enai_loops_chat(apikey, text)
text = """对图片进行一个详细的描述,谢谢"""
image_path = '../img/二傻子.jpg'
gemini_pro_vision(apikey, text, image_path)