青训营X豆包MarsCode 技术训练营 | 豆包MarsCode AI 刷题 :00_开篇词_奇点时刻 + 01_LangChain快速入门

90 阅读7分钟

1 注册配置豆包API

1.1 注册火山账号

使用自己的手机号即可

1.2 创建api key

API密钥(API Key)是一种用于身份验证和访问控制的重要工具。在使用各种服务时,例如阿里云的短信服务、人机验证等,API密钥起着确保请求来源可靠的作用。具体来说,API密钥的作用包括但不限于以下几点:

身份验证:API密钥用于验证请求的来源,确保只有获得授权的用户或应用程序才能访问特定的API。

安全性:通过要求提供密钥,可以防止未授权访问,减少恶意请求的风险。密钥通常是唯一的,可以有效识别和追踪不同的用户。

调用限制:许多API会对每个API密钥设置调用次数限制或速率限制,以防止滥用和保护服务器资源。

权限管理:不同的API密钥可以绑定不同的权限,允许用户根据需要进行精细化的访问控制。

在实际使用中,确保API密钥的安全性非常重要。避免将密钥硬编码在公共的代码库中,也应尽量定期更换密钥,以增强系统的安全性。使用环境变量或安全配置管理工具来存储和管理密钥,是一种有效的安全做法。总之,API密钥是现代应用程序中不可或缺的部分,它在确保数据安全和访问控制方面发挥着关键作用。

1.3 选择模型和设置API调用

创建推理节点(其实和大模型的对话就是推理)

选择模型和版本

成功如下

设置API调用

得到base_url 和 model,

至此 我们已经得到了 base_url, model, api key三个调用的关键了

2 开篇词_奇点时刻

2.1 设置环境变量

打开 /home/cloudide/.cloudiderc

令文件生效

echo $OPENAI_API_KEY

echo $OPENAI_BASE_URL

echo $LLM_MODELEND

2.2 SimpleTextGeneration

代码如下:根据火山方舟第三方调用案例修改所得

import os
from langchain_openai import ChatOpenAI
from openai import OpenAI

api_key = os.environ["OPENAI_API_KEY"]
model_name = os.environ["LLM_MODELEND"]
base_url = os.environ["OPENAI_BASE_URL"]
# print("api_key:", api_key)
# print("model_name:", model_name)
# print("base_url:", base_url)
client = OpenAI(
    api_key = api_key,
    base_url = base_url,
)


completion = client.chat.completions.create(
    model = model_name,  # your model endpoint ID
    messages = [
        {"role": "system", "content": "你是豆包,是由字节跳动开发的 AI 人工智能助手"},
        {"role": "user", "content": "请给我写一句情人节红玫瑰的中文宣传语"},
    ],
)
print(completion.choices[0].message.content)

运行结果如下:

我们已经成功调用了大模型

2.3 PictureDescription

# ---- Part 0 导入所需要的类
import os
import requests
from PIL import Image
from transformers import BlipProcessor, BlipForConditionalGeneration
from langchain.tools import BaseTool
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType

# ---- Part I 初始化图像字幕生成模型
# 指定要使用的工具模型(HuggingFace中的image-caption模型)
hf_model = "Salesforce/blip-image-captioning-large"
print("正在初始化图像字幕生成模型...")

# 初始化处理器和工具模型
# 预处理器将准备图像供模型使用
processor = BlipProcessor.from_pretrained(hf_model)
# 然后我们初始化工具模型本身
model = BlipForConditionalGeneration.from_pretrained(hf_model)
print("初始化图像字幕生成模型成功")

# ---- Part II 定义图像字幕生成工具类
class ImageCapTool(BaseTool):
    name: str= "ImageCaptioning"
    description: str = "使用该工具可以生成图片的文字描述,需要传入图片的URL."

    def _run(self, url: str):
        # 下载图像并将其转换为PIL对象
        image = Image.open(requests.get(url, stream=True).raw).convert("RGB")
        # 预处理图像
        inputs = processor(image, return_tensors="pt")
        # 生成字幕
        out = model.generate(**inputs, max_new_tokens=20)
        # 获取字幕
        caption = processor.decode(out[0], skip_special_tokens=True)
        return caption

    def _arun(self, query: str):
        raise NotImplementedError("This tool does not support async")

# ---- PartIII 初始化并运行LangChain智能体
llm = ChatOpenAI(
    openai_api_key=os.environ.get("OPENAI_API_KEY"),
    openai_api_base=os.environ.get("OPENAI_BASE_URL"),
    model=os.environ.get("LLM_MODELEND"),
    temperature=0.2
)
print("初始化大语言模型成功")

# 使用工具初始化智能体并运行
tools = [ImageCapTool()]
agent = initialize_agent(
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    tools=tools,
    llm=llm,
    verbose=True,
    handle_parsing_errors=True,
)

img_url = "https://lf3-static.bytednsdoc.com/obj/eden-cn/lkpkbvsj/ljhwZthlaukjlkulzlp/eec79e20058499.563190744f903.jpg"
agent.invoke(input=f"图片链接如下:{img_url}\n 请为这张图创作合适的中文推广文案")

运行结果:

3 LangChain快速入门

3.1 创建文本模型推理接入点

因为咱们没有OpenAI,所以就在方舟上找一个文本模型

3.2 TextModel

查看新模型的第三方调用,写出如下代码

不过有一个疑惑,这虽然是个文本模型但是还是使用了client.chat.completions.create,我感觉和chat模型的调用并没有很大差别

import os
from openai import OpenAI

api_key = os.environ["OPENAI_API_KEY"]
model_name = os.environ["LLM_MODELEND"]
base_url = os.environ["OPENAI_BASE_URL"]
client = OpenAI(
    api_key = api_key,
    base_url = base_url,
)

# Non-streaming:
print("----- standard request -----")
completion = client.chat.completions.create(
    model = "ep-20241107134821-gx9mc",  # your model endpoint ID
    messages = [
        {"role": "system", "content": "You are a creative AI."},
        {"role": "user", "content": "请给我的花店起个名"},
    ],
)
print(completion.choices[0].message.content)

返回结果:

因为Llama是国外的模型好像,所以回答是英语,可以通过中文数据集微调,让他说中文的

可是看出Text模型返回的并不是对话形式的

翻译:

3.3 ChatModel

代码如下:

import os
from openai import OpenAI

# os.environ["OPENAI_API_KEY"] = '你的OpenAI API Key'
# os.environ["OPENAI_BASE_URL"] = 'OpenAI 的 API URL'


client = OpenAI(
    api_key=os.environ.get("OPENAI_API_KEY"),
    base_url=os.environ.get("OPENAI_BASE_URL"),
)

# text = client.invoke("请给我写一句情人节红玫瑰的中文宣传语")
response = client.chat.completions.create(
    model=os.environ.get("LLM_MODELEND"),
    messages=[
        {"role": "system", "content": "You are a creative AI."},
        {"role": "user", "content": "请给我的花店起个名"},
    ],
    temperature=0.8,
    max_tokens=60,
)

print(response.choices[0].message.content)

结果如下:

我们可以发现 这个和text文本其实差距不是很大,甚至类似,很难区分是text模型还是chat模型,所以我决定换一个问法,内容改为:你的创造者是谁?

import os
from openai import OpenAI

# os.environ["OPENAI_API_KEY"] = '你的OpenAI API Key'
# os.environ["OPENAI_BASE_URL"] = 'OpenAI 的 API URL'


client = OpenAI(
    api_key=os.environ.get("OPENAI_API_KEY"),
    base_url=os.environ.get("OPENAI_BASE_URL"),
)

# text = client.invoke("请给我写一句情人节红玫瑰的中文宣传语")
response = client.chat.completions.create(
    model=os.environ.get("LLM_MODELEND"),
    messages=[
        {"role": "system", "content": "You are a creative AI."},
        {"role": "user", "content": "你的创造者是谁?"},
    ],
    temperature=0.8,
    max_tokens=60,
)

print(response.choices[0].message.content)

结果如下:可以看出他就像对话一样回答了你的问题,是调用了chat模型

3.4 TextLangChain

因为设置好环境变量的缘故,不用设置api key等,当然也可以在这里重置新的api key,model等

代码如下:和直接调用差距不大

import os
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="ep-20241107134821-gx9mc",
    temperature=0.8,
    max_tokens=600,
)
response = llm.invoke("请给我的花店起个名").content

print(response)

结果如下:

3.5 ChatLongChain

代码如下:和直接 调用差距不大

import os
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage

# os.environ["OPENAI_API_KEY"] = '你的OpenAI API Key'
# os.environ["OPENAI_BASE_URL"] = 'OpenAI 的 API URL'

chat = ChatOpenAI(model=os.environ.get("LLM_MODELEND"), temperature=0.8, max_tokens=600)

messages = [    SystemMessage(content="你是一个很棒的智能助手"),    HumanMessage(content="请给我的花店起个名"),]
response = chat(messages).content
print(response)

结果如下:

4 总结

在学习过程中,我深入掌握了在火山方舟中选择合适模型及设置API调用的技巧,并对文本模型与聊天模型的基本概念进行了全面了解。特别是通过直接调用OpenAI的接口以及利用LangChain库,我成功实现了这两类模型的实际应用。此外,我认识到LangChain的版本更新速度可能无法完全跟上OpenAI及其他AI技术的迅速发展,这使我意识到多样化的API调用方式变得愈发重要。

为了应对AI领域的快速演进,我们必须不断拓宽自己的知识面,学习不同的API调用方法,以便能够灵活应对各种需求。例如,可以探寻其他库或平台的调用方式,或是深入研究不同模型的特性,以充分发挥其优势。通过这些学习和探索,不仅能够提高我们的开发能力,也能帮助我们在不断变化的技术环境中保持竞争力。

总之,通过本次学习,我不仅收获了实用的技能,还提升了对AI领域的整体理解,这为未来可能的技术挑战打下了坚实的基础。继续保持学习的热情,将使我在这一领域中游刃有余。