我的学习笔记

土猛的员外

说人话查询neo4j——基于LangChain

原文:Integrating Neo4j into the LangChain ecosystem

作者:Tomaz Bratanic

了解如何开发具有多种与Neo4j数据库交互方式的LangChain代理

ChatGPT启发了世界,开启了一场新的人工智能革命。然而,最新的趋势似乎是在为ChatGPT提供一个新技术:提供外部信息,提高其准确性,并使ChatGPT能够回答公共数据集中没有答案的问题。围绕大型语言模型(llm)的另一个趋势是将它们转换为代理,使它们能够通过各种API调用或其他集成与环境进行交互。

由于增强llm相对较新,目前还没有很多开源库。然而,围绕LLMs (如ChatGPT)构建应用程序的首选框架是LangChain。该库通过允许LLM访问各种工具和外部数据源来增强LLM。它不仅可以通过访问外部数据来改进其响应,而且还可以充当代理,并通过外部界面调整其配置。

我偶然发现了一个LangChain项目(作者:Ibis Prevedello),它使用图数据库的搜索,通过提供额外的外部上下文来增强LLMs。

Gitgub地址:ibiscp/LLM-IMDB

Ibis的项目使用NetworkX图数据库来存储图形信息,将图关系搜索集成到LangChain生态系统中是多么容易。因此,我决定开发一个项目,将Neo4j(一个图数据库)集成到LangChain生态系统中。

Github地址:tomasonjo/langchain2neo4j

该项目现在允许LangChain代理以三种不同的模式与Neo4j交互:

  • 生成Cypher语句查询数据库

  • 相关实体的全文关键字搜索

  • 向量相似性搜索

本文将介绍开发的每种方法的推理和实现。

在这篇博文中,我将向您介绍我开发的每种方法的推理和实现。

环境设置

首先,我们将配置Neo4j环境。我们将使用可用的数据集作为Neo4j沙盒中的推荐项目。最简单的解决方案是通过下面的链接创建一个Neo4j Sandbox实例。但是,如果您更喜欢Neo4j的本地实例,您也可以恢复GitHub上可用的数据库转储。该数据集是MovieLens数据集[1]的一部分,特别是小版本。

在Neo4j数据库实例化之后,我们应该有一个包含以下模式的图。

1_HorBDLYVPFUvubEeoIYJCw

接下来,您需要通过执行以下命令克隆langchain2neo4j存储库:

1
git clone https://github.com/tomasonjo/langchain2neo4j

在下一步中,您需要创建一个.env文件并填充neo4j和OpenAI凭证,如.env.example文件中所示。

最后,你需要在Neo4j中创建一个全文索引,并通过运行以下命令导入电影标题嵌入:

1
sh seed_db.sh

如果您是Windows用户,那么seed_db脚本可能无法工作。在这种情况下,我准备了一个Jupyter笔记本,它可以帮助您将数据库作为shell脚本的替代方案。

现在,让我们跳到LangChain集成。

LangChain代理

据我所知,使用LangChain代理回答用户问题最常见的数据流如下:

1_WqRmmUg0cDGmaO9wYJIH3A

代理数据流在接收到来自用户的输入时启动。然后,代理向大语言模型模型发送请求,该模型包括用户问题和代理提示,这是代理应该遵循的一组自然语言指令。然后,大语言模型以进一步的指令响应代理。大多数情况下,第一反应是使用任何可用的工具从外部来源获得额外的信息。但是,工具并不局限于只读操作。例如,您可以使用它们来更新数据库。在工具返回额外的上下文之后,将对包含新获得的信息的大语言模型进行另一次调用。大语言模型现在可以选择生成返回给用户的最终答案,或者它可以决定需要通过可用的工具执行更多操作。

LangChain代理使用大语言模型进行推理。因此,第一步是定义要使用的模型。目前,langchain2neo4j项目只支持OpenAI的聊天完成模型,特别是GPT-3.5-turbo和GPT-4模型。

1
2
3
4
if model_name in ['gpt-3.5-turbo', 'gpt-4']:
llm = ChatOpenAI(temperature=0, model_name=model_name)
else:
raise Exception(f"Model {model_name} is currently not supported")

除了OpenAI之外,我还没有探索过其他LLMs。然而,LangChain默认集成了十多个其他LLM。

接下来,我们需要用下面一行添加会话记忆:

1
2
memory = ConversationBufferMemory(
memory_key="chat_history", return_messages=True)

LangChain支持多种类型的代理。例如,一些代理可以使用内存组件,而其他代理则不能。由于对象是构建聊天机器人,所以我选择了Conversation Agent(用于聊天模型)代理类型。LangChain库的有趣之处在于一半的代码是用Python编写的,而另一半是prompt工程。我们可以探索会话代理使用的prompt。例如,代理有一些必须遵循的基本指令:

Assistant是OpenAI训练的一个大型语言模型。Assistant被设计成能够协助完成广泛的任务,从回答简单的问题到就广泛的主题提供深入的解释和讨论。作为一种语言模型,Assistant能够根据它收到的输入生成类似人类交流的文本,允许它参与听起来自然的对话,并提供与手头主题相关的连贯响应。助手在不断地学习和改进,它的功能也在不断地发展。它能够处理和理解大量的文本,并能够利用这些知识对广泛的问题提供准确和信息丰富的回答。此外,Assistant能够根据收到的输入生成自己的文本,允许它参与讨论,并就广泛的主题提供解释和描述。总的来说,Assistant是一个功能强大的系统,可以帮助完成广泛的任务,并就广泛的主题提供有价值的见解和信息。无论您是需要特定问题的帮助还是只想就特定主题进行对话,Assistant都可以提供帮助。

此外,代理还具有在需要时使用任何指定工具的prompt。

1
2
3
4
5
6
7
8
9
10
Assistant can ask the user to use tools to look up information 
that may be helpful in answering the users original question.
The tools the human can use are:
{{tools}}
{format_instructions}
USER'S INPUT - - - - - - - - - -
Here is the user's input
(remember to respond with a markdown code snippet of a
json blob with a single action, and NOTHING else):
{{{{input}}}}

有趣的是,提示表明助手可以要求用户使用工具查找其他信息。然而,用户不是人,而是构建在LangChain库之上的应用程序。因此,查找进一步信息的整个过程是自动完成的,没有任何人工参与。当然,如果需要,我们可以更改提示符。提示符还包括llm用于与代理通信的格式。

请注意,代理prompt里面不包括代理不应该回答的问题,如果答案没有在工具返回的上下文中提供。

现在,我们要做的就是定义可用的工具。如前所述,我准备了三种与Neo4j数据库交互的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
tools = [
Tool(
name="Cypher search",
func=cypher_tool.run,
description="""
Utilize this tool to search within a movie database,
specifically designed to answer movie-related questions.
This specialized tool offers streamlined search capabilities
to help you find the movie information you need with ease.
Input should be full question.""",
),
Tool(
name="Keyword search",
func=fulltext_tool.run,
description="Utilize this tool when explicitly told to use
keyword search.Input should be a list of relevant movies
inferred from the question.",
),
Tool(
name="Vector search",
func=vector_tool.run,
description="Utilize this tool when explicity told to use
vector search.Input should be full question.Do not include
agent instructions.",
),

]

工具的描述用于指定工具的功能,并通知代理何时使用它。另外,我们需要指定工具期望的输入格式。例如,Cypher和vector搜索都需要一个完整的问题作为输入,而关键字搜索则需要一个相关电影列表作为输入。

LangChain与我习惯的编码方式有很大的不同。它使用prompt来指示LLM为您完成工作,而不是自己编写代码。例如,关键字搜索指示ChatGPT提取相关电影并将其用作输入。我花了2个小时调试工具输入格式,然后意识到我可以使用自然语言指定它,LLM将处理其余的事情。

还记得我说过的agent没有得到指示不能回答没有上下文提供的信息的问题吗?让我们看看下面的对话。

1_R0e6DRcrumBQ2SZJB8iLsw

LLM根据工具描述决定,它不能使用它们中的任何一个来检索相关上下文。但是,LLM默认知道很多信息,并且由于代理没有只能依赖外部资源的约束,因此LLM可以独立地形成答案。如果希望执行不同的行为,则需要更改代理prompt。

生成Cypher语句

我已经开发了一个聊天机器人,通过使用OpenAI的会话模型(如GPT-3.5-turbo和GPT-4)生成Cypher语句,与Neo4j数据库进行交互。因此,我可以借用大部分思想来实现一个工具,该工具允许LangChain代理通过构造Cypher语句从Neo4j数据库检索信息。

像text- davincii -003和GPT-3.5-turbo这样的旧模型作为少量Cypher生成器工作得更好,我们在其中提供了几个Cypher示例,模型可以使用这些示例来生成新的Cypher语句。然而,当我们只呈现图形模式时,GPT-4似乎工作得很好。因此,由于可以使用Cypher查询提取图模式,理论上可以在任何图形模式上使用GPT-4,而无需人工进行任何手工操作。

我们这里不谈LangChain是怎么做的,我们只看一下当LangChain代理决定使用Cypher语句与Neo4j数据库交互时执行的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def _call(self, inputs: Dict[str, str]) -> Dict[str, str]:
chat_prompt = ChatPromptTemplate.from_messages(
[self.system_prompt] + inputs['chat_history'] + [self.human_prompt])
cypher_executor = LLMChain(
prompt=chat_prompt, llm=self.llm, callback_manager=self.callback_manager
)
cypher_statement = cypher_executor.predict(
question=inputs[self.input_key], stop=["Output:"])
# If Cypher statement was not generated due to lack of context
if not "MATCH" in cypher_statement:
return {'answer': 'Missing context to create a Cypher statement'}
context = self.graph.query(cypher_statement)

return {'answer': context}

Cypher生成工具将问题与聊天记录一起作为输入。然后通过使用系统消息、聊天历史记录和当前问题将LLM的输入组合起来。我为Cypher生成工具准备了以下系统消息prompt。

1
2
3
4
5
6
7
8
9
10
SYSTEM_TEMPLATE = """
You are an assistant with an ability to generate Cypher queries based off
example Cypher queries. Example Cypher queries are:\n""" + examples + """\n
Do not response with any explanation or any other information except the
Cypher query. You do not ever apologize and strictly generate cypher statements
based of the provided Cypher examples. Do not provide any Cypher statements
that can't be inferred from Cypher examples. Inform the user when you can't
infer the cypher statement due to the lack of context of the conversation
and state what is the missing context.
"""

Prompt工程感觉更像是艺术而不是科学。在本例中,我们为大语言模型提供了几个Cypher语句示例,并让它根据这些信息生成Cypher语句。此外,我们设置了一些约束,比如允许它只构造可以从训练示例中推断出来的Cypher语句。此外,我们不会让模型道歉或解释它的想法(然而,gpt -3.5 turbo不会听这些指示)。最后,如果问题缺乏上下文,我们允许模型使用该信息进行响应,而不是强迫它生成Cypher语句。

在大语言模型构造Cypher语句之后,我们简单地使用它来查询Neo4j数据库,并将结果返回给代理。下面是一个示例流程。

1__cgRn4j7FRdNHk2yhYKeoA

当用户输入他们的问题时,它与代理prompt一起被发送到大语言模型。在本例中,大语言模型响应它需要使用Cypher搜索工具。Cypher搜索工具构造一个Cypher语句并使用它来查询Neo4j。然后将查询结果传回代理。接下来,代理将另一个请求连同新上下文一起发送给大语言模型。由于上下文包含构建答案所需的信息,大语言模型形成最终答案并指示代理将其返回给用户。

当然,我们现在可以问一些后续问题。

1_MOcUwNTz8U66WZQ91sgREQ

由于代理具有内存,它知道谁是第二个参与者,因此可以将信息传递给Cypher搜索工具,以构造适当的Cypher语句。

相关三元组的关键字搜索

我从LangChain和GPT-index库中现有的知识图谱索引实现中获得了关键字搜索的想法。这两种实现非常相似。他们要求大语言模型从问题中提取相关实体,并在图中搜索包含这些实体的任何三元组。所以我想我们可以用Neo4j做类似的事情。然而,虽然我们可以使用简单的MATCH语句搜索实体,但我认为使用Neo4j的全文索引会更好。在使用全文索引找到相关实体后,我们返回三元组,并希望回答问题的相关信息在那里。

1
2
3
4
5
6
7
def _call(self, inputs: Dict[str, str]) -> Dict[str, Any]:
"""Extract entities, look up info and answer question."""
question = inputs[self.input_key]
params = generate_params(question)
context = self.graph.query(
fulltext_search, {'query': params})
return {self.output_key: context}

记住,代理已经有了解析相关电影标题的指令,并将其作为关键字搜索工具的输入。因此,我们不需要处理这个。然而,由于问题中可能存在多个实体,我们必须构造合适的Lucene查询参数,因为全文索引是基于Lucene的。然后,我们简单地查询全文索引并返回希望相关的三元组。我们使用的Cypher语句如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
CALL db.index.fulltext.queryNodes("movie", $query) 
YIELD node, score
WITH node, score LIMIT 5
CALL {
WITH node
MATCH (node)-[r:!RATED]->(target)
RETURN coalesce(node.name, node.title) + " " + type(r) + " " + coalesce(target.name, target.title) AS result
UNION
WITH node
MATCH (node)<-[r:!RATED]-(target)
RETURN coalesce(target.name, target.title) + " " + type(r) + " " + coalesce(node.name, node.title) AS result
}
RETURN result LIMIT 100

因此,我们取全文索引返回的前五个相关实体。接下来,我们通过遍历它们的邻居来生成三元组。我特别排除了被遍历的RATED关系,因为它们包含了不相关的信息。我还没有研究过,但我有一种很好的感觉,我们也可以指示大语言模型提供一个相关关系的列表,并与适当的实体一起进行调查,这将使我们的关键字搜索更集中。关键字搜索可以通过显式指示代理来启动。

1_LQ1fqeSbSaTLMwshGzXr7A

大语言模型被指示使用关键字搜索工具。此外,代理被告知提供关键字搜索和相关实体列表作为输入,在这个例子中只有Pokemon。然后使用Lucene参数来查询Neo4j。这种方法撒下了更广泛的网,并希望提取的三元组包含相关信息。例如,检索到的上下文包含关于Pokemon类型的信息,这是不相关的。不过,它也有关于谁在电影中扮演角色的信息,这使得代理可以回答用户的问题。

如前所述,我们可以指示LLM生成相关关系类型列表以及适当的实体,这可以帮助代理检索更多相关信息。

向量相似度搜索

向量相似性搜索是与Neo4j数据库进行交互的最后一种模式,我们将对其进行研究。矢量搜索目前很流行。例如,LangChain提供了与十多个矢量数据库的集成。向量相似度搜索的思想是将问题嵌入到嵌入空间中,并根据问题与文档嵌入的相似度来查找相关文档。我们只需要小心地使用相同的嵌入模型来生成文档和问题的向量表示。我在矢量搜索实现中使用了OpenAI的嵌入。

1
2
3
4
5
6
7
def _call(self, inputs: Dict[str, str]) -> Dict[str, Any]:
"""Embed a question and do vector search."""
question = inputs[self.input_key]
embedding = self.embeddings.embed_query(question)
context = self.graph.query(
vector_search, {'embedding': embedding})
return {self.output_key: context}

所以,我们要做的第一件事就是嵌入问题。接下来,我们使用嵌入在数据库中查找相关电影。通常,向量数据库返回相关文档的文本。然而,我们处理的是图形数据库。因此,我决定使用三重结构来产生相关信息。所使用的Cypher语句是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
WITH $embedding AS e
MATCH (m:Movie)
WHERE m.embedding IS NOT NULL AND size(m.embedding) = 1536
WITH m, gds.similarity.cosine(m.embedding, e) AS similarity
ORDER BY similarity DESC LIMIT 5
CALL {
WITH m
MATCH (m)-[r:!RATED]->(target)
RETURN coalesce(m.name, m.title) + " " + type(r) + " " + coalesce(target.name, target.title) AS result
UNION
WITH m
MATCH (m)<-[r:!RATED]-(target)
RETURN coalesce(target.name, target.title) + " " + type(r) + " " + coalesce(m.name, m.title) AS result
}
RETURN result LIMIT 100

Cypher语句类似于关键字搜索示例。唯一的区别是我们使用余弦相似度而不是全文索引来识别相关电影。在处理多达数万甚至数十万个文档时,这种方法已经足够好了。记住,瓶颈通常是大语言模型,特别是使用GPT-4时。因此,如果您不处理数以百万计的文档,则不必考虑多语言实现,其中您同时拥有矢量和图形数据库,以便能够通过遍历图形来生成相关信息。

1_isgP7zzeADYcodMmwpAZig

当代理被指示使用向量搜索工具时,第一步是将问题作为向量嵌入。OpenAI的嵌入模型产生维度为1536的向量(译者:我们才387维(⊙o⊙)…)表示。因此,下一步是使用构造好的向量,通过计算问题与相关文档或节点之间的余弦相似度,在数据库中搜索相关信息。同样,由于我们处理的是图形数据库,所以我决定以三元组的形式将信息返回给代理。

关于向量搜索的有趣之处在于,即使我们指示代理搜索《指环王》电影,向量相似性搜索也会返回有关《霍比特人》电影的信息。看起来《指环王》和《霍比特人》电影在嵌入空间里很近,这是可以理解的。

最后

可以访问外部工具和信息的聊天机器人和生成代理似乎是ChatGPT炒作之后的下一波浪潮。有能力提供额外信息和上下文内容,可以让大语言模型大大提高其结果。此外,代理的工具不限于只读操作,这意味着它们可以更新数据库甚至在淘宝帮你下订单(比如你家的洗衣液快没了,对着手机说一声,还是同一个牌子的洗衣液,再来一箱。)。在大多数情况下,LangChain框架似乎是目前用于实现生成代理的主要库。当您开始使用LangChain时,您可能需要在编码过程中进行一些调整,因为您需要将大语言模型提示与代码结合起来完成任务。例如,大语言模型和工具之间的消息可以用自然语言指令作为提示而不是Python代码来塑造和重塑。我希望这个项目能够帮助您在LangChain项目中实现像Neo4j这样的图形数据库的功能。






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


TorchV AI支持试用!

如您有大模型应用方面的企业需求,欢迎咨询!



部署本地大模型(基于Langchain)

原文:Training Your Own LLM using privateGPT

作者:Wei-Meng Lee

了解如何在不向提供者公开私有数据的情况下训练自己的语言模型

使用公共AI服务(如OpenAI的ChatGPT)的主要问题之一是将您的私人数据暴露给提供商的风险。对于商业用途,这仍然是考虑采用AI技术的公司最担心的问题。

很多时候,您希望创建自己的语言模型,该模型是根据您的数据集(例如销售见解,客户反馈等)进行训练的,但同时您又不希望将所有这些敏感数据暴露给OpenAI等AI提供商。因此,理想的方法是在本地训练自己的LLM(大语言模型),而不需要将数据上传到公网。

在本文中,我将向您展示如何使用一个名为privateGPT的开源项目来利用LLM,以便它可以根据您的自定义训练数据回答问题(如ChatGPT),而不会牺牲数据的隐私性。

值得注意的是,privateGPT目前还处于概念验证阶段,还没有准备好投入生产。

下载privateGPT

要尝试privateGPT,您可以使用以下链接访问GitHub: https://github.com/imartinez/privateGPT.

您可以通过点击Code | download ZIP按钮下载repository:

img

或者,如果你的系统上安装了git,在Terminal中使用以下命令克隆repository:

1
$ git clone https://github.com/imartinez/privateGPT

无论哪种情况,一旦repository下载到您的计算机上,privateGPT目录应该有以下文件和文件夹:

img

安装所需的Python Packages

privateGPT使用许多Python包。它们被封装在requirements.txt文件中:

1
2
3
4
5
6
7
8
9
10
11
12
langchain==0.0.171
pygpt4all==1.1.0
chromadb==0.3.23
llama-cpp-python==0.1.50
urllib3==2.0.2
pdfminer.six==20221105
python-dotenv==1.0.0
unstructured==0.6.6
extract-msg==0.41.1
tabulate==0.9.0
pandoc==2.3
pypandoc==1.11

最方便的方法就是通过 pip/conda:

1
2
3
4
$ cd privateGPT
$ pip install -r requirements.txt

// $ conda install -r requirements.txt

根据我的经验,执行上述安装时,可能不一定会安装一些必需的Python包。稍后,当您尝试运行摄取.py或privateGPT.py文件时,您就会知道这一点。在这种情况下,只需单独安装丢失的包。

编辑环境(Environment)配置文件

这个example.env文件包含privateGPT使用的几个设置。其内容如下:

1
2
3
4
5
PERSIST_DIRECTORY=db
MODEL_TYPE=GPT4All
MODEL_PATH=models/ggml-gpt4all-j-v1.3-groovy.bin
EMBEDDINGS_MODEL_NAME=all-MiniLM-L6-v2
MODEL_N_CTX=1000
  • PERSIST_DIRECTORY—在加载和处理文档之后将保存本地矢量存储的目录
  • MODEL_TYPE—您正在使用的模型的类型。在这里,它被设置为GPT4All(由OpenAI提供的ChatGPT的免费开源替代品).
  • MODEL_PATH—LLM所在的路径。这里它被设置为models目录,使用的模型是ggml-gpt4all-j-v1.3-groovy.bin(您将在下一节中了解到在哪里下载这个模型)
  • EMBEDDINGS_MODEL_NAME——这指的是转换器模型的名称。这里它被设置为all-MiniLM-L6-v2,它将句子和段落映射到384维的密集向量空间,可以用于聚类或语义搜索等任务。
  • MODEL_N_CTX -嵌入模型和LLM模型的最大令牌限制

example.env 重命名为 .env.

将这个文件变成隐藏模式

下载Model(模型)

为了使privateGPT正常运行起来,它需要预先训练模型(就是LLM)。由于privateGPT使用GPT4All,您可以从https://gpt4all.io/index.html下载LLM。

img

因为默认的环境文件指定了ggml-gpt4all-j-v1.3-groovy.bin LLM,所以下载第一个模型,然后在privateGPT文件夹中创建一个名为models的新文件夹。将ggml-gpt4all-j-v1.3-groovy.bin文件放入models文件夹中:

img

数据预处理

如果你查看一下ingest.py文件,你会注意到下面的代码片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
".csv": (CSVLoader, {}),
# ".docx": (Docx2txtLoader, {}),
".doc": (UnstructuredWordDocumentLoader, {}),
".docx": (UnstructuredWordDocumentLoader, {}),
".enex": (EverNoteLoader, {}),
".eml": (UnstructuredEmailLoader, {}),
".epub": (UnstructuredEPubLoader, {}),
".html": (UnstructuredHTMLLoader, {}),
".md": (UnstructuredMarkdownLoader, {}),
".odt": (UnstructuredODTLoader, {}),
".pdf": (PDFMinerLoader, {}),
".ppt": (UnstructuredPowerPointLoader, {}),
".pptx": (UnstructuredPowerPointLoader, {}),
".txt": (TextLoader, {"encoding": "utf8"}),

从这个文件上我们可以看到privateGPT支持以下数据文档格式:

  • .csv: CSV
  • .doc: Word文档
  • .docx: Word文档
  • .enex: EverNote
  • .eml: Email
  • .epub: EPub
  • .html: HTML File
  • .md: Markdown
  • .odt: Open Document Text
  • .pdf: PDF
  • .ppt : PPT
  • .pptx : PPTX
  • .txt: Text (UTF-8)

每种类型的文档都使用各自的加载程序来分别加载。例如,你使用UnstructuredWordDocumentLoader类来加载**.doc.docx** 这些Word文档。

默认情况下,privateGPT附带位于source_documents文件夹中的state_of_the_union.txt文件。我将删除它,并用一个名为Singapore.pdf的文档替换它。

img

这个文档创建的内容来自于:https://en.wikipedia.org/wiki/Singapore。您可以通过点击 Tools | Download as PDF 从维基百科下载任何页面:

img

您可以将privateGPT支持的任何文档放入source_documents文件夹中。在本文的例子中,我只放了一个文档。

为文档创建Embeddings

一旦数据文档就位,就可以为文档做embedding了。

创建embedding是指为单词、句子或其他文本单元生成向量表示的过程。这些向量表示捕获关于文本的语义和句法信息,使机器能够更有效地理解和处理自然语言。

在Terminal(终端)中输入以下内容: (ingest.py文件在privateGPT文件夹中)

1
$ python ingest.py 

根据您使用的机器和您放入source_documents文件夹中的文档数量,嵌入处理可能需要相当长的时间才能完成。

完成后,您将看到如下内容:

1
2
3
4
Loading documents from source_documents
Loaded 1 documents from source_documents
Split into 692 chunks of text (max. 500 characters each)
Using embedded DuckDB with persistence: data will be stored in: db

Embedding文件保存在db文件夹中,格式为Chroma db:

img

Chroma 是一个开源的向量数据库。

开始提问题吧

您现在可以提问了!

在Terminal中输入以下命令:

1
$ python privateGPT.py

加载模型需要一段时间。在此过程中,您将看到以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Using embedded DuckDB with persistence: data will be stored in: db
gptj_model_load: loading model from 'models/ggml-gpt4all-j-v1.3-groovy.bin' - please wait ...
gptj_model_load: n_vocab = 50400
gptj_model_load: n_ctx = 2048
gptj_model_load: n_embd = 4096
gptj_model_load: n_head = 16
gptj_model_load: n_layer = 28
gptj_model_load: n_rot = 64
gptj_model_load: f16 = 2
gptj_model_load: ggml ctx size = 4505.45 MB
gptj_model_load: memory_size = 896.00 MB, n_mem = 57344
gptj_model_load: ................................... done
gptj_model_load: model size = 3609.38 MB / num tensors = 285

Enter a query:

At the prompt, you can type in your question. I asked: “*What is the population in Singapore?*”. It took privateGPT quite a while to come up with the answer. Once it managed to find an answer, it give you the answer and cited the source for the answer:

Enter a query:提示符后面,你可以输入你的问题。问:“新加坡的人口是多少?”。privateGPT可能需要花很长时间才想出了答案。一旦它找到了答案,它就会给出答案并引用答案的来源:

img

你可以继续问后续的问题:

img

总结

虽然privateGPT目前还处于概念验证阶段,但它看起来很有希望,然而,它还没有准备好投入生产。这里有几个问题:

  • 推理缓慢。执行文本嵌入需要一段时间,但这是可以接受的,因为这是一次性的过程。然而,推理很慢,特别是在较慢的机器上。我用的是32GB内存的M1 Mac电脑,仍然花了一段时间才得出答案。
  • 占用内存。privateGPT使用大量内存,在问了一两个问题后,我将得到内存不足的错误,如下所示:

segmentation fault python privateGPT.py. /Users/weimenglee/miniforge3/lib/python3.10/multiprocessing/resource_tracker.py:224: UserWarning: resource_tracker: There appear to be 1 leaked semaphore objects to clean up at shutdown. warnings.warn(‘resource_tracker: There appear to be %d ‘

在privateGPT的作者修复上述两个问题之前,privateGPT仍然是一个实验,以了解如何在不将私有数据暴露给云的情况下训练LLM。

相关文章:使用GPT4ALL和LangChain构建本地大模型应用

工具推荐:可以配置参数的Midjourney中文教程工具






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


TorchV AI支持试用!

如您有大模型应用方面的企业需求,欢迎咨询!



Midjourney参数指令速记表(v5.1)

来个Midjourney 5.1的prompt参数一纸禅

当前版本:v5.1(包含niji 5)

后续会不断更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
基础Prompt剖析: 
/imagine prompt: [PREFIX] [SCENE] [SUFFIX] [Parameters]
PREFIX :一般是 image(上传的图片URL) medium(媒介) & style(样式)
SCENE :一般指主要内容
SUFFIX :调节内容,包括前缀微调和参数微调
(实际操作中,可以重叠这些类型)

排列的用法(消耗会非常快!!!):
/imagine prompt: cinematic shot of astronaut on {horse, turtle} --c {20,80}
...实际会生产四条prompts:
-> cinematic shot of astronaut on a horse --c 20
cinematic shot of astronaut on a turtle --c 20
cinematic shot of astronaut on a horse --c 80
cinematic shot of astronaut on a turtle --c 80


Parameters(参数类型):
--ar [WIDTH:HEIGHT] (=aspect ratio) // 长宽比
--c [0-100] (=chaos, unusual results) // 天马行空
--q [.25|.5|1] (=quality/time spent generating the image, 1=default) // 质量越好,生成越慢
--seed [0-4294967295] (=starting point for initial grid) // 种子,适合于基于某一张图片调整
--stop [10-100] (=stop at earlier percentage) // 如果你需要一个半成品,或朦胧感
--s [0-1000] (=stylize, artistic interpretation) // 美化程度
--tile (=seamless patterns) // 无缝重复模式,用于制作比如地毯、地板和编织物等
--iw [W] (=sets image weight to W) // 在prompt中使用图片url,可以设置这个图片的权重
--no [X] (=gives X a negative weight of -0.5) // 排除某内容,比如排除水果篮里面的苹果
--niji / --niji 5 (anime trained model) // 和Spellbrush合作的动漫风格
--v [1,2,3,4] (=model versiom) // 版本设置,默认是最新版,当前是5.1,但各版本有差异
--hd (=使用早期替代模型,生成较大的、不太一致的图像)
--style raw (=仅用于5.1版本,真实风格)
--style expressive (=和niji 5 版本配合使用,表现力增强)
--style cute (=和niji 5 版本配合使用,可爱风格)
--style scenic (=和niji 5 版本配合使用,更注重环境表达,或者说风景画)
--repeat [N] (=repeat prompt N-times) // 重复生成,标准用户2-10次,专业版用户2-40次

Weights(权重):
/imagine prompt: hot dog // 热狗(食物)
hot:: dog // 热的狗狗(动物)
hot::2 dog // 非常热的狗狗(动物),这里容易混淆,这里的比重其实是hot更大,hot的比重是dog的两倍。

Option Commands:
/prefer option set [NAME OF OPTION] [VALUE] // 设置常用选项
... e.g:
-> /prefer option set mycoolpreset dadaism --c 80 // 将 dadaism --c 80 设置为常用选项,名称是mycoolpreset
...now
/imagine prompt: an astronaut, --mycoolpreset // 使用 --mycoolpreset
...becomes
/imagine prompt: an astronaut, dadaism --c 80 // Midjourney会自动将Prompt理解为这样

/prefer option set mycoolpreset
...deletes mycoolpreset! // 删除(清空)默认选项
/prefer option list
... shows presets // 显示所有已经设定的后缀
/prefer option remix
... toggles remix mode // 切换混合模式,混合模式可以使用某一原图的构图来进行作图。
/prefer suffix
... suffix to add to the end of every prompt // 设置后缀
/prefer auto_dm
... automatically send DM when jobs complete // 自动设置将结果发私信

More Commands:
/describe // 上传图片,反向生成可能的prompt
/blend // 合并两张图片,比如一个模特,和一件衣服
/stealth & /public (=toggle stealth mode) // 私有还是公开
/fast & /relax (=toggle fast mode) // 快速模式,但质量会下降一些
/info (=show account info & queued jobs) // 查看账号信息和排队作业
/settings (=change bot settings) // 对于个人用户来说,类似于全局设置
/subscribe (=change subscription plan) // 为用户的账户页面生成个人链接
/show (=使用图像的作业ID在Discord中重新生成作业)



关于Midjourney的其他文章:






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


TorchV AI支持试用!

如您有大模型应用方面的企业需求,欢迎咨询!



Midjourney(v5.1) Prompt深度剖析,创造有灵魂的图

原文:Anatomy of Midjourney Promps: In-Depth Study for effective Prompting Strategies — V5.1 examples

作者:Michael King

译者:这是一个非常“平易近人”的Midjourney教程,非常适合对作图有要求的同学一步一步开始自己的Midjourney之旅。

你是否曾经发现自己盯着Midjourney的空白画布,手指悬停在键盘上,让我问自己:“我应该问这个东西什么?

img

我也曾经有过同样的经历,朋友。就像站在一个售卖艺术品的自动贩卖机前一样,但你需要喂它文字而不是硬币。而且并非所有的词语都可以使用,你必须选择正确的单词,并按照正确的顺序排列。这有点像施法一样。有时候你会中大奖,获得比你想象中更美丽、更完美的杰作;但另外一些时候,它可能和问一个魔球没有什么区别。

这个被称为“Midjourney prompting”的功能实际上是一个谜团。这真正是一种舞蹈,在您和AI之间进行交互。您用文字引导着AI生成图像,并共同创造出独特的东西。但步骤并不总是清晰明了:您应该要求简单地描述,a sunset over the ocean(海洋上落日)?还是更加详细地描绘画面以期待AI能够将其呈现出来?或者尝试采取结构化方法,如电影导演指挥镜头?

然后难免需要微调——哦!微调!转眼之间,您正在调整此处单词、那里短语;接下来发生了什么事情呢?您已经修改了提示内容很多次,以至于它几乎无法被识别。但当您最终获得那张令人惊叹的图像时,这一切都是值得的。

那么,你如何破解这个谜题?如何掌握Midjourney Prompt的艺术?我有一些见解要与您分享,这是从许多与AI的深夜交互中获得的。所以请继续关注,因为事情即将变得有趣。


从基础的输入开始

好的,让我们开始吧。想象一下,你站在控制台前,眼睛盯着那个空白画布。手指悬停在键盘上,然后敲出一个简单的单词:“chair(椅子)”。听起来很基础,对吧?但这好歹是个不错的开始。

现在,为了增加趣味性,你决定将混沌度调到50。为什么是50呢?因为我发现中等程度的混沌设置可以引入足够多的不确定性以保持事情有趣。这就像给你的餐点加一点辣酱——不会烧掉你的味蕾,但只要能让舌头感到刺痛就行了。

在这种情况下,“混沌参数”是我们秘密武器。它是万能卡牌、意外元素。它使得人工智能说:“chair(椅子)?好啊!看看我能做些什么!”相信我,在处理人工智能时,稍微变化一下也可以大有裨益。

Prompt:
chair --c 50

img

那么,我们按下回车键,靠在椅子上等待。最终我们得到的是……没错,这就是一把椅子。但它有点像让厨师给你做三明治,结果拿到的只是一片面包和一块奶酪。当然了,从技术上来说这确实算作三明治,但不完全符合你的期望吧?

这就是midjourney prompt的问题所在。如果指令过于模糊不清,则需要AI自行填补空缺部分。虽然AI具备很多技能,但并不能读取人类思想。

增加描述–颜色

因此,让我们更加具体地描述需求吧!我们要对椅子进行改造——涂上新漆!那么颜色呢?为什么不选绿色呢?它既大胆又充满活力,并且代表着生命之色。而且顺便提一下:绿色也正好是我的最爱。

Prompt:
green chair --c 50

img

好的,让我们看看我们得到了什么。啊,是的,我们有绿色的椅子。但它们到处都是!其中一些看起来像从印象派画作中撕下来的,而另一个则清晰明了,就像高分辨率照片一样。这就像一个名为“Green Chairs: A Study in Chaos(绿色椅子:混沌之研究)”的野性、折衷主义艺术展览。很有趣,但不完全符合我们的目标。

你知道吗,在Midjourney Prompt方面有个问题。这有点像与一个天才但略微健忘的艺术家打交道。你必须清楚地表达你想要什么,否则他们会自己创造出新奇别致的东西。虽然这可能会带来一些惊人的惊喜,但也可能让你摸不着头脑,并且纳闷自己怎么会得到一个立体主义解释绿色椅子。

创造真实的图–摄影风格

所以回到绘图板上——或者说键盘上吧。我们想要一张绿色椅子的照片,而不是画作。我们追求现实主义风格,在这里可以感受、触摸和坐在上面的真实存在感。“再试一次”准备好了吗?让我们开始吧…

Prompt:
green chair | photography --c 50

img

哇,这是什么?一把绿色的椅子竟然出现在农田中央?这可真是不寻常。再看那一把孤零零地坐在空旷街道上的绿色椅子,就像一个超现实主义梦境中的场景。得承认AI确实有着非凡的想象力。

但尽管我很享受这个意外之旅,它并不完全符合我们最初设定的目标。就好比点了一份比萨饼却收到了美食汉堡包,虽然看起来很诱人,但并不是你口感所期待的。

设定场所

因此,我们要回归正题。让我们带着这把绿色椅子踏上新旅程,在家庭生活中心留下它温馨舒适的身影吧!想象一个舒适温馨、壁炉边火苗跳动、柔软地毯铺满整个房间……而在其中央,则摆放着我们那张迎人且舒适无比的绿色椅子。这才是我们要为AI艺术家描绘出来的场景。

Prompt:
green chair | photography | living room --c 50

img

啊,成功了!我们在客厅里放上了绿色的椅子。感觉好像我们正在取得进展,不是吗?但等等,这有点…暗,不是吗?就像我们在半夜闯入自己的客厅一样。它有点神秘的氛围,就像一个悬疑惊悚片的开场一样。无疑很引人入胜,但并不是我们所想象中邀请人们来到家里的形象。

你知道这个场景需要什么吗?阳光的洒落。透过窗户射进来明亮而温暖的光线,在地板上投下长长的阴影。一个舒适角落,在那里你可以蜷缩着读一本好书,阳光在书页上跳动。

调试光线

所以让我们再试一次好吧?我们将增加亮度,并注入“bright daylight(明亮白天)”的光芒来为场景带来活力。就像导演调整灯光以设置完美情境。

Prompt:
green chair | photography | living room | bright daylight --c 50

img

现在我们开始谈论了!我们的绿色椅子,在明亮的阳光下晒着,真的开始显眼起来。它有一种积极的氛围和能量,以前是没有的。但是…还缺少一些东西。这个东西可以让它从“”变成“很棒”。

所以,我告诉你一个小秘密。你知道吗?我们的Midjourney AI艺术家可以模仿相机拍摄效果!不是名人,而是相机模型。没错!它可以模仿不同相机模型独特的特点,为您的图像增添特殊风格。

想象一下吧。每台相机都有自己独特捕捉世界方式,“个性”,如果您愿意这么说。有些可能会给您提供清晰、高清晰度图像;其他则可能使您拥有怀旧、略微模糊质感图片。

尝试设定具体的相机(和镜头)

那么,让我们来测试一下Midjourney AI吧!我们将输入两个新提示语句,并分别对应不同相机模型进行仿制处理:尼康D850经典Polaroid即时成像相机——前者因其锐利、鲜艳图像而闻名于世;后者则因其柔软、梦幻般的质感而广受认可。

Prompt:
green chair | photography | living room | bright daylight | Camera: Nikon D850 --c 50

img

Prompt:
green chair | photography | living room | bright daylight | Camera: Polaroid --c 50

img

现在这才像样!我们的绿色椅子,通过两个不同相机的镜头捕捉,每一个都为图像增添了自己独特的风味。就像我们给一件杰作添加了最后的润色。但你知道吗?我还没有准备好放下我的画笔。

为什么只停留在一把绿色椅子上呢?让我们为场景增加更多生气吧!让我们再加入另一个角色来丰富故事情节。对于我们的绿色椅子来说,有什么比泰迪熊更好的配合者呢?这是经典组合,就像花生酱和果冻、电影和爆米花。

想象一下:明亮阳光下沐浴着温暖舒适感觉家庭氛围中,泰迪熊舒适地栖息在我们的绿色椅子上。这是一个唤起人们温馨、舒适、家庭感觉场景。就像我们不仅创造了一幅图像,而且创造了一个记忆。

增加一点摆设

那么让我们重新开始吧! 我们不只是进入了兔子洞里面,在泰迪熊洞里也要深入探索。准备好为我们的杰作增添更多魔力了吗?让我们开始吧……

Prompt:
teddy bear on a green chair | photography | living room | bright daylight | Camera: Nikon D850 --c 50

img

嗯,这很有趣。我们要求一把带小熊的绿色椅子,但是我们得到了一把带小熊的蓝绿色(turquoise)椅子。就像点了一个青苹果却拿到了蓝莓一样,接近但不完全正确。

但你知道吗?这就是整个过程的美妙之处。它充满不可预测性、惊喜和挑战你的思维方式。虽然我们的椅子可能经过了“蓝绿镇(Turquoise Town)”的弯路,但这也是旅程中必须经历的部分。

改变视角

所以,我们将再次调整提示内容。但这次,我们不仅会调整颜色,还会玩转视角。想想看吧!观察事物的方式可以彻底改变你对它的看法。

Prompt:
teddy bear on a green chair | photography | living room | bright daylight | Camera: Nikon D850 | low angle view | --c 50

img

现在这才像话!从新的角度看,我们的绿色椅子和泰迪熊真正开始活起来了。就像我们自己走进了场景,亲眼目睹一样。但是,既然已经到了这一步,为什么要停下呢?

增加一些艺术效果

让我们给场景增加一点戏剧性、特效的调味吧。还有什么比水滴更具戏剧性呢?想象一下,在明亮的阳光下每个水滴反射出闪耀光芒,窗户上雨滴轻柔地拍打声音,绿色椅子和泰迪熊带来舒适温馨感觉。就好像我们正在创造自己的小电影场景。

Prompt:
teddy bear on a green chair | photography | living room | bright daylight | Camera: Nikon D850 | low angle view | Effects: water drops --c 50

img

哇,真的起作用了。我们的绿色椅子场景现在加上了水滴,看起来非常棒。但是你知道吗?我想再推动一下创新边界。

让我们向Midjourney AI艺术家投掷另一个曲线球。我们有绿色椅子、泰迪熊、日光、新鲜视角和水滴。但是让我们再加点料吧!怎么样,在这个场景中添加一些落叶呢?

如果换个场景会怎么样?

想象一下,明亮的彩叶飘落,随着它们的降落捕捉到光芒。我们的场景不再只是简单地展示一个椅子图像,而是变成了生活片段,充满了色彩、运动和能量。就好像我们正在为AI创造注入生命。

Prompt:
brown teddy bear on a green chair | photography | living room | bright daylight | Camera: Nikon D850 | close-up view | Effects: water drops | surrounded by falling leaves --c 50

img

哇,这不是一道令人眼前一亮的景象吗?树叶飘落,阳光透过枝叶洒下来,水滴溅起涟漪……这里有着丰富多彩的视觉和声音。但等等……我们的绿色椅子变得不再那么绿了。还有,难道里面不应该有一个客厅吗?

你看,这就是中途提示的问题所在。它就像赶集场上放羊儿一样棘手。你必须关注所有细节,否则事情很快就会失控。

调整美化参数(stylize)

但别担心。我还有一个法宝——“stylize(美化参数)”。把它想象成导演剪辑版。它让我们可以微调场景,并确保每个细节都符合我们的要求。

而且我们并不只是稍微调整一下。“stylize(美化)”值将被提高到1000!这就像给AI艺术家喊话:“让我们的愿景变为现实!”

因此,请回到键盘前准备好:绿色椅子、泰迪熊、日光、新鲜视角、水滴和落叶以及最大限度地提高stylize的数值——准备好看接下来会发生什么了吗?我知道我准备好了。

Prompt:
teddy bear on a green chair | photography | living room | bright daylight | Camera: Nikon D850 | close-up view | Effects: water drops | surrounded by falling leaves --c 50 --s 1000

img

大家看到了吗!这就是我们一直追求的完美画面。有绿色的椅子,小熊玩具,阳光、水滴和落叶……就像我们经历了一次视觉之旅,最终抵达目的地。Midjourney真是太棒了。

总结

那么这里有什么要点呢?当你开始Midjourney时,可能没有明确的想法。没关系!只需加入一个简短提示词或两个单词,并看看它会带给你什么灵感。就像坐上过山车而不知道将去何方一样刺激。

但也许你属于计划型人格你已经在脑海中形成了清晰的愿景和画面。在这种情况下,您需要从较长的提示开始,例如四五个单词。然后随着进展逐渐添加更多元素作为构建模块,在每个步骤中都能看到您所创建内容正在成形、演变并越来越精致。

但是,请注意一旦得到完美图像,请勿停止尝试新事物!删除某些元素或添加其他元素可能会带来意外结果——请参见下面的图片示例:我们移除了小熊玩具和绿色椅子,看看我们得到了什么——一个全新的杰作!

归根结底,成功的Midjourney提示都是关于实验和探索。从小处开始,并逐渐建立您的想法。逐个修改参数并观察图像如何演变。这是一次发现、创造和乐趣之旅。

那么,准备好开始自己的Midjourney了吗?我已经准备好了!让我们开始创作吧

Prompt:
photography | living room | bright daylight | Camera: Nikon D850 | close-up view | Effects: water drops | surrounded by falling leaves --c 50 --s 1000 --ar 16:9

img


关于Midjourney的其他文章:






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


TorchV AI支持试用!

如您有大模型应用方面的企业需求,欢迎咨询!



Midjourney高级技巧的极简教程

原文:An advanced guide to writing prompts for Midjourney ( text-to-image)

作者:Lars Nielsen

How to write prompts for Text to Image generation by Midjourney , text prompt , #midjourney prompt engineering

Midjourney生成的图像,文本Prompt:beautiful, fantasy city unreal engine

一句话介绍midjourney ?

对于那些还没有听说过Midjourney的人,这里是一个简短介绍:Midjourney是一款文本到图像生成应用程序,类似于OpenAI的DALLE-2和Stable Diffusion的DreamStudio,它使用互联网上发现的大量图片(约6.5亿张)来根据提供的文本提示生成令人惊叹的图像。目前处于测试阶段 - 但每周都在添加更多功能…未来还有很多想象空间!(当前他们的AI引擎为v5.1)

原始的prompt

如果您使用 midjourney 应用程序,则会知道您在文本中越详细描述,输出结果就越生动独特。用户通常使用原始和直接的提示词语,例如:a cowboy wearing a tuxedo on the moon(一个穿着礼服在月球上骑马的牛仔)”,将生成这样的内容:

A guide to writing text prompts for Midjourney , prompt engineering

但是除了简单的原始prompt文本之外,还有更多选项可以创建可预测和一致的图像输出!

现在直接进入文本提示的高级选项列表!

以下是您可以生成图像变体的一些方法以及相应的高级设置:(每个设置的详细信息在列表下方)

  1. 提供风格关键字 — ‘style’
  2. stylize(美化)
  3. chaos(随机性)
  4. Resolution
  5. Aspect ratio(长宽比)
  6. 将图像作为URL prompt上传
  7. 应用权重到图像prompt。
  8. 为某些词加权
  9. 过滤掉某些词

简而言之,您的风格受到所选关键词的影响——您可以指定选择何种类型的风格——此图显示了风格类型的广泛分类。

guide to writing prompts for Midjourney — style groups , prompt engineering

  1. Style — keyword

提供一组与“style”(风格)相关的prompt关键词,可以根据您选择的风格类型创建不同的输出。以下是一些基于您可能想要选择为样式的艺术形式/设计/艺术家/流派的关键词和子类型:

  • 使用不同的设计流派作为style(风格)关键字

A guide to writing text prompts for Midjourney. Text to image generation . Different artist styles , prompt engineering

  • 使用艺术家名称作为style(风格)关键字

您还可以将艺术家指定为样式输出。以下是一些相同prompt的示例:

1
/imagine horse galloping at sunset painting Andy Warhol style

A guide to writing text prompts for Midjourney. Text to image generation . Different artist styles Da Vinci , Salvador Dali

  • 使用渲染/光线属性作为style(样式)关键词

A guide to writing text prompts for Midjourney. Text to image generation . Different artist styles

2. stylize the output(美化输出)

您可以添加设置--s <某个数字>(表示样式)

以下图片来自相同的提示 - 低和高风格化选项。

1
/imagine firefighters --s 6000

A guide to writing text prompts for Midjourney. Text to image generation . stylize option

3. chaos — 提高抽象程度

接受0到100之间的数字,以增加或减少主题中的抽象程度。

1
/imagine Eiffel tower --chaos 60

A guide to writing text prompts for Midjourney. Text to image generation . Different options , chaos

4. Resolution(分辨率)

为了指定输出分辨率,您可以使用一些常用的关键词,如8K、4K、逼真、超逼真、超详细复杂细节等。

或者您也可以选择标准设置以获得可预测的输出。hdquality / --q 是其中两个设置指令。

1
2
/imagine red rose flower --hd
/imagine red rose flower --quality 5

5. Aspect ratio(长宽比)

你可以指定输出图像的宽高比,这被称为纵横比。默认输出是一个正方形图像(1:1 纵横比)。但如果你想要更具电影感的视角——或者只是想制作一张适合笔记本电脑桌面的壁纸,你可以改变纵横比。

1
/imagine jasmine in the wild flower --ar 4:3

如果您想指定自定义图像大小,请使用以下示例。

1
/imagine jasmine in the wild flower --w 600 --h 300

您无法指定自定义的宽高比,但可以指定一些标准的宽高比以及一些非标准的宽高比!(以下是一些示例)

A guide to writing text prompts for Midjourney. Text to image generation . Aspect ratio

6. Image as a prompt

如果您想要在多张图片上获得类似图像风格的输出(当您需要获得一致的输出时),请传递一个图像的URL。

1
/imagine http://www.imgur.com/Im3424.jpg box full of chocolates

生成的图像将同时参考种子图像(来自您传递的URL)和文本prompt。

  • 您可以提供多张图片作为prompt

  • 您可以为这些图片指定权重(请参见下一条)

7. 为图片加权(重)的prompt

如果您希望输出结果更接近于您的提示图像(减少midjourney自己的想象力,请参见上一点),则应该给予该图像更高的权重。 (keyword : --iw <number>) .

1
/imagine http://www.imgur.com/ks34f24.jpg chocolates --iw:4

8. 为prompt中的文本加权

1
/imagine wild animals tiger::2 zebra::4 lions::1.5

9. 从图像中过滤掉词语

使用 --no 关键字来丢弃任何不想要的主题。

1
/imagine KFC fried chicken --no sauce

A guide to writing text prompts for Midjourney. Text to image generation . Negative prompt text

10. 最后,这里有一些你可以尝试使用的有趣关键词

1
2
3
4
5
6
7
Sony Alpha α7, ISO1900, Leica M = 指定任何镜头类型或相机类型。

photorealistic(逼真照片级别) , ultra photoreal(超逼真) , ultra detailed(超详细), intricate details(错综复杂的细节) = 为了指定一些可能的细节和更加现实而不是艺术化的外观。

unreal(虚幻) = 指定虚幻引擎的感觉。

volumetric light(立体光) , cinematic lighting(电影级照明) = 指定一些光线条件。

最后

我们谈论了如何在中途实验的输出图像上获得一定程度的控制。但这还不够。Midjourney 的工作人员为您留下了很大的想象和实验空间。祝您尝试不同的提示并享受创造过程。

译者注:本站后续会提供更多Midjourney相关的文章,包括最新的v5.1的官方教程、一些特殊技巧(模特换衣、家居设计、人物制作等),以及色彩搭配等方面的内容,敬请期待!


关于Midjourney的其他文章:






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


TorchV AI支持试用!

如您有大模型应用方面的企业需求,欢迎咨询!



使用GFPGAN将Midjourney生成的人脸精细化

原文:Taking generated Midjourney (MJ) images to the next level

作者:Lars Nielsen

关于本文

本文将简要介绍使用midjourney生成更逼真的合成人脸的操作流程。

糟糕的面部重建

任何使用Midjourney创建涉及人脸图像的人都非常清楚,当涉及到人脸时,使用Midjourney生成的图像效果很差。

例如-下面的图片是使用Midjourney应用程序(升级版)生成的,几乎每个逼真的人脸图像最终都会变形。

text-to-image generation using midjourney #midjourney

由midjourney生成的图像:不良面部构造示例(1)

Restoring face images for text-to-image generation using midjourney

由midjourney生成的图像:不良面部构造示例 (2)

一条面部修复流水线

为了减少面部重建的畸变并使其更有用,这里提供一个快速的图像生成流水线供您尝试 —

text-to-image generation pipeline using midjourney and GFPGAN

使用GFPGAN进行人脸修复的图像生成流程

步骤1:提供一个图片链接作为您的图像prompt,在您的文本prompt中。通过此处的链接学习如何进行高级文本提示生成。(Midjourney写作提示的高级指南)

步骤2:使用关键词和属性进行细化。

步骤3:将经过细化处理后的图像输入GFPGAN。

步骤4:您可以将这个新恢复的图像反馈到图像提示中,或在GFPGAN中继续几次迭代。

.. 注意:这可能需要从面部重建软件(GFPGAN)进行几次迭代,因此最好为此创建一个小型Python脚本。

GANS

GANs(生成对抗网络)是一种神经网络,通过迭代尝试多轮比上一次更好的输出来从随机噪声中生成图像(物体、人脸和几乎任何东西)。经过几次迭代后,它们会生成合成图像,这些图像与最初在训练集中存在的真实图像几乎相似。

很遗憾,我们不会详细介绍GAN的工作原理。)你可以在这本精彩的书中学习GAN(《GANs in Action: Deep learning with Generative Adversarial Networks》——Jakub Langr和Vladimir Bok著)。

GFPGAN(生成式面部先验GAN)

GFPGAN是一种专门用于恢复人脸的GAN实现。正如他们网站上所提到的,他们

它是开源的,可以在这里获取。 (https://github.com/TencentARC/GFPGAN )

但是对于那些没有支持GPU的机器或不太懂技术(万一你遇到了一些需要修复错误的麻烦),这里有GFPGAN在Hugging Face Spaces上的实现。链接在这里 - https://huggingface.co/spaces/akhaliq/GFPGAN

回到midjourney

这里是我们从midjourney恢复的一些真实输出样本。

Image generated by text prompt through midjourney , facial restoration by GFPGAN

通过midjourney文本提示生成的图像,使用GFPGAN进行面部修复

Image generated by text prompt through midjourney , facial restoration by GFPGAN

通过midjourney文本提示生成的图像,使用GFPGAN进行面部修复

Image generated by text prompt through midjourney , facial restoration by GFPGAN

通过midjourney文本提示生成的图像,使用GFPGAN进行面部修复

有潜力创造出惊人的面部图像

以下是通过midjourney生成的一些人脸图像 - 经过几次迭代。

Sample faces generated and iterated through midjourney + GFPGAN face restoration


关于Midjourney的其他文章:






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


TorchV AI支持试用!

如您有大模型应用方面的企业需求,欢迎咨询!



使用Midjourney制作专业级LOGO

原文:Best Logo Prompts for Midjourney V5 AI Image Generator: Blueprint for Amazing Logo included!
作者:Michael King

今天我们将探索一些超棒的提示,帮助你使用最新版本、最强大的Midjourney,像专业人士一样轻松制作出独特、引人注目的标志!


但等等,还有更多!作为这个美妙蛋糕上的额外樱桃,我还会提供一个Blueprint模板,您可以混合、匹配和调整它来创建自己的标志设计杰作。请耐心阅读本文直到最后,因为那里将会有这个时髦的Blueprint。

logo制作的魔法开始了

Prompt:
Design of abstract logo featuring a dog in blue on a pink background. Include lines as an additional design element. --v 5

Prompt:
Design of sketchy logo featuring a bird in green on a blue background. Include pattern as an additional design element. --v 5

Prompt:
Design of professional logo featuring a leaf in green on a brown background. Include curves as an additional design element. --v 5

Prompt:
Design of professional logo featuring a leaf in green on a brown background. Include curves as an additional design element. --v 5

Prompt:
Design of professional logo featuring a leaf in green on a brown background. Include curves as an additional design element. --v 5

Prompt:
Design of sketchy logo featuring a queen in black on a silver background. Include highlights as an additional design element. --v 5

Prompt:
Design of professional logo featuring a fish in yellow on a purple background. Include circle as an additional design element. --v 5

Prompt:
Design of sketchy logo featuring a knight in purple on a black background. Include texture as an additional design element. --v 5

Prompt:
Design of wild logo featuring a heart in multicolored on a red background. Include square as an additional design element. --v 5

Prompt:
Design of futuristic logo featuring a spaceship in white on a brown background. Include star as an additional design element. --v 5

Prompt:
Design of whimsical logo featuring a cat in silver on a gold background. Include diamond as an additional design element. --v 5

Prompt:
Design of vintage logo featuring a star in gray on a blue background. Include pattern as an additional design element. --v 5

Prompt:
Design of professional logo featuring a triangle in pink on a gold background. Include pattern as an additional design element. --v 5

Prompt:
Design of professional logo featuring a computer in blue on a yellow background. Include highlights as an additional design element. --v 5

Prompt:
Design of futuristic logo featuring a cat in purple on a gray background. Include hexagon as an additional design element. --v 5

Prompt:
Design of fancy logo featuring a galaxy in green on a gold background. Include pattern as an additional design element. --v 5

Prompt:
Design of futuristic logo featuring a zombie in green on a purple background. Include pattern as an additional design element. --v 5

Prompt:
Design of abstract logo featuring a skull in blue on a white background. Include highlights as an additional design element. --v 5

Prompt:
Design of playful logo featuring a bird in black on a black background. Include moon as an additional design element. --v 5

Prompt:
Design of watercolor logo featuring a circle in black on a purple background. Include geometric shapes as an additional design element. --v 5

现在,正如承诺的那样,这是我之前提到的超级棒的蓝图模板。使用这个家伙作为起点,并进行自定义以创建一个独一无二的标志:

Prompt Blueprint:

Design of [style风格] logo featuring a [symbol标志] in [color颜色] on a [background背景] background. Include [additional_element额外元素] as an additional design element.

这是一个Logo设计prompt的主要公式,使用下面的 YAML 内容替换方括号中的元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
style:  
- modern
- minimalist
- vintage
- retro
- fun
- futuristic
- abstract
- cartoon
- geometric
- hand-drawn
- typographic
- tribal
- text-based
- illustrative
- photorealistic
- 3D
- grunge
- sketchy
- watercolor
- comic
- cute
- fancy
- feminine
- masculine
- playful
- professional
- simple
- traditional
- trendy
- vibrant
- whimsical
- wild
symbol:
- star
- circle
- triangle
- square
- heart
- diamond
- moon
- hexagon
- leaf
- tree
- wave
- cloud
- sun
- skull
- deer head
- lion head
- bear head
- cat
- dog
- car
- train
- pizza
- coffee cup
- coffee bean
- cupcake
- ice cream cone
- computer
- phone
- camera
- book
- rocket
- airplane
- house
- castle
- sword
- crown
- flower
- bird
- fish
- butterfly
- dragon
- unicorn
- mermaid
- alien
- robot
- spaceship
- planet
- galaxy
- zombie
- ghost
- witch
- wizard
- knight
- princess
- queen
- king
- wheel
- gear
- clock
color:
- red
- orange
- yellow
- green
- blue
- purple
- pink
- brown
- black
- white
- gray
- silver
- gold
- multicolored
background:
- red
- orange
- yellow
- green
- blue
- purple
- pink
- brown
- black
- white
- gray
- silver
- gold
- multicolored
additional_element:
- gradient
- shadow
- border
- pattern
- texture
- geometric shapes
- lines
- curves
- highlights
- 3d effects
- star
- circle
- triangle
- square
- heart
- diamond
- moon
- hexagon

大家看到了吗!有了这些技巧、诀窍和超棒的蓝图,你就可以用Midjourney V5 AI图像生成器征服标志设计世界。记住,熟能生巧,所以不要害怕尝试并让你的创造力奔放!

但在你开始创作标志杰作之前,请帮我一个忙关注我的频道。我承诺会继续提供最新的技巧和诀窍,让您娱乐和知情。

愉快的设计,下次再见并保持好奇心!

作为对您耐心的小小奖励,这里有一个Python脚本,可以动态随机地创建标志提示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import random  
import yaml


def get_options(file_path):
with open(file_path, 'r') as file:
options = yaml.load(file, Loader=yaml.FullLoader)
return options

input_data = get_options('input.yaml')

command = input_data['command']
for key in input_data.keys():
if key != 'command':
command = command.replace(f'[{key}]', input_data[key][random.randint(0, len(input_data[key]) - 1)])

print(command)

关于Midjourney的其他文章:






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


TorchV AI支持试用!

如您有大模型应用方面的企业需求,欢迎咨询!



一分钟制作Chatgpt插件

员外注释:Wolfram的ChatGPT插件貌似是目前最好的几个ChatGPT Plugin之一,这篇文章从动手实现,到我意想不到的反向操作电脑(这还可以延伸到各类硬件),最后说原理,对于开发Plugin的开发者应该有一些帮助。

中文译文:ChatGPT的即时插件:介绍Wolfram ChatGPT插件套件

英文原文:Instant Plugins for ChatGPT: Introducing the Wolfram ChatGPT Plugin Kit

Instant Plugins for ChatGPT: Introducing the Wolfram ChatGPT Plugin Kit

在一分钟内构建一个新插件…

几周前,我们与OpenAI合作发布了Wolfram插件,使ChatGPT可以使用Wolfram语言和Wolfram|Alpha作为工具,在ChatGPT内部自动调用。可以将其视为向ChatGPT添加广泛的“计算超能力”,从而让它获得 Wolfram语言和Wolfram|Alpha中所有通用的计算功能和计算知识。

但是如果您想制作自己的特殊插件,进行特定的计算或者访问仅在您自己的电脑或电脑系统上可用的数据或服务怎么办呢?今天,我们发布了第一个版本的开发套件来实现这一点。借助整个Wolfram Language技术栈构建,并且我们已经成功地使整个过程变得非常简单——至少基本定制 ChatGPT 插件现在只需要不到一分钟就可以轻松部署。

需要进行一次(非常简单)设置-验证OpenAI身份并安装Plugin Kit。然后你就可以开始创建你的第一个插件。

要运行这里的示例,您需要:

  • 开发者可以访问ChatGPT的OpenAI插件系统

  • 可以访问Wolfram语言系统(包括免费的Wolfram Engine for Developers、Wolfram Cloud Basic等)

  • 您现在还需要使用PacletInstall[“Wolfram/ChatGPTPluginKit”]安装ChatGPT Plugin Kit(插件套件)。

这是一个非常简单的例子。假设你为一个单词创造了一个“强度”的概念,将其定义为“字母数字”的总和(“a”为1,“b”为2等)。在 Wolfram 语言中,您可以计算如下:

img

而且作为十多年来的标准,您可以立即将这样的计算部署为 Wolfram Cloud 中的 Web API——可通过 Web 浏览器、外部程序等立即访问:

img

但是现在有一种新的部署形式:作为ChatGPT的插件。首先,您需要获取插件工具包:

img

然后您就可以立即部署您的插件了。只需要:

img

最后一步是您需要告诉ChatGPT有关您的插件。在Web界面中(按照当前配置),选择“Plugins > Plugin store > Develop your own plugin”(“插件”>“插件商店”>“开发自己的插件”),并将来自ChatGPTPluginDeployment的URL插入到你的对话框中 (通过点击复制按钮获取 img) :

ChatGPT plugin dialog

现在一切准备就绪。您可以开始与ChatGPT谈论“单词强度”,它将调用您的插件(默认情况下称为“WolframCustom”)来计算它们:

img

展开这个对话气泡,可以了解ChatGPT与插件之间的通信:

img

没有插件,它就不知道“字母强度”是什么。但有了插件,它就能够做出各种(相当惊人的)事情——比如这样:

img

关于角马属性的修饰很迷人,但如果打开聊天气泡,就可以看到它是如何得出答案的——它只是开始尝试不同的动物(“狮子”,“斑马”,“角马”):

img

软件工程师会立即注意到,我们设置的插件正在本地主机上运行,也就是在您自己的计算机上执行。正如我们将要讨论的那样,这通常是一件非常有用的事情。但是您也可以使用Plugin Kit创建纯粹在Wolfram Cloud(或者阿里云/腾讯云/华为云…)中执行的插件(例如,您不必在计算机上安装Wolfram Engine)。

你所要做的就是使用ChatGPTPluginCloudDeploy——然后你会得到一个Wolfram Cloud中的URL,你可以告诉ChatGPT这个插件的位置:

img

实际上,您可以直接在网络浏览器中完成整个设置过程,无需进行任何本地 Wolfram 安装。只需在 Wolfram Cloud 中打开一个笔记本,并从那里部署您的插件即可:

Wolfram Cloud notebook

让我们来做一些其他的例子。接下来,让我们发明一个“地理影响圆盘(geo influence disks)”的概念,然后部署一个插件来呈现这样的东西(稍后我们将谈论一些正在进行的细节):

img

现在我们可以安装这个新插件,然后开始向ChatGPT询问“地理影响圆盘(geo influence disks)”:

img

ChatGPT 成功调用了插件,并返回了一张图片。有趣的是,它猜测(事实上是正确的)“地理影响圆盘”应该是什么意思。请记住,它无法看到图片或读取代码,因此它的猜测只能基于 API 函数名称和提出的问题。当然,在调用 API 函数时,它必须有效地理解至少一点内容——x 应该表示位置,而 radius 则表示距离。

再举个例子,我们来制作一个插件,可以向用户(即部署插件的人)发送短信:

img

现在只需要说“发送一条信息…”(“send me a message…”)

img

一条短信将会到达——在这种情况下,它还带有ChatGPT的小装饰:

Rhinoceros alert

这是一个插件,它还会发送提到的动物的“警报图片”:

img

是的,需要许多技术才能实现这一点:

img

Gnu alert

作为另一个例子,让我们创建一个插件来检索我的个人数据——这里是我在 Wolfram databin数据中积累了数年的心率数据:

img

现在我们就可以使用ChatGPT来对这些数据提出自己的问题了:

img

而且,如果安装了主要的Wolfram插件,我们可以通过ChatGPT的“语言用户界面”立即对这些数据进行实际计算:

img

这个例子使用了 Wolfram Data Drop 系统。但是,我们也可以用类似 SQL 数据库(关系型数据库)的东西来做同样类型的事情。如果你已经设置好插件以访问私有数据库,那么通过 ChatGPT 和 Wolfram 插件真正令人惊叹的事情就能够实现。

通过Plugins(插件)操控你的电脑

当您通过ChatGPT的标准Web界面使用它时,ChatGPT是在OpenAI的服务器上运行。但是,通过插件,您可以“回溯”——通过您的Web浏览器——以使事情发生在自己的本地计算机上。我们稍后将讨论这个“引擎盖下”的工作原理,但现在可以说一下:当您使用ChatGPTPluginDeploy(而不是ChatGPTPluginCloudDeploy)部署插件时,在插件中实际运行的Wolfram语言代码将在本地计算机上运行。因此,这意味着它可以访问计算机上的本地资源,如摄像头、扬声器、文件等。

例如,这里我正在设置一个插件来使用我的计算机摄像头拍照(使用 Wolfram 语言的 CurrentImage[ ] 函数)—然后将图片与我指定的任何颜色混合(我们稍后会讨论 CloudExport 的用法):

img

安装插件后,我对ChatGPT说:“想象一下我穿着绿色的衣服!”然后,ChatGPT会立即调用插件,让我的电脑拍摄我的照片,并将其与绿色混合(包括我的“我不知道这是否有效”的表情):

译者:这真的好吗???

img

好的,让我们尝试一个稍微复杂一些的例子。在这里,我们将创建一个插件来让ChatGPT在我的电脑上打开笔记本,并开始写入内容。为了实现这一点,我们将定义几个API端点(并将整个插件命名为“NotebookOperations”):

img

首先,让我们告诉ChatGPT创建一个新笔记本

img

然后在我的屏幕上弹出了一个新的笔记本:

My cat notebook

如果我们查看从中部署插件的 Wolfram 语言会话中的符号 nb,我们将发现它是由 API 设置的:

img

现在让我们使用其他的API端点向笔记本添加内容:

img

这就是我们可以获得的结果:

Cat pictures

这段文字是由ChatGPT编写的;图片则来自于网络图像搜索。 (我们也可以使用Wolfram语言中的新ImageSynthesize[]函数制作全新的猫咪图片。)

最后,让我们请ChatGPT展示一张用CurrentNotebookImage从电脑屏幕上捕捉到的笔记本截图:

img

我们还可以添加另一个端点,使用CloudPublish将笔记本发布到云中,并可能通过电子邮件发送URL。

我们可以将前面的示例视为在笔记本中累积结果。但是我们也可以只在Wolfram语言符号的值中累积结果。这里,我们将符号“result”初始化为空列表。然后,我们定义了一个API来附加到此列表,但是给出了提示,仅当有单词结果时才执行此附加操作:

img

让我们为ChatGPT设置一个“练习”:

img

此时,result仍为空:

img

现在让我们来问第一个问题:

img

ChatGPT并不会直接显示答案。但它会调用我们的API并将其附加到result中:

img

让我们来问问另一个问题:

img

现在 result 中包含了两个答案:

img

如果我们在笔记本中放置Dynamic[result],每当ChatGPT调用API时,我们会看到它动态地改变。

在最后一个例子中,我们从ChatGPT内部修改了符号的值。如果我们感觉勇敢,可以让ChatGPT评估计算机上的任意代码,例如使用调用ToExpression的API。但是,是的,赋予ChatGPT执行自己制作的任意代码的能力似乎会使我们面临某种“天网风险”(并使我们更加想知道“AI宪法”之类的事情)。

但比执行任意代码更安全的做法是让ChatGPT有效地“四处查找”我们的文件系统。让我们设置以下插件:

img

首先,我们设置一个要操作的目录:

img

现在让我们问ChatGPT关于那些文件:

img

使用 Wolfram 插件,我们可以让它制作这些文件类型的饼图:

img

现在我们要求它做一些非常“LLM-ey”的事情,并总结每个文件的内容(在API中,我们使用Import导入文件的纯文本版本):

img

还有很多事情可以做。这里有一个插件,可以计算从您的电脑到服务器的ping时间:

img

img

或者,作为另一个例子,您可以设置一个插件来创建定时任务,在指定的时间提供电子邮件(或短信等)提醒:

img

ChatGPT 负责认真排队任务:

img

然后,每隔大约10秒钟,我的邮箱里就会弹出一个(也许有些可疑的)动物笑话:

Animal jokes

最后一个例子,让我们考虑一下在我的电脑上播放曲调的本地任务。首先,我们需要一个能够解码音符并播放它们的插件(”ChatGPTPluginDeploy”用于告诉ChatGPT插件已经完成了工作——因为ChatGPT本身无法知道这一点):

img

在这里,我们给ChatGPT想要的音符——是的,这立即在我的电脑上演奏出来:

img

现在,作为对一位著名虚构人工智能的致敬,让我们尝试演奏另一首曲子:

img

是的,ChatGPT整理了一些笔记,并将它们打包到插件中;然后插件播放了它们:

img

依然可以运行:

img

但是…等一下!那是什么曲调?ChatGPT似乎还不能像HAL那样(可疑地)宣称:

“没有[HAL] 9000电脑曾经犯过错误或扭曲信息。按任何实际定义的词语,我们都是防错和无误的。“

说说工作原理【敲黑板】

我们现在已经看到了许多使用ChatGPT插件工具包的示例。但是它们是如何工作的?底层是什么?当您运行ChatGPTPluginDeploy时,实际上正在设置一个Wolfram语言函数,可以从ChatGPT内部调用该函数,以便在需要时使用。为了使这个过程顺利进行,需要使用Wolfram语言独特能力的广泛谱系,并与ChatGPT中某些“聪明”的功能相结合。

从软件工程角度来看,ChatGPT插件基本上就是一个或多个Web API(连同告诉ChatGPT如何调用这些API的“清单”)。那么如何在Wolfram语言中设置Web API呢?十年前我们发明了一种极其简单易行的方法。

像Wolfram语言中的所有内容一样,Web API也由符号表达式表示,在这种情况下形式为APIFunction[…]. 那么APIFunction里面有什么呢?其中有两个部分:一段实现所需功能的Wolfram Language代码和规范说明,在将字符串传递给APIFunction之前应该如何解释这些字符串(例如来自Web API)。

以下是一小段 Wolfram Language 代码, 在此案例中用于否定颜色并使其变浅: =>

img

如果我们愿意,我们可以将其重构为一个应用于两个参数的“纯函数”:

img

纯函数本身只是一个符号表达式,它会被计算为其自身:

img

如果需要的话,我们可以给纯函数的参数命名,并将它们与其名称作为键一起提供到一个关联 (img) :

img

但是假设我们想要从 Web API 调用我们的函数。Web API 中的参数始终为字符串。那么,如何将字符串(例如“lime green”)转换为 Wolfram 语言可以理解的符号表达式呢?好吧,我们必须使用 Wolfram 语言的自然语言理解能力。

以下是一个示例,其中我们正在说希望将字符串解释为颜色:

img

那个颜色样本到底是什么?就像 Wolfram 语言中的其他所有内容一样,它只是一个符号表达式:

img

好的,现在我们准备将所有内容打包成APIFunction。第一个参数表示我们要表示的API有两个参数,并描述了我们希望如何解释这些参数。第二个参数给出了实际的Wolfram语言函数,该API计算它们。单独使用,APIFunction只是一个符号表达式,其本身就可以评估:

img

但如果我们为参数提供值(这里使用关联),它将被计算:

img

目前,所有这些都只是在我们的 Wolfram 语言会话中发生。但要获得实际的 Web API,我们只需“云部署”APIFunction

img

现在我们可以从Web浏览器中调用此Web API:

Web API

是的,那就是符号表达式的结果。如果我们想要一些可视化的东西,我们可以告诉APIFunction将其结果作为PNG输出:

img

现在它将显示为网络浏览器中的图像:

Purple box in web browser

(请注意,CloudDeploy 部署的 Web API 默认情况下权限设置为只有我可以运行。如果使用 CloudPublish,则任何人都可以运行它。)

好的,那么我们如何设置我们的 Web API 以便作为 ChatGPT 插件调用呢?一个直接的问题是,在最简单的级别上,ChatGPT 只处理文本,因此我们必须将结果转换为文本。所以让我们进行一些 Wolfram 语言编程来实现这个目标。以下是 Wolfram 知识库中常见颜色值和名称列表:

img

当然,我们也知道许多其他命名颜色的集合,但在这里不必担心它们:

img

现在我们可以使用Nearest函数来找到最接近我们所得颜色的常见颜色:

img

现在让我们将其放入APIFunction中(这里我们已经“图标化”了颜色列表;我们也可以定义一个单独的函数来查找最近的颜色,它会自动随CloudDeploy一起带来):

img

现在我们已经准备好使用ChatGPTPluginDeploy了。 ChatGPT插件的工作方式是,我们必须为与我们的API对应的“端点”命名。 这个名称以及我们在API中用于参数的名称将被ChatGPT用来确定何时以及如何调用我们的插件。 但在这个例子中,我们只想为端点使用某种唯一名称,这样我们就可以在聊天中引用它而不会让ChatGPT将其与其他内容混淆。 所以让我们称之为ColorMangle。 现在让我们进行部署:

img

到目前为止,我们关于APIFunction及其调用的所有内容在ChatGPTPluginDeploy和ChatGPTPluginCloudDeploy中都是相同的。但接下来要说的就不同了。因为ChatGPTPluginDeploy设置API函数在本地计算机上执行,而ChatGPTPluginCloudDeploy则将其设置为在Wolfram Cloud(或Wolfram Enterprise Private Cloud等)上运行。

本地部署和云端部署都有优缺点。在本地运行可以让您获得计算机的本地功能,如相机、文件系统等。在云端运行则允许其他人也能运行您的插件(但目前除非您将插件注册到OpenAI,否则一次只有有限数量的人能安装您的插件)。

好吧,让我们来谈谈本地插件部署。ChatGPTPluginDeploy 在您的计算机上有效地设置了一个最小化 Web 服务器(使用10行 Wolfram 语言代码实现),在 ChatGPTPluginDeploy 选择的端口上运行,并且每当它收到对 API URL 的请求时调用 Wolfram 引擎与您的 API 函数进行交互。

这是 ChatGPTPluginDeploy 正在使用的操作系统套接字(是的,Wolfram 语言将套接字——像其他所有东西一样——表示为符号表达式):

img

好的,但是ChatGPT怎么知道你的API呢?首先,您需要通过ChatGPT UI的 Plugins > Plugin store > Develop your own plugin(插件>插件商店>开发自己的插件)告诉它您正在使用的端口。您可以通过单击ChatGPTPluginDeployment对象中的 img 图标或以编程方式找到端口:

img

您输入此URL,然后告诉ChatGPT“查找清单文件”:

Find manifest file

让我们看一下它找到了什么:

img

这是一个“清单”,它告诉插件安装程序的相关信息。我们没有指定太多内容,所以大部分都是默认值。但清单中重要的一部分是提供API规范URL的部分:http://localhost:59353/.well-known/openapi.json

访问该URL后,我们可以找到这个“OpenAPI规范”:

Validated OpenAPI spec

最后,点击Install localhost plugin,该插件将出现在您的ChatGPT会话中已安装插件列表中

img

当ChatGPT启动时安装了插件,它的“系统提示”中会包含一个额外的部分,让它可以“学习”如何调用该插件:

System prompt

现在我们可以开始使用这个插件了:

img

是的,它有效。但这里有一些魔法。ChatGPT不得不“拆开”我们所要求的内容,意识到API端点称为ColorMangle是相关的,然后确定其颜色参数应该是“青柠绿”,级别应该是“0.5”。打开盒子,我们可以看到它所做的:

img

现在我们可以开始在其他地方使用“颜色混合”——尽管ChatGPT急于告诉我们,“颜色混合”是一种“虚构的操作”,可能是为了避免被指责不尊重某个国家的旗帜颜色:

img

在我们处理的这个案例中,ChatGPT成功地将文本片段正确“连接”到API中的适当参数。而且它是从我们为参数使用的名称(以及我们给出的端点名称)所获得的信息碎片中实现了这一点(相当惊人)。

但有时候我们需要告诉它更多信息,我们可以通过在ChatGPTPluginDeploy内指定插件提示来实现:

img

现在我们不仅需要谈论颜色:

img

起初,它没有成功地“解开”“冰岛的颜色”,但后来它纠正了自己,并得到了答案。(是的,如果我们写一个更好的提示,也许我们本可以避免这种情况。)

实际上,您可以提供多个级别的提示。您可以为整个插件包括一个相当长的提示。然后,您可以为每个单独的API端点提供较短的提示。最后,您可以通过将“color”→ “Color”替换为类似于以下内容来帮助ChatGPT解释API中单个参数:

img

当您设置插件时,它可以包含许多端点,执行不同的操作。此外,在共享提示之外,这特别方便的原因之一是(出于安全原因),任何给定子域只能有一个关联的插件。因此,如果想要具有各种功能,则必须通过使用不同的端点来实现。

对于ChatGPTPluginCloudDeploy,每个子域仅限一个插件意味着任何给定用户一次只能部署一个云插件。但对于本地插件规则略有不同,并且ChatGPTPluginDeploy可以通过在不同端口上运行它们来部署多个插件-事实上,默认情况下ChatGPTPluginDeploy每次调用时都会选择随机未使用的端口。

但是本地插件如何工作?它如何“回到”您的计算机?魔法基本上发生在ChatGPT Web前端中。所有插件工作方式都是当将要调用该插件时,LLM逐标记生成过程停止,并且“外循环”的下一个动作是调用该插件-然后将其提供给LMM在下一步中将添加到字符串中。好吧,在本地插件的情况下,“外循环”使用聊天窗口前端中JavaScript向指定了localhost 端口 的计算机发送请求。(顺便说一下,一旦ChatGPTPluginDeploy打开端口,它将保持打开状态,直到您在其套接字对象上明确调用Close。)

当使用本地插件时,它们在部署插件的Wolfram语言会话中运行其Wolfram语言代码。这意味着例如(如我们在某些情况下看到的那样),设置的值在进行另一个调用时仍然存在。

在云中,它不会立即以这种方式工作,因为每个API调用实际上是独立的。但是可以轻松地将状态保存在云对象中(例如使用CloudPutCloudExpression等)以便可以跨多个API调用具有“持久性内存”。

ChatGPT内部的LLM(目前)仅设置为处理文本。那么图像怎么办?好吧,插件可以将它们放入Wolfram Cloud中,并将其URL传递给ChatGPT。 ChatGPT已经设置能够直接呈现特定类型的东西-如图像。

因此-正如我们上面所看到的-要从插件“输出”图像(或几个图像),我们可以使用CloudExport将每个图像放入云对象中,在PNG格式中进行操作。然后ChatGPT可能需要一些提示来显示嵌入式输出中的图片。

部署Wolfram Language插件于ChatGPT中存在一些稍微棘手的“管道”,其中大部分在ChatGPTPluginDeployChatGPTPluginCloudDeploy中自动处理。但是通过基于Wolfram语言的基本符号结构(及其集成部署功能)来构建,可以非常简单地为ChatGPT创建复杂的自定义Wolfram语言插件,并为LLM和Wolfram语言周围不断发展的生态系统做出贡献。






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


TorchV AI支持试用!

如您有大模型应用方面的企业需求,欢迎咨询!



适合全栈工程师的7个网页设计技巧

这是一篇帮助非专业网页设计师快速改善设计感的文章,7个设计技巧,对于全栈工程师也是非常有用的。

这里是原文链接

每个网页开发者都不可避免地会遇到需要做出视觉设计决策的情况,无论他们是否喜欢。

也许你所在的公司没有全职设计师,需要自己实现新功能的用户界面。或者你正在进行一个副业项目,并且想要它看起来比其他基于Bootstrap的网站更好。

很容易就会放弃并说:“我永远无法做出好看的东西,我不是艺术家!”但事实证明,有很多技巧可以提升你的工作水平,而这些技巧并不需要具备图形设计背景。

以下是七个简单的想法,可以用来改善你今天的设计。

1.使用颜色和粗细来创建层次结构,而不是字体大小

1_KYZikUrx9F02cJU9kpn_gQ

在设计 UI 文本时,常见的错误是过度依赖字体大小来控制层次结构。

“这段文本重要吗?让它变大一点。”

“这段文本次要吗?让它变小一点。”

与其完全依靠字体大小,不如尝试使用颜色或者字重来完成同样的工作。

“这段文本重要吗?让它加粗。”

“这段文本次要吗?用浅色调。”

尽量只使用两到三种颜色:

  • 一个深(但不是黑)的颜色用于主内容(例如文章标题)
  • 一个灰色用于辅助内容(例如文章发布日期)
  • 一个浅灰色用于附属内容(例如页脚版权声明)

1_2YuCOOCjdMEJxg-Lb6G2FA

同样,对于 UI 设计工作来说,通常只需要两种字重:

  • 大多数文本使用普通字重(400 或 500,具体取决于字体)
  • 强调文本使用较粗的字重(600 或 700)

1_AHrVF0vTtj-yoyhmBNHNLA

在 UI 设计中避免使用小于 400 的字重;它们可以用于大标题,但在较小的尺寸下阅读起来太困难。如果您考虑使用较轻的字重来弱化某些文本,请改用较浅的颜色或更小的字号。

2.不要在有色背景上使用灰色文字

1_ajjrhpp-l3GDG7ne7Am8fw

将文本变成浅灰色是在白色背景下减弱其重要性的好方法,但在有色背景上看起来并不那么好。

这是因为我们实际上看到的效果是灰色对白色的对比度降低了。

让文本更接近背景颜色才能帮助创建层次结构,而不是使它变成浅灰色。

1_CNaej5BrPr9lWTMAfllfdw

当你在使用色彩丰富的背景时,有两种方法可以降低对比度:

1.降低白色文本的不透明度

使用白色文本并降低不透明度。这样可以让背景颜色透过一点,以某种方式减弱文本与背景之间的冲突。

1_OMntEW2V5jPXrZR6CjrBFQ

2.根据背景颜色手动选择一种颜色

当你的背景是图像或图案时,这比降低不透明度更有效;或者当降低不透明度会使文本感觉过于沉闷或褪色时。

1_OMntEW2V5jPXrZR6CjrBFQ

选择与背景相同色调的颜色,通过调整饱和度和亮度使其看起来合适。

3.Offset阴影

1_LisFGBtYOvR-3cwFTzTDUw

不要使用大的模糊和扩散值来使盒子阴影更加明显,而是添加垂直偏移。

这样看起来更自然,因为它模拟了一个从上方照射下来的光源,就像我们在现实世界中习惯看到的那样。

这也适用于内部阴影,例如您可能会在井或表单输入上使用:

1_qWSsYovqBDKF87f1IVMHsQ

如果你对阴影设计感兴趣,Material Design指南是一个很好的入门材料。

4.使用更少的边框

1_fNm6hXxnBvIcHGp9DQRdRQ

当你需要在两个元素之间创建分隔时,尽量不要立即使用边框。

虽然边框是区分两个元素的好方法,但它们并不是唯一的方法。过多地使用边框会让你的设计感觉繁忙和杂乱。

下次当你想要使用边框时,可以尝试以下这些替代方案:

1.使用盒子阴影

盒子阴影可以很好地勾勒出像边框一样的元素,但更加微妙,并且能够达到相同的目标而不会分散注意力。

1_Pm5PyS0vZ65GuGu8erPRfA

2.使用两种不同的背景

给相邻的元素略微不同的背景颜色通常就足以区分它们。如果您已经使用了不同的背景颜色,另外还加上了边框,请尝试去掉边框;也许您并不需要它。

1_9j89WYXMqsnb_A1v8heXaw

3.添加额外的间距

有什么比增加元素之间的距离更好的方法来创建分隔呢?将事物彼此拉得更远是一种非常好的方式,可以在不引入任何新UI的情况下创建元素组之间的区别。

1_7CEsoYdtFPjMBqpDB58HqQ

5.不要把本来应该很小的图标放大

1_57g05Gl-FjDtcCUtaPPOLw

如果你正在设计一些需要大图标的东西(比如一个落地页的“特性”部分),你可能会本能地选择免费的图标集,例如 Font Awesome 或 Zondicons,并将它们的大小增加到符合你的需求。

毕竟,它们是矢量图像,所以如果你增加了它们的尺寸,质量不会受到影响,对吧?

虽然矢量图像确实不会因为尺寸变大而降低质量,但是那些在 16-24 像素下绘制的图标,在放大到原来大小的 3 倍或 4 倍时永远都不会看起来很专业。它们缺乏细节,并且总是感觉过于“粗壮”。

3icons1

如果你只有小图标,可以尝试将它们放在另一个形状内,并给该形状添加背景色:

3icons2

这样可以让您保持实际图标更接近其预期大小,同时填充更大的空间。

如果您有预算,还可以使用专为较大尺寸设计的高级图标集,例如HeroiconsIconic

6.使用重音符号边框为平淡的设计增添色彩

6-1

如果你不是一名平面设计师,那么如何为你的用户界面增添视觉上的吸引力呢?

一个简单的技巧就是在原本感觉有些单调的界面部分添加彩色边框。

例如,在警告信息旁边加上一条彩色边框:

6-01

或者用于突出显示活动导航项:

6-02

甚至可以跨越整个布局的顶部:

6-03

在UI中添加一个彩色矩形并不需要任何平面设计技能,但它可以大大提升你的网站的“设计感”。

挑选颜色有困难吗?试试从像Dribbble这样受限调色板中选择颜色,以避免被传统调色板无尽可能性所压倒。

7.并非每个按钮都需要有背景颜色。

7-1

当页面上有多个用户可以执行的操作时,很容易陷入仅基于语义设计这些操作的陷阱。

像Bootstrap这样的框架在您添加新按钮时会提供一系列语义样式可供选择,从而鼓励了这种行为:

7-2

“这是一个积极的操作吗?把按钮变成绿色。”

“这会删除数据吗?把按钮变成红色。”

语义是按钮设计中重要的一部分,但有一个更重要的维度经常被忽视:层次结构。

页面上的每个操作都处于一个重要性金字塔中。大多数页面只有一个真正的主要操作,几个不太重要的次要操作和几个很少使用的第三级操作。

在设计这些动作时,重要的是传达它们在层次结构中所处的位置。

  • 主要操作应该显而易见。在这里,实心、高对比度的背景颜色效果非常好。
  • 次要操作应该清晰但不突出。轮廓样式或低对比度的背景颜色是很好的选择。
  • 第三级操作应该可以被发现但不会打扰用户。将这些操作设计成链接通常是最好的方法。

7-3

破坏性的操作呢,它们不应该总是红色吗?

并非如此!如果破坏性操作不是页面上的主要操作,则最好将其作为次要或第三按钮处理。

7-4

将大号、红色和加粗的样式保留给那些在界面中作为主要操作的负面行为,例如确认对话框:

7-5






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


TorchV AI支持试用!

如您有大模型应用方面的企业需求,欢迎咨询!



HuggingFace Transformers Agent介绍

本文比较了HuggingFace出品的Transformers Agent与LangChain Agent。

原文链接:Hugging Face Transformers Agent 作者:Sophia Yang。

还有一个Youtube视频,如果可以看且英文尚可的朋友可以直接看,视频更清楚。

以下为翻译正文:


就在两天前,Hugging Face发布了Transformers Agent——一款利用自然语言从精选工具集中选择工具并完成各种任务的代理。这听起来很熟悉吧?没错,它与LangChain Tools和Agents非常相似。在本篇博客文章中,我将介绍Transformers Agent以及与LangChain Agent的比较。

Transformers Agents是什么?

简而言之,它在transformers的基础上提供了一个自然语言API:我们定义了一组策划工具并设计了一个代理来解释自然语言并使用这些工具。

我可以想象HuggingFace的工程师们会这样说:我们在HuggingFace上托管了许多令人惊叹的模型。我们能否将它们与LLMs集成?我们能否使用LLMs来决定使用哪个模型、编写代码、运行代码并生成结果?基本上,没有人需要再学习所有复杂的任务特定模型了。只需给出一个任务,LLMs(代理)就会为我们完成一切。

下面是所有步骤:

img

来源: https://huggingface.co/docs/transformers/transformers_agents

  • Instruction:用户提供的prompt
  • Prompt:一个带有具体指令的提示模板,其中列出了多个可用工具
  • Tools:经过筛选的转换器模型,例如Flan-T5用于问答
  • Agent:一个LLM解释问题、决定使用哪些工具,并生成代码以使用这些工具执行任务
  • 受限制的Python解释器:执行Python代码

它是如何工作的?

Step 1: 实例一个agent.

第一步是实例化一个agent。agent只是一个LLM,可以是OpenAI模型、StarCoder模型或OpenAssistant模型。

使用OpenAI模型需要OpenAI API密钥,并且使用不免费。我们从HuggingFace Hub加载StarCoder模型和OpenAssistant模型,这需要HuggingFace Hub API密钥并且免费使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from transformers import HfAgent

# OpenAI
agent = OpenAiAgent(model="text-davinci-003", api_key="<your_api_key>")

from transformers import OpenAiAgent
from huggingface_hub import login
login("<YOUR_TOKEN>")

# Starcoder
agent = HfAgent("https://api-inference.huggingface.co/models/bigcode/starcoder")

# OpenAssistant
agent = HfAgent(url_endpoint="https://api-inference.huggingface.co/models/OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5")

Step 2: 运行agent.

agent.run是一种单次执行方法,可以自动选择任务所需的工具,例如,选择图像生成器工具来创建图像。

img

agent.chat 保留聊天记录。例如,在这里,它知道我们之前生成了一张图片,并且可以转换图像。

img

和LangChain Agent有什么不同?

Transformers Agent仍处于实验阶段。它的范围更小,灵活性较低。目前Transformers Agent的主要重点是使用Transformer模型和执行Python代码,而LangChain Agent则“几乎”可以完成所有任务。让我们分解一下比较Transformers和LangChain Agents之间不同组件:

工具集(Tools)

  • HuggingFace Transfomers Agent 拥有一个惊人的工具列表,每个工具都由Transformer模型驱动。这些工具提供了三个重要优势:
    • 1)尽管Transformers Agent目前只能与少数几个工具交互,但它有潜力与超过100,000个HuggingFace模型进行通信。它拥有完整的多模态功能,包括文本、图像、视频、音频和文档;
    • 2)由于这些模型是专门为特定任务而构建的,因此利用它们可能比仅依赖LLMs更直接,并且可以产生更准确的结果。例如,我们可以简单地部署BART来执行文本分类而不是设计LLM的提示来执行该任务;
    • 3)这些工具解锁了LLMs无法完成的功能。以BLIP为例,它使我们能够生成引人入胜的图像标题——这是LLMs所不能做到的。.
  • LangChain工具都是外部API,例如Google搜索、Python REPL。实际上,LangChain通过load_huggingface_tool函数支持HuggingFace工具。LangChain已经可以完成Transformers Agent所能做的一切。另一方面,Transformers Agents也有可能整合所有的LangChain工具。.
  • 在这两种情况下,每个工具都只是一个Python文件。您可以在此处找到Hugging Face Transformers Agent工具的文件,以及LangChain工具的文件。正如您所看到的,每个Python文件包含一个表示一个工具的类。

Agent

  • HuggingFace Transformers Agent使用此提示模板根据工具的描述确定要使用哪个工具。它会要求LLM提供解释,并在提示中提供一些few-shot学习示例。
  • LangChain默认使用ReAct框架来确定基于工具描述要使用哪个工具。该框架在这篇论文中有所描述。它不仅可以做出决策,还提供思考和推理,类似于Transformers Agent使用的解释方式。此外,LangChain有四种代理类型

自定义Agent

在这两种情况下,创建自定义代理并不太困难::

  • 请查看此 Colab 结尾处的 HuggingFace Transformer Agent 示例。
  • 在这里查看LangChain的示例

“Code-execution”

  • Hugging Face Transformers Agent在LLM选择工具并生成代码后,将“代码执行”作为其中一步。这限制了Transformers Agent的目标仅限于执行Python代码。
  • LangChain包括“代码执行”作为其工具之一,这意味着执行代码不是整个过程的最后一步。这提供了更多灵活性,可以根据任务目标来决定如何使用它:可以执行Python代码,也可以像进行Google搜索并返回搜索结果等其他操作。.

结论

在这篇博客文章中,我们探讨了Hugging Face Transformers代理的功能,并将其与LangChain代理进行了比较。我期待着在Transformers代理方面看到更多的发展和进步。

. . .

By Sophia Yang on May 12, 2023

Sophia Yang 是一位高级数据科学家。欢迎在领英推特YouTube上关注她,并加入DS/ML读书俱乐部❤️。






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


TorchV AI支持试用!

如您有大模型应用方面的企业需求,欢迎咨询!