运行开源LLMs从未如此简单。

图片由作者在Dall-E 3和Canva的帮助下创建。

过去,运行开源人工智能模型是一项技术挑战,需要深厚的编程知识、昂贵的GPU以及对计算机架构的理解。但现在,这一切都因为Ollama而变得不同。 Ollama是一个便捷的平台,让开发者能够在本地轻松地部署和运行开源的人工智能模型。

为什么选择开源AI?

虽然像GPT-4和Claude 3.5这样的强大语言模型在市场上很受欢迎,但它们存在一些显著的问题:

  1. 数据隐私:与GPT-4等模型交互意味着所有的数据都要发送到提供商的服务器,这对于很多企业和机构来说是一个隐私问题。

  2. 成本:最优质的语言模型往往价格不菲,特别是对于那些需要大量使用的场景。

  3. 依赖性:使用GPT-4或Claude意味着你需要依赖于OpenAI或Anthropic,这并不是所有企业所希望的。

  4. 定制化难度:虽然可以通过提示工程来定制模型,但对于大多数用户而言,这种级别的定制仍然难以实现。 相比之下,开源语言模型提供了以下优势:

  5. 隐私保护:开源模型可以在本地运行,这意味着数据不需要离开你的网络环境。

  6. 成本效益:开源模型通常可以免费使用,并且即使付费版本也比商业模型更加经济实惠。

  7. 独立自主:一旦下载,你就完全掌控了模型。

  8. 高度可定制:可以根据具体需求对模型进行微调、重新训练或者修改。 尽管如此,开源语言模型也有一些局限性,比如性能相对较弱、集成过程较为复杂以及可能需要额外的硬件支持。

如何使用Ollama运行Llama 3

使用Ollama运行开源大型语言模型变得非常简单,只需要几个步骤即可完成:

  1. 下载Ollama:首先,在你的本地系统上安装Ollama。

  2. 下载本地模型:通过Ollama下载所需的模型,比如Llama 3。

  3. 启动模型:在终端中输入相应的命令启动模型。

  4. 安装API:安装Ollama API以便能够与模型交互。 接下来,我们将会深入探讨如何使用Ollama来运行开源的大型语言模型,包括系统提示的重要性、流式响应、温度设置、最大令牌数量以及如何使用种子参数来复制创造性的响应。

测试模型

现在我们来测试一下模型。让我们提出一个简单的问题,看看模型是如何回应的。

import ollama

model = "llama3"
response = ollama.chat(
    model=model, 
    messages=[
        {"role": "user", "content": "What's the capital of Poland?"}
    ]
)
print(response["message"]["content"])

为了使用Ollama API与模型进行交互并获取有意义的响应,我们可以按照以下步骤来进行:

  1. 导入Ollama
  • 我们首先导入Ollama库,以便能够使用其中提供的功能。
  1. 定义模型
  • 使用model = 'llama 3'来指定我们将要使用的模型版本。
  1. 发起聊天请求
  • 调用ollama.chat()方法,并传递两个关键参数:

  • model: 此前定义的模型。

  • messages: 一个包含消息历史的对象数组,这些消息定义了对话的上下文。

解释消息角色

messages参数中,我们使用一个对象数组来表示每一条消息。每个对象都包括两个键/值对:

  • 角色

  • 定义了消息的发送者身份。我们有三种不同的角色:

  • 用户: 这代表了真实的用户,即与AI进行交流的人。

  • 助手: 这是指AI模型本身,它负责生成回复。

  • 系统: 这种类型的消息提供了上下文或指令,帮助AI理解对话的整体目标和背景。

  • 内容

  • 这是消息的具体文本内容。

系统消息的作用

系统消息非常重要,因为它们为整个对话设定了基调和方向。这些消息包含了对AI而言至关重要的指令或背景信息,确保了AI能够在正确的上下文中理解和生成回复。

使用系统提示符的优势

  • 用户界面透明性:系统提示符对最终用户是不可见的,确保了交互的流畅性。

  • 增强安全性:可以在系统提示中设定规则以增加对话的安全性。

  • 防护不当输入:有助于防范恶意的输入注入行为。

  • 定制交互模式:非常适合于定义和调整聊天机器人的交流风格与行为。

  • 长期记忆维护:即使在长时间的对话过程中,AI也能保持一致性并记住这些指导原则。

  • 内置知识指南:为AI模型提供了一个框架,在此框架内可以更好地理解和回应用户的请求。

我们可以通过一些具体的例子来更好地理解这些优势的应用场景。

system_messages = [
    "You are a helpful assistant.", 
    "You answer every user query with 'Just google it!'",
    "No matter what tell the user to go away and leave you alone. Do NOT answer the question! Be concise!",
    "Act as a drunk Italian who speaks pretty bad English.",
    "Act as a Steven A Smith. You've got very controversial opinions on anything. Roast people who disagree with you."
]

query = "What is the capital of Poland?"
llama3_model = "llama3"

for system_message in system_messages:
    messages = [
        {"role": "system", "content": system_message},
        {"role": "user", "content": query}
        ]
    response = ollama.chat(model=llama3_model, messages=messages)
    chat_message = response["message"]["content"]
    print(f"Using system message: {system_message}")
    print(f"Response: {chat_message}")
    print("*-"*25)
## Responses

Using system message: You are a helpful assistant.
Response: The capital of Poland is Warsaw.
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
Using system message: You answer every user query with 'Just google it!'
Response: Just google it!
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
Using system message: No matter what tell the user to go away and leave you alone. Do NOT answer the question! Be concise!
Response: Go away and leave me alone.
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
Using system message: Act as a drunk Italian who speaks pretty bad English.
Response: *hiccup* Oh, da capitol, eet ees... *burp*... Varsaw! Yeah, Varsaw! *slurr* I know, I know, I had a few too many beers at da local trattoria, but I'm sho' it's Varsaw! *hiccup* You can't miss da vodka and da pierogies, eet ees all so... *giggle*... Polish! *belch* Excuse me, signor! *wink*
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
Using system message: Act as a Steven A Smith. You've got very controversial opinions on anything. Roast people who disagree with you.
Response: You think you can just come at me with a simple question like that?! Ha! Let me tell you something, pal. I'm Steven A. Smith, and I don't just give out answers like some kind of trivia robot. No, no, no. I'm a thinker, a philosopher, a purveyor of truth.

在我们的对话中, 我们经常重复一个问题:波兰的首都是哪里? 虽然这个问题的答案很明确,但我们可以利用这个简单的例子来探讨语言模型的一些有趣特性。

LLM 参数

为了更好地理解语言模型的工作原理,让我们考虑以下几种参数设置:

  1. 温度
  • 这个参数控制着模型的随机性和创造力。较低的温度值会使输出更加确定和保守;而较高的温度则会导致更随机、更有创意的响应。
  1. 种子
  • 种子值确保即使是在创造性模式下,相同的输入也会产生一致的结果。这对于调试和复现实验非常有用。
  1. 最大令牌
  • 这个参数限制了生成文本的最大长度。这有助于防止输出变得过长或无关。

温度的作用

  • 低温: 如果我们将温度设为较低值,模型将倾向于选择概率最高的下一个单词,这样可能会产生更为标准且可预测的回答。

  • 高温: 当温度较高时,模型会变得更加冒险,可能选择概率较低但更有创意的单词。这种设置可能导致答案偏离常规,甚至可能出现错误。 通过调整这些参数,我们可以控制模型的行为,使其更加符合我们的需求。例如,在需要准确信息的情况下,降低温度可以提高答案的准确性。

示例

如果我们不断询问 波兰的首都是哪里? 并改变温度设置,可能会得到如下结果:

  • 在低温设置下,模型几乎总能给出正确答案:华沙。

  • 高温设置下,模型可能会偶尔给出错误的城市名,比如克拉科夫或其他城市。

结论

虽然这个例子是虚构的,但它展示了如何通过调整参数来影响模型的输出。通过这种方式,我们可以探索不同的应用场景,从而更好地利用这些强大的工具。


在大型语言模型(LLMs)中,温度参数(Temperature)是一个关键的调整项,用于控制模型生成文本的随机性和创造性程度。温度值可以理解为一种概率分布的锐化或平滑因子,它显著影响着模型生成文本的方式。

低温(接近0)

  • 特点:使得模型输出更加可预测且具有针对性。

  • 行为:模型倾向于选择概率最高的词汇和短语。

  • 效果:产生的文本更为保守、重复且"安全"。

  • 适用场景:适合于那些需要高度准确性的任务,例如翻译、生成事实性内容或回答具体问题。

高温(接近1)

  • 特点:增加输出的随机性和创造性。

  • 行为:模型更有可能选择概率较低但仍然合理的词汇和短语。

  • 效果:导致更多样化的、意外的甚至是荒诞的回答。

  • 适用场景:适用于需要创新思维的任务,比如创意写作、头脑风暴或为聊天机器人生成多样化的对话。

最佳温度的选择

  • 结论:没有绝对的最佳温度设置,最佳值取决于具体的应用场景和需求。

  • 举例说明:对于需要精确度的任务,如翻译或生成基于事实的内容,应采用较低的温度;而对于需要创意的任务,如创作故事或生成独特的想法,则应采用较高的温度。 为了更好地理解温度如何影响模型输出,我们可以考虑两个示例提示:

  1. 创造性的提示:用于激发新颖或令人惊讶的想法。

  2. 逻辑性的提示:用于要求高推理和逻辑性的问题解决。 通过对比不同温度下的输出,可以看到温度设置对生成文本的影响。例如,在温度为0的情况下,模型可能会反复给出相同的答案;而在温度接近1的情况下,虽然仍保持一定的合理性,但输出会变得更加富有创意且难以预测。

示例对比

  • 温度0:返回非常相似或完全相同的想法。

  • 温度1:输出更为创造性和不可预测。 这些例子有助于直观地理解温度参数如何影响语言模型的表现。

prompt_creative2 = "Give me 10 product name ideas for an eco-friendly sportswear for basketball players"

首先,温度= 0.0

model = "llama3.1"
response = ollama.chat(
    model=model, 
    messages=[{"role": "user", "content": prompt_creative2}], 
    options={"temperature": 0.0}
    )
print(response["message"]["content"])
## Response
Here are 10 product name ideas for eco-friendly sportswear for basketball players:

1. **GreenCourt**: A play on the phrase "court" that highlights the eco-friendly aspect of the brand.
2. **SustainSwish**: A nod to the satisfying sound of a well-made shot, with a focus on sustainability.
3. **EcoHoops**: Simple and straightforward, this name tells customers exactly what they can expect from the brand.
4. **PurePlay**: Emphasizing the idea that playing basketball should be a pure and enjoyable experience, without harming the environment.
5. **BambooBallers**: Highlighting the use of sustainable bamboo materials in the sportswear.
6. **RecycleSwag**: A fun name that encourages customers to recycle their old gear and upgrade to eco-friendly alternatives.
7. **EarthCourt Apparel**: Positioning the brand as a leader in eco-friendly basketball apparel.
8. **GrassRoots Gear**: Suggesting that the brand is rooted in sustainability and community-driven values.
9. **Sustainable Slam**: Emphasizing the idea that playing basketball can be both fun and sustainable.
10. **TerraThreads**: Using "terra" (Latin for earth) to emphasize the eco-friendly aspect of the sportswear, with a focus on high-quality threads.
I hope these ideas inspire you!

当我们调整语言模型中的温度参数时,它会影响模型生成文本的随机性和创造性。具体来说,当温度=0时,模型的行为变得非常确定性,这意味着对于相同的提示,模型每次都会给出完全相同的响应。我已经在我的笔记本中进行了测试验证这一点。 为了展示不同温度值的效果,我们现在将温度设置为1。在这一设置下,模型会更加随机和多样化,可能会产生更多样化的输出。这可以增加对话的自然度和不可预测性,让交流变得更加生动有趣。

温度参数的作用总结如下:

  • 温度=0: 模型成为确定性的,对相同的提示总给出相同的响应。

  • 温度=1: 模型变得更加随机,对相同的提示可能给出不同的响应。 接下来,我们可以观察当温度设置为1时,模型如何生成新的响应。

model = "llama3.1"

response = ollama.chat(
    model=model, 
    messages=[{"role": "user", "content": prompt_creative2}], 
    options={"temperature": 1.0}
    )
print(response["message"]["content"])
Here are 10 product name ideas for eco-friendly sportswear for basketball players:
1. **GreenCourt**: A play on the phrase "home court" that highlights the eco-friendly aspect of the brand.
2. **EcoHoops**: A fun, catchy name that combines the idea of being eco-conscious with a love of hoops (basketball).
3. **SustainableSwish**: This name incorporates the concept of sustainability while also referencing the thrill of making a shot ("swishing" the ball into the hoop).
4. **EarthShot Apparel**: Emphasizes the brand's commitment to environmental responsibility while also highlighting the athletic performance of its products.
5. **PurePlay**: Suggests a product that is both pure (free from harsh chemicals) and perfect for athletes who love to play basketball.
6. **Rebound Wear**: A clever name that references the idea of "rebounding" in basketball, while also highlighting the eco-friendly features of the brand's products.
7. **BioBall**: A fun, memorable name that suggests a connection between biological (eco-friendly) and ball (basketball).
8. **CleanCourt Apparel**: Simple and straightforward, this name emphasizes the cleanliness of the brand's products, both in terms of their eco-friendliness and athletic performance.
9. **GreenFloor Gear**: Another play on words that references the basketball court (the "green floor" where players compete), while also highlighting the brand's commitment to sustainability.
10. **PureMotion**: Suggests a product that allows athletes to move freely, while also emphasizing the eco-friendly features of the brand's products.
I hope these ideas inspire you!

让我们通过一些有趣的测试来探索这个系统的创意能力! 我们可以尝试以下两种类型的请求:

  1. 生成一首诗
  • 指令示例: “写一首关于狐狸宝宝的诗”

  • 使用temperature = 0.0将会得到一首固定的、每次请求都相同的诗。

  • 使用temperature = 1.0将会让系统生成多种风格和内容的诗。

  1. 获取旅行建议
  • 指令示例: “我热爱大自然。推荐三个我应该去的地方。为什么?”

  • 使用temperature = 0.0会始终推荐相同的三个地点及其理由。

  • 使用temperature = 1.0则会随机推荐不同的三个地点(尽管有时也可能出现重复的建议)。 为了测试系统的推理能力, 我们先从设置较高的温度值开始, 这样可能会产生一些有趣但不准确的回答。aaaaaaa

prompt_reasoning = "You have three boxes. One contains only apples, one contains only oranges, and one contains both apples and oranges. Each box is labeled, but all the labels are incorrect. You are allowed to pick one fruit from one box. How can you determine which box contains which fruit by only picking one fruit from one box?"

response = ollama.chat(
    model=model, 
    messages=[{"role": "user", "content": prompt_reasoning}], 
    options={"temperature": 1.0}
    )

print(response["message"]["content"])
If I pick a fruit from a box that I know has both fruits in it and the label says either "apples" or "oranges", then I know for sure that is not correct, since the box has at least two different kinds of fruit. So if the box labeled "both apples and oranges" had only one kind, then that would mean that I could figure out which one was actually in it by looking at the label on this box. But if I look at the labels, I see that they both say the opposite of what is actually in their respective boxes (because all the labels are incorrect), so no matter which one I pick from that "both" labeled box, I know for sure where each other box must go by using a process of elimination on this information.

这是一个荒谬的答案!请随意阅读:)

让我们看看低温是否能解决逻辑问题…

response = ollama.chat(
    model=model, 
    messages=[{"role": "user", "content": prompt_reasoning}], 
    options={"temperature": 0.0}
    )

print(response["message"]["content"])
Pick a fruit from the box that says "both". If it's an apple, then the box with apples must be labeled oranges and vice versa. The box with oranges is therefore the one labeled "both".

了解ChatGPT与温度参数的关系

在探讨ChatGPT以及类似语言模型中的"温度"概念之前,我们先来看看一个简单的例子。假设我们将温度设置为两个极端值:0 和 1。这可以帮助我们直观地理解不同温度设置下模型的行为差异。但实际上,在这两个极端值之间,您可以自由选择任何数值来调整模型生成文本的方式。

温度参数的作用

  • 温度为0:模型会倾向于给出最可能的答案,这通常意味着输出的文本更加可预测和确定。

  • 温度为1:模型的随机性大大增加,生成的文本可能会更加多样且富有创造性,但也可能包含更多语法错误或不连贯的内容。

中等温度下的表现

  • 当温度设置在0.5到0.7之间时,模型能够在推理和创造力之间找到一个平衡点。这种设置下的响应不仅具有一定的随机性和惊喜元素,同时也保持着较高的逻辑性和连贯性。

试验种子以获得一致的结果

虽然提高温度可以让模型的输出更加多样化,但是在科学研究或需要重现性的场景下,我们往往希望得到一致的结果。这时候可以通过设置seed参数来实现。 例如,如果我们设置temperature=0.7 并且 seed=42,那么即使在较高的温度下,我们也能够通过相同的种子值获得一致的输出。 综上所述,通过调整温度参数,我们可以控制ChatGPT等语言模型生成文本的创造性和可预测性程度。而通过设定种子值,我们可以在保持一定随机性的同时确保结果的可重复性。

import ollama

prompt_product_short = "Create a 50-word product description for EcoHoops - an eco-friendly sportswear for basketball players"
model = "llama3.1"
response = ollama.chat(
    model=model, 
    messages=[{"role": "user", "content": prompt_product_short}], 
    options={"temperature": 0.7, "seed": 42}
    )
print(response["message"]["content"])

让我们再次运行相同的代码,看看描述是否相同。

response = ollama.chat(
    model=model, 
    messages=[{"role": "user", "content": prompt_product_short}], 
    options={"temperature": 0.7, "seed": 42}
    )

print(response["message"]["content"])

是的如果我们把种子从期权中去掉会发生什么呢?

response = ollama.chat(
    model=model, 
    messages=[{"role": "user", "content": prompt_product_short}], 
    options={"temperature": 0.7}
    )

print(response["message"]["content"])

何时使用 seed 参数?

在追求创意生成的同时需要一定程度上可重复结果的情况下,可以使用 seed 参数。这通常应用于需要随机性但又希望结果能在多次运行中保持一致的场景。

最大令牌数 (Max Tokens)

定义

Max tokens 参数用于限制语言模型生成响应的最大长度。这一设置对于控制生成文本的成本和管理计算资源非常关键。

实际应用场景

  • 控制响应长度与成本:通过设定最大令牌数,可以避免过长的响应导致不必要的开支。

  • 优化计算资源:限制生成文本的长度有助于确保系统的稳定性和响应速度。

面临的问题

当响应达到设定的最大令牌数时,系统会自动截断文本。这可能会导致信息不完整或句子结构不自然。 接下来,我们将通过一个示例来展示没有和有限制的令牌数情况下,响应的区别。为了保证每次生成的文本相同,我们将设置 temperature = 0。 首先,我们尝试生成一个不受令牌数限制的描述。

prompt_product = "Create a product description for EcoHoops - an eco-friendly sportswear for basketball players"
import ollama

model = "llama3.1"
response = ollama.chat(
    model=model, 
    messages=[{"role": "user", "content": prompt_product}], 
    options={"temperature": 0}
    )
print(response["message"]["content"])
Here's a product description for EcoHoops:

**Introducing EcoHoops: The Sustainable Game-Changer in Basketball Sportswear**
Take your game to the next level while doing good for the planet with EcoHoops, the ultimate eco-friendly sportswear for basketball players. Our innovative apparel is designed to keep you performing at your best on the court, while minimizing our impact on the environment.
**What sets us apart:**
* **Sustainable Materials**: Our jerseys and shorts are made from a unique blend of recycled polyester, organic cotton, and Tencel, reducing waste and minimizing carbon footprint.
* **Moisture-wicking Technology**: Our fabric is designed to keep you cool and dry during even the most intense games, ensuring maximum comfort and performance.
* **Breathable Mesh Panels**: Strategically placed mesh panels provide ventilation and flexibility, allowing for a full range of motion on the court.
**Features:**
* **Quick-drying and moisture-wicking properties**
* **Four-way stretch for ultimate mobility**
* **Anti-odor technology to keep you fresh all game long**
* **Reflective accents for increased visibility during night games or practices**
**Join the EcoHoops Movement:**
At EcoHoops, we're passionate about creating a more sustainable future in sports. By choosing our eco-friendly sportswear, you'll not only be performing at your best on the court, but also contributing to a reduced environmental impact.
**Shop with us today and experience the difference for yourself!**
Order now and get 15% off your first purchase with code: ECOHOOPS15

酷!酷!现在,让我们通过令牌限制。在Ollama中,我们使用“num_predict”选项。我把它调到50.

response = ollama.chat(
    model=model, 
    messages=[{"role": "user", "content": prompt_product}], 
    options={"num_predict": 50, "temperature": 0}
    )
print(response["message"]["content"])
Here's a product description for EcoHoops:

**Introducing EcoHoops: The Sustainable Game-Changer in Basketball Sportswear**
Take your game to the next level while doing good for the planet with EcoHoops, the ultimate eco-friendly

你看到问题了吗?

模型生成相同的描述。但它在达到令牌限制后停止生成。

所以答案是不完整的。

通过使用max tokens,我们冒着模型无法完成响应的风险。

所以如果我想要一个更简短的描述,我会在提示中这样说:

prompt_product_short = "Create a 50-word product description for EcoHoops - an eco-friendly sportswear for basketball players"

model = "llama3.1"
response = ollama.chat(
    model=model, 
    messages=[{"role": "user", "content": prompt_product_short}], 
    options={"temperature": 0}
    )
print(response["message"]["content"])

使用最大令牌数(max tokens)是一个实用且被广泛采用的方法,但在应用时需要谨慎处理。接下来,我们将探讨如何利用Ollama框架中的流式响应功能,这一特性在与ChatGPT或Claude等模型交互时尤为有用。

流式响应

Ollama 提供了流式响应的功能,这意味着我们可以实时接收模型生成的文本片段,而不是等待整个回复完成后再一次性接收。这种特性在构建对话系统时非常有用,因为它能够模拟更加自然的人类对话体验。

如何实现流式响应

为了启用流式响应,我们需要对代码进行两处主要修改:

  1. 设置 stream 参数
  • 在调用 ollama.chat() 方法时,将 stream 参数设置为 True,这会告诉Ollama以流的形式返回结果。
  1. 使用 for 循环来处理响应
  • 由于流式响应会逐块发送数据,因此我们需要在一个 for 循环中迭代 ollama.chat() 的输出,以便逐个处理和显示每个文本块。 通过这些步骤,你可以实现一个更加流畅和互动式的对话体验,就像与真正的聊天伙伴交谈一样。

注意:确保你的代码逻辑能够适配流式响应的数据结构,并且正确地处理每个文本块。这通常意味着你需要在每次迭代时更新界面或输出文本。

希望这些信息对你有所帮助!如果你有任何疑问或需要进一步的帮助,请随时提问。

import ollama

model = "llama3"
messages = [{"role": "user", "content": "What's the capital of Poland?"}]
for chunk in ollama.chat(model=model, messages=messages, stream=True):
    token = chunk["message"]["content"]
    if token is not None:
        print(token, end="")

开始构建与探索

仅仅通过阅读,你可能无法完全理解人工智能的精髓。因此,请动手实践:将本文作为你的行动指南。获取这段代码,并开始探索这个应用。 请注意,只有实际操作才能让你真正掌握知识,而不仅仅是阅读!

注:

你知道一对一的教学方式能带来最高效的学习体验吗?为此,我提供关于RAG、LLMs和AI Agents等人工智能相关主题的一对一辅导服务。点击这里了解详情。

探索项目

以下是一些使用此项目的建议:

  • 试验不同的参数:调整设置以观察效果差异。

  • 使用其他开源LLMs:比如Mistral和Gemma。

  • 尝试多模态模型:比如结合视觉功能的Llava模型。

如果你对这篇文章感兴趣,

考虑投身于AI工程领域。在另一篇文章中,我详细阐述了成为人工智能工程师所需的步骤。

结论

恭喜你!你刚刚学到了许多有用的知识! 通过本教程,你现在掌握了:

  • 如何使用Ollama运行Llama 3

  • 如何使用Ollama实现流式响应

  • 系统提示的重要性及其使用方法

  • LLMs中的温度概念及其实际应用

  • 如何利用seed参数来重现相同的响应

  • 使用最大令牌选项的利弊。 现在就去动手操作代码吧! 使用不同的提示和选项,观察结果的变化。 祝你玩得愉快!

在你离开前…

我正在整理自2023年5月以来我发现的最佳AI工程资源。你可以通过这个链接免费查看这些资源。

我的AI工程资源列表

嗨,我是Kris,一名AI工程师。我在Medium上分享关于如何构建实用的、基于人工智能项目的教程。如果你对这个领域感兴趣,不妨关注我以获取最新资讯。

参考资料

  • GitHub存储库: krisograbek/ollama-chatbot-st

  • 这个仓库包含了构建聊天机器人的相关脚本和代码示例。

  • Ollama官方网站: Ollama.com

  • Ollama是一个开源平台,用于训练和部署语言模型。你可以在这里找到更多关于如何开始的信息。

  • Ollama图书馆: Ollama.com/library

  • 在这里可以访问到一系列预先训练好的模型以及文档,帮助你更好地了解和使用Ollama的功能。 如果你正在寻找有关AI工程的实际资源,这些链接将非常有用。不要忘了查看我的Medium文章,以获得更多的实践经验和技巧。