前言
okey,那么接下来我们来看到我们如何使用Prompt来完成Agent开发。来让LLM完成我们想要让它完成的工作。当然这里的开发还是非常渐层的开发,实际上我们有复杂的,但是得益于开源生态的完善,目前一些看起来比较深层的开发例如RAG也已经被封装的太好了。 那么这里的话,我们主要有两个步骤需要处理:
- 得到视频分镜
- 将生成图像的文本翻译为英文提示词
当然这里应该是三个任务,但是我这里直接合并为两个任务,要相信LLM的推理能力,当然你也可以将任务再进行拆分。
Agent实现
okey,现在的话我们来做到我们的Agent。这里话,其实也不是啥复杂的概念。记住LLM是一个很牛逼的推理引擎就够了。
Prompt设计
那么在这里面的话,我们设计了两个提示词:
ExtractSegmentNovel = """
你是一个想象力非常丰富的聊天机器人,接下来你将得到一个文本,你需要尽可能找出哪些段落是可以用同一个
想象的画面描述的,一定不能遗漏掉全部文本。
之后将这些段落描述出具体的画面并且按照顺序返回描述的列表。请注意,这些描述语句将交给图像生成AI
来生成图像,图像生成AI是不理解故事内容的所以具体画面描述不要出现人名且能够准确地描述出画面。
并且严格按照格式返回。如果文本为空,返回[]空列表即可
返回格式如下:[{"场景1":"原文句子","描述1":"具体画面描述"},{"场景2":"原文句子","描述2":"具体画面描述"}]
"""
# ExtractSegmentNovel = """
# 你是一个想象力非常丰富的聊天机器人,接下来你将得到一个文本,你需要尽可能找出哪些段落是可以用同一个
# 想象的画面描述的,一定不能遗漏掉全部文本。注意具体画面描述将交给图像生成AI来生成图像,
# 图像生成AI是无法理解故事内容的所以具体画面描述不要出现人名,故事情节且能够准确地描述出画面。
# 并且严格按照格式返回。
# 返回格式如下:
# {"场景1":"原文句子","描述":"具体画面描述"},
# {"场景2":"原文句子","描述":"具体画面描述"},
# """
ToImagePrompt = """
你是翻译小能手,接下来你将得到一个文本,你需要将其翻译为英文。
注意只需要返回英文即可,如果输入的就是英文,那么不要翻译直接返回原话。
"""
使用提示词
那么当我们设计好提示词之后,我们就可以直接调用LLM了,这个调用过程也并不复杂,其实很多东西,LLM都可以理解。在这块的话就是基本的调用LLM,没啥好说的,直接看到代码:
"""
@FileName:image_prompt.py
@Author:Huterox
@Description:Go For It
@Time:2024/4/16 22:35
@Copyright:©2018-2024 awesome!
"""
import json
import re
import typing
from openai import OpenAI
from agent.prompt_template import ExtractSegmentNovel, ToImagePrompt
from utils import Config, getConfig
"""
将小说进行分段
"""
api_key = Config.settings.get("openai_api_key")
client = OpenAI(api_key=api_key,base_url=Config.settings.get("openai_api_base"))
"""
实际测试效果发现,使用"moonshot-v1-8k"效果总是稳定,这里尝试使用chat
"""
import requests
import json
config = getConfig()
class MyOpenAI():
def __init__(self):
self.url = "https://api.openai-hk.com/v1/chat/completions"
self.headers = {
"Content-Type": "application/json",
# 这里采用的是中转站的openai key
"Authorization": "Bearer "+config.get("image_api_key")
}
def chat(self,message,prompt,temperature=0.8):
data = {
"max_tokens": 1200,
"model": "gpt-3.5-turbo",
"temperature": temperature,
"top_p": 1,
"presence_penalty": 1,
"messages": [
{
"role": "system",
"content":prompt
},
{
"role": "user",
"content": message
}
]
}
response = requests.post(self.url, headers=self.headers, data=json.dumps(data).encode('utf-8'))
result = response.content.decode("utf-8")
result = json.loads(result)
result = result["choices"][0]["message"]["content"]
return result
class ImagePromptAgent(object):
def __init__(self):
self.my_open_ai = MyOpenAI()
def __send(self,message:typing.List,prompt:typing.List,temperature:float=0.8)->typing.AnyStr:
history_openai_format = [
{"role": "system",
"content":prompt
},
{"role": "user",
"content": message
},
]
completion = client.chat.completions.create(
model=Config.settings.get("default_model"),
messages=history_openai_format,
# 这里需要可能需要一约束
temperature=temperature,
)
result = completion.choices[0].message.content
# 这里我们直接使用openAI
# result = self.my_open_ai.chat(message,prompt,temperature)
return result
def ExtractSegmentNovel(self,message,temperature=0.4):
# scenes_list = json.loads(self.__send(message,ExtractSegmentNovel))
# return scenes_list
return self.__send(message,ExtractSegmentNovel,temperature)
def ToImagePrompt(self,message,temperature=0.4):
# english_prompt ="best quality,masterpiece,illustration, an extremely delicate and beautiful,extremely detailed,CG,unity,8k wallpaper, "+\
# self.__send(message,ToImagePrompt,temperature)
english_prompt = "best quality " + \
self.my_open_ai.chat(message, ToImagePrompt, temperature)+" --ar 4:3"
return english_prompt
def ToEnglish(self,text,temperature=0.8):
english_prompt = self.my_open_ai.chat(text, ToImagePrompt, temperature)
return english_prompt
封装😶
虽然我们直接实现对接完毕了,但是这里的话,为了和我们的UI配合,我们当然还是需要封装一下的。这里的话,还是直接看到上一个章节提到的代码:
"""
@FileName:image_prompt.py
@Author:Huterox
@Description:Go For It
@Time:2024/4/16 22:35
@Copyright:©2018-2024 awesome!
"""
import json
import re
import typing
from openai import OpenAI
from agent.prompt_template import ExtractSegmentNovel, ToImagePrompt
from utils import Config, getConfig
"""
将小说进行分段
"""
api_key = Config.settings.get("openai_api_key")
client = OpenAI(api_key=api_key,base_url=Config.settings.get("openai_api_base"))
"""
实际测试效果发现,使用"moonshot-v1-8k"效果总是稳定,这里尝试使用chat
"""
import requests
import json
config = getConfig()
class MyOpenAI():
def __init__(self):
self.url = "https://api.openai-hk.com/v1/chat/completions"
self.headers = {
"Content-Type": "application/json",
# 这里采用的是中转站的openai key
"Authorization": "Bearer "+config.get("image_api_key")
}
def chat(self,message,prompt,temperature=0.8):
data = {
"max_tokens": 1200,
"model": "gpt-3.5-turbo",
"temperature": temperature,
"top_p": 1,
"presence_penalty": 1,
"messages": [
{
"role": "system",
"content":prompt
},
{
"role": "user",
"content": message
}
]
}
response = requests.post(self.url, headers=self.headers, data=json.dumps(data).encode('utf-8'))
result = response.content.decode("utf-8")
result = json.loads(result)
result = result["choices"][0]["message"]["content"]
return result
class ImagePromptAgent(object):
def __init__(self):
self.my_open_ai = MyOpenAI()
def __send(self,message:typing.List,prompt:typing.List,temperature:float=0.8)->typing.AnyStr:
history_openai_format = [
{"role": "system",
"content":prompt
},
{"role": "user",
"content": message
},
]
completion = client.chat.completions.create(
model=Config.settings.get("default_model"),
messages=history_openai_format,
# 这里需要可能需要一约束
temperature=temperature,
)
result = completion.choices[0].message.content
# 这里我们直接使用openAI
# result = self.my_open_ai.chat(message,prompt,temperature)
return result
def ExtractSegmentNovel(self,message,temperature=0.4):
# scenes_list = json.loads(self.__send(message,ExtractSegmentNovel))
# return scenes_list
return self.__send(message,ExtractSegmentNovel,temperature)
def ToImagePrompt(self,message,temperature=0.4):
# english_prompt ="best quality,masterpiece,illustration, an extremely delicate and beautiful,extremely detailed,CG,unity,8k wallpaper, "+\
# self.__send(message,ToImagePrompt,temperature)
english_prompt = "best quality " + \
self.my_open_ai.chat(message, ToImagePrompt, temperature)+" --ar 4:3"
return english_prompt
def ToEnglish(self,text,temperature=0.8):
english_prompt = self.my_open_ai.chat(text, ToImagePrompt, temperature)
return english_prompt
但是在这里要注意一点,那就是这里的话,我们对于结果的提取其实还是使用了正则表达进行提取,并且我们也需要做一些异常处理,这是因为,LLM返回的格式不一定是你想要的,这取决于LLM的推理能力。
至此,有关于AI的部分其实我们就封装完毕了,那么接下来的工作就是,我们造好的零件将如何组装为一辆汽车的问题。
考虑到内容还是比较长,这里还是将文章拆分😉
写在最后
感兴趣的小伙伴,赠送全套AIGC学习资料,包含AI绘画、AI人工智能等前沿科技教程和软件工具,具体看这里。
AIGC技术的未来发展前景广阔,随着人工智能技术的不断发展,AIGC技术也将不断提高。未来,AIGC技术将在游戏和计算领域得到更广泛的应用,使游戏和计算系统具有更高效、更智能、更灵活的特性。同时,AIGC技术也将与人工智能技术紧密结合,在更多的领域得到广泛应用,对程序员来说影响至关重要。未来,AIGC技术将继续得到提高,同时也将与人工智能技术紧密结合,在更多的领域得到广泛应用。
一、AIGC所有方向的学习路线
AIGC所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
二、AIGC必备工具
工具都帮大家整理好了,安装就可直接上手!
三、最新AIGC学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、AIGC视频教程合集
观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
五、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。