1. 非stream方式(requests)
import os
import json
import requestsdef 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 genaidef 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.Imagegenai.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 genaidef 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.Imagegenai.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)