2022年底,一个名为ChatGPT的应用横空出世,如同一道惊雷,彻底划破了科技界的天空。我们第一次如此真切地感受到,人工智能不再是遥远的科幻概念,而是触手可及、能与我们流畅对话、协助我们创作与思考的伙伴。

但对于我们——这个世界的数字构建者——来说,震撼过后,一个更深刻、更令人激动的问题浮现出来:我们能用这项技术创造什么?

这篇指南,就是为回答这个问题而生。我们将不再满足于在聊天框里与AI互动,而是要深入其“引擎室”,学习如何驾驭其背后的核心技术——大语言模型(LLM),并将这股强大的力量注入我们自己的应用中,构建出真正具备“智能”的下一代软件。

这不是一篇理论综述,而是一份**“LLM应用开发的实战魔法书”**。我们将从最基础的“API咒语”开始,逐步学习为AI植入“长期记忆”的炼金术,最终甚至能创造出可以自主思考和行动的“AI智能体”(Agent)。

准备好了吗?让我们一起,从一个AI的“使用者”,蜕变为一个AI的“创造者”。


第一章:AI的新纪元,开发者的“魔法棒”

1.1 从ChatGPT说起:范式革命的开端

在我们深入技术细节之前,必须先理解ChatGPT的出现为何是一场“范式革命”。

过去的AI,大多是“专才”。一个模型专门用来图像识别,另一个专门用来机器翻译。它们强大,但能力边界清晰。而以GPT系列为代表的LLM,则展现出了惊人的**“通用智能”**(AGI的雏形)。它通过在海量文本数据上的“预训练”,学会了语言的规律、世界的知识,乃至一定的推理能力。

这意味着,我们不再需要为每一个小任务都去训练一个新模型。我们拥有了一个通用的、可编程的“智能核心”。开发者要做的,就是学会如何通过**“对话”(即编写Prompt)和“集成”**(调用API和外部工具)来引导和释放这个核心的潜力。

对于开发者而言,LLM就是我们这个时代最强大的“魔法棒”。 我们的角色,正在从一砖一瓦构建逻辑的“建筑师”,转变为懂得如何挥舞魔杖、指挥强大魔法力量的“魔法师”。

1.2 LLM应用开发的“三层魔法”

我们将在这篇指南中,逐一解锁驾驭LLM的三种核心魔法:

  1. 第一层魔法:API调用与提示工程 (Prompt Engineering)

    • 核心: 学会与LLM进行高效沟通。

    • 比喻: 这是“施法”的基础,学习如何念出清晰、准确、能引导出强大效果的“咒语”(Prompt)。

  2. 第二层魔法:Embeddings与向量数据库

    • 核心: 赋予LLM长期记忆和私有知识。

    • 比喻: 这是“炼金术”,通过一种名为RAG(检索增强生成)的技术,为你的AI打造一个专属的“外部记忆水晶球”。

  3. 第三层魔法:AI智能体 (Agents)

    • 核心: 授权LLM自主思考、规划和行动。

    • 比喻: 这是“召唤术”,创造出能独立完成复杂任务的“智能仆从”。


第二章:第一层魔法:API调用与提示工程 (Prompt Engineering)

这是所有LLM应用开发的起点。我们将学习如何通过代码,让程序替我们与AI“对话”。

2.1 准备工作:获取你的API密钥

我们将以当今最主流的OpenAI API为例。

  1. 前往 OpenAI官网 注册账号。

  2. 进入你的账户设置,找到“API keys”页面。

  3. 创建一个新的密钥(secret key),并立即复制并妥善保管。这个密钥只会显示一次,是你与OpenAI API通信的唯一凭证。

  4. 为了安全,不要将API密钥直接写在代码里。最佳实践是将其设置为环境变量。

    • 在终端中设置(临时):export OPENAI_API_KEY='sk-...'

    • 或者写入 .env 文件,并使用库(如python-dotenv)来加载。

2.2 你的第一个AI程序:用Python调用GPT

我们将使用OpenAI官方提供的Python库。首先,安装它:

pip install openai

【代码示例:一个简单的问答程序】

# simple_qa.py
import os
from openai import OpenAI

# 最佳实践:从环境变量加载API密钥
# client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
# 为了教程方便,你也可以直接在这里填入,但不推荐用于生产环境
client = OpenAI(api_key="sk-...") 

def ask_gpt(prompt_text):
    """向GPT-3.5 Turbo模型发送一个prompt并获取回答"""
    try:
        response = client.chat.completions.create(
            model="gpt-3.5-turbo",  # 指定使用的模型
            messages=[
                {"role": "system", "content": "You are a helpful assistant."},
                {"role": "user", "content": prompt_text}
            ],
            temperature=0.7, # 控制创造性,0表示最确定,1表示最随机
            max_tokens=150   # 控制回答的最大长度
        )
        # 提取并返回模型生成的回答
        return response.choices[0].message.content.strip()
    except Exception as e:
        return f"An error occurred: {e}"

# --- 主程序 ---
if __name__ == "__main__":
    question = "请用三句话解释什么是黑洞?"
    print(f"🤔 你的问题是: {question}")
    
    answer = ask_gpt(question)
    print(f"🤖 GPT的回答是:\n{answer}")

    print("\n" + "="*30 + "\n")

    question_creative = "写一首关于代码的五言绝句。"
    print(f"🤔 你的问题是: {question_creative}")

    answer_creative = ask_gpt(question_creative)
    print(f"🤖 GPT的回答是:\n{answer_creative}")

代码讲解:

  • OpenAI(): 创建一个API客户端实例。

  • client.chat.completions.create(): 这是调用聊天模型的核心方法。

  • model: 指定你要使用的模型。gpt-3.5-turbo性价比高,gpt-4更强大但更贵。

  • messages: 这是对话的核心。它是一个列表,每个元素都是一个字典,包含role和content。

    • role: "system": 设定AI的“角色”或“人设”,它会影响AI的整体行为和语气。

    • role: "user": 代表用户输入的内容。

    • role: "assistant": 代表AI之前的回答(用于多轮对话)。

  • temperature: 一个非常重要的参数,控制输出的随机性。值越高,回答越有创意;值越低,回答越确定和保守。

  • response.choices[0].message.content: 这是从复杂的API响应中提取出我们需要的文本内容的标准路径。

2.3 提示工程的艺术:如何念好你的“咒语”

仅仅会调用API是不够的。Prompt的质量,直接决定了LLM输出的质量。 这就是“提示工程”——一门如何与AI高效沟通的艺术与科学。

核心原则一:清晰与具体 (Clarity and Specificity)
不要让AI猜测你的意图。

  • 反例 ❌: "给我写点关于苹果的东西。" (是水果?是公司?写什么?)

  • 正例 ✅: "请为小学生写一篇关于苹果公司历史的200字短文,重点介绍乔布斯的贡献。"

核心原则二:提供上下文 (Provide Context)
给AI足够的信息,让它能更好地理解任务。

  • 反例 ❌: "总结一下。" (总结什么?)

  • 正例 ✅: "请将以下这段关于量子计算的访谈记录,总结成三个要点,面向非技术读者:[此处粘贴访谈文本]"

核心原则三:设定角色与格式 (Set Role and Format)
明确告诉AI它应该扮演什么角色,以及你希望的输出格式。

【代码示例:利用Prompt实现JSON格式化】
假设我们需要从一段非结构化的文本中提取信息,并以JSON格式输出。

# structured_output.py
from openai import OpenAI
import json

client = OpenAI(api_key="sk-...")

def extract_info_as_json(text):
    system_prompt = """
    你是一个精准的信息提取助手。
    你的任务是从用户提供的文本中,提取出姓名、公司和职位,并以严格的JSON格式返回。
    JSON的键必须是 "name", "company", "position"。
    如果某个信息不存在,请将对应的值设为 null。
    不要返回任何多余的解释或文字,只返回JSON对象。
    """
    
    user_prompt = f"这是需要处理的文本: '{text}'"

    try:
        response = client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": user_prompt}
            ],
            temperature=0, # 对于信息提取,我们需要最确定的结果
        )
        json_string = response.choices[0].message.content
        return json.loads(json_string) # 将字符串解析为Python字典
    except Exception as e:
        return {"error": str(e)}

# --- 主程序 ---
if __name__ == "__main__":
    text1 = "张伟是阿里巴巴的首席技术官。"
    info1 = extract_info_as_json(text1)
    print(f"从 '{text1}' 提取的信息:\n{info1}\n")

    text2 = "李静是一名软件工程师。"
    info2 = extract_info_as_json(text2)
    print(f"从 '{text2}' 提取的信息:\n{info2}")

讲解: 在这个例子中,我们在system prompt里非常精确地定义了AI的角色、任务、输出格式、键名和处理缺失值的规则。这使得LLM的行为变得高度可预测和可靠,可以直接用于程序化的数据处理。

核心原则四:少量示例学习 (Few-shot Learning)
在你的Prompt中给AI一两个例子,它能更快地学会你想要的模式。

  • 正例 ✅:

    将句子翻译成法语。
    
    'Hello, world!' -> 'Bonjour, le monde!'
    'How are you?' -> 'Comment ça va?'
    'I love programming.' ->

    AI看到这个模式后,会接着输出 'J'aime la programmation.'。

提示工程是一个不断迭代和实验的过程。 好的Prompt往往是多次尝试和优化的结果。


第三章:第二层魔法:为AI植入记忆 (Embeddings与向量数据库)

LLM有一个致命的弱点:它没有长期记忆,而且它的知识截止于其训练日期。 我们如何让它“学习”我们的私有知识,比如一本PDF电子书、一个项目代码库,或者一个公司的内部知识库?

答案就是 RAG (Retrieval-Augmented Generation,检索增强生成)

3.1 RAG的核心思想:开卷考试

比喻:

  • 没有RAG的LLM: 像一个博学的学生在闭卷考试。他只能依赖自己脑中已有的知识来回答问题。

  • 有RAG的LLM: 像同一个学生在开卷考试。当遇到一个问题时,他可以先去查阅指定的参考资料(我们的私有知识库),然后结合查到的资料和自己原有的知识来组织答案。

RAG的三个步骤:

  1. 索引 (Indexing/Embedding):将我们的私有文档进行预处理,转换成一种AI能理解的数学形式(向量),并存入一个专门的数据库(向量数据库)。

  2. 检索 (Retrieval):当用户提出问题时,将问题也转换成向量,然后去向量数据库中搜索最相关的文档片段

  3. 生成 (Generation):将用户原始问题和搜索到的相关文档片段,一起作为上下文(Context)打包成一个新的Prompt,发送给LLM,让它基于这些信息生成最终答案。

3.2 魔法的核心:Embeddings —— “思想的坐标”

什么是Embeddings?
它是一种将文本(单词、句子、段落)转换成一个高维向量(一个由几百上千个数字组成的列表)的技术。这个向量可以被看作是该文本在“语义空间”中的坐标

关键特性:

  • 语义相近的文本,其向量在空间中的距离也相近。

  • 例如,“国王”的向量 - “男人”的向量 + “女人”的向量 ≈ “女王”的向量。

我们可以通过OpenAI的Embeddings API来获取文本的向量。

【代码示例:获取文本的Embedding向量】

# embeddings_demo.py
from openai import OpenAI

client = OpenAI(api_key="sk-...")

def get_embedding(text, model="text-embedding-ada-002"):
   text = text.replace("\n", " ")
   return client.embeddings.create(input=[text], model=model).data[0].embedding

# --- 主程序 ---
if __name__ == "__main__":
    embedding1 = get_embedding("猫是一种可爱的宠物。")
    embedding2 = get_embedding("我喜欢养小猫咪。")
    embedding3 = get_embedding("今天天气真好。")

    print(f"向量1 (猫) 的前5个维度: {embedding1[:5]}")
    print(f"向量的维度: {len(embedding1)}") # e.g., 1536

    # 我们可以计算向量间的相似度(余弦相似度)
    import numpy as np
    
    def cosine_similarity(v1, v2):
        return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))

    sim12 = cosine_similarity(embedding1, embedding2)
    sim13 = cosine_similarity(embedding1, embedding3)

    print(f"\n'猫' 和 '小猫咪' 的语义相似度: {sim12:.4f}") # 结果会很高
    print(f"'猫' 和 '天气' 的语义相似度: {sim13:.4f}") # 结果会很低

讲解: 这个例子展示了如何将文本转换为向量,并证明了语义相近的文本其向量也相近。这是RAG检索步骤的数学基础。

3.3 实践:用LangChain构建一个PDF问答机器人

LangChain是一个强大的开源框架,它极大地简化了构建复杂LLM应用(如RAG)的过程。

准备工作:

  1. 安装必要的库:

    pip install langchain openai chromadb pypdf tiktoken
  2. 准备一个PDF文件,例如 policy_document.pdf。

【代码示例:完整的RAG应用】

# rag_pdf_qa.py
import os
from langchain.chains import RetrievalQA
from langchain_community.document_loaders import PyPDFLoader
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.vectorstores import Chroma

# 设置OpenAI API密钥
os.environ["OPENAI_API_KEY"] = "sk-..."

# 1. 加载和分割文档 (Indexing的第一步)
print("正在加载PDF文档...")
loader = PyPDFLoader("policy_document.pdf")
documents = loader.load()

print("正在切分文档...")
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)

# 2. 创建Embeddings并存入向量数据库 (Indexing的第二步)
print("正在创建Embeddings并构建向量数据库...")
embeddings = OpenAIEmbeddings()
# Chroma是一个内存中的向量数据库,非常适合快速原型开发
vectorstore = Chroma.from_documents(texts, embeddings)

# 3. 创建RAG链 (Retrieval & Generation)
print("正在创建RAG问答链...")
# 创建一个检索器,它知道如何从向量数据库中搜索
retriever = vectorstore.as_retriever()

# 创建一个LLM实例
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

# RetrievalQA链将检索和生成步骤封装在一起
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff", # "stuff"是一种将所有检索到的文档塞入上下文的策略
    retriever=retriever
)

# --- 开始问答 ---
print("\nPDF问答机器人已准备就绪!请输入你的问题。")
while True:
    query = input("> ")
    if query.lower() in ["exit", "quit"]:
        break
    
    # 执行问答链
    result = qa_chain.invoke(query)
    print(f"🤖 答案: {result['result']}\n")

运行与讲解:

  1. 将你的PDF文件放在与脚本相同的目录。

  2. 运行脚本。它会经历加载、切分、Embedding和索引的过程,这可能需要一些时间。

  3. 准备就绪后,你就可以开始提问关于这个PDF内容的问题了。

  4. 背后发生了什么? 当你输入问题时,LangChain:

    • 将你的问题Embedding成一个向量。

    • 用这个向量去Chroma数据库里进行相似度搜索,找到最相关的PDF文本块。

    • 构建一个新的Prompt,内容大致是:“请基于以下上下文回答问题。上下文:[...这里是检索到的文本块...] 问题:[...你的原始问题...]”

    • 将这个Prompt发送给GPT,并返回结果。

你已经成功地为AI植入了关于一份特定文档的“长期记忆”!


第四章:第三层魔法:AI智能体 (Agents) —— 让AI自主行动

如果说RAG是让AI成为一个“博学的学者”,那么Agent就是让AI成为一个“能干的行动者”。

4.1 Agent的核心思想:思考-行动循环 (ReAct)

比喻:

  • 普通的LLM调用: 你给AI一个指令,它直接给你最终答案。

  • Agent: 你给AI一个目标。AI会自己思考(Thought)第一步该做什么,然后选择一个行动(Action),比如“上网搜索”、“调用计算器”。执行行动后,它会观察结果(Observation),然后基于新结果进行下一步的思考行动,如此循环,直到最终完成目标。

这个核心循环被称为ReAct (Reasoning and Acting)

4.2 Agent的组成部分

一个Agent通常由三部分组成:

  1. LLM核心: 提供“思考”和“推理”能力。

  2. 工具 (Tools): Agent可以调用的外部功能。这可以是任何东西:搜索引擎API、计算器、数据库查询接口、公司内部的API等。

  3. Agent执行器 (Agent Executor): 这是驱动ReAct循环的核心逻辑,负责解析LLM的思考,调用正确的工具,并将工具的结果反馈给LLM。

4.3 实践:用LangChain创建一个能上网和计算的Agent

准备工作:

  1. 安装额外的库:

    pip install langchain-community google-search-results
  2. 你需要一个 SerpApi 的API密钥,用于让Agent能够访问Google搜索。并将其设置为环境变量 SERPAPI_API_KEY。

【代码示例:一个简单的研究助手Agent】

# simple_agent.py
import os
from langchain_openai import ChatOpenAI
from langchain.agents import load_tools, initialize_agent, AgentType

# 设置API密钥
os.environ["OPENAI_API_KEY"] = "sk-..."
os.environ["SERPAPI_API_KEY"] = "..." # 你的SerpApi密钥

# 1. 初始化LLM
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

# 2. 加载工具
# "serpapi" 用于搜索,"llm-math" 是一个使用LLM进行数学计算的工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)

# 3. 初始化Agent
# AgentType.ZERO_SHOT_REACT_DESCRIPTION 是一种通用的、基于ReAct思想的Agent类型
agent = initialize_agent(
    tools,
    llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True # 设置为True,可以看到Agent的完整思考过程
)

# --- 赋予Agent一个复杂的目标 ---
goal = "苹果公司(Apple Inc.)现任CEO是谁?他的年龄的平方是多少?"
print(f"🎯 目标: {goal}")

# 运行Agent
agent.run(goal)

运行与讲解:
当你运行这段代码时,verbose=True会让你清晰地看到Agent的“内心独白”:

> Entering new AgentExecutor chain...
🤔 Thought: 我需要分两步解决这个问题。第一步,找到苹果公司现任CEO的名字。第二步,找到他的年龄并计算平方。我应该先用搜索工具。
🎬 Action: Search
🛠️ Action Input: "current CEO of Apple Inc."
... (等待搜索结果)
👀 Observation: Tim Cook is the current CEO of Apple. He was born on November 1, 1960.
🤔 Thought: 好的,CEO是蒂姆·库克。现在我需要计算他的年龄。他出生于1960年11月1日。我需要计算从那时到现在的年份差。我可以用计算器工具。
🎬 Action: Calculator
🛠️ Action Input: 2023 - 1960 # (假设当前是2023年)
... (等待计算结果)
👀 Observation: Answer: 63
🤔 Thought: 他的年龄大约是63岁。现在我需要计算63的平方。
🎬 Action: Calculator
🛠️ Action Input: 63**2
... (等待计算结果)
👀 Observation: Answer: 3969
🤔 Thought: 我已经得到了所有信息。CEO是蒂姆·库克,他的年龄的平方是3969。我现在可以给出最终答案了。
✅ Final Answer: 苹果公司现任CEO是蒂姆·库克,他的年龄的平方是3969。

> Finished chain.

这个例子完美地展示了Agent的强大之处:它能将一个复杂任务自主地分解成多个步骤,并智能地选择和调用合适的工具来完成每一步。


第五章:挑战与未来 —— 成为一名负责任的魔法师

我们已经解锁了驾驭LLM的三层核心魔法。但强大的力量也伴随着巨大的责任和挑战。

  • 幻觉 (Hallucination):LLM有时会“一本正经地胡说八道”,编造出看似合理但实际上是错误的信息。RAG在一定程度上可以缓解这个问题,但无法完全根除。事实核查为答案提供来源是关键。

  • 成本 (Cost):调用LLM API是需要付费的,特别是对于GPT-4等强大模型。在设计应用时,必须考虑API调用的次数和成本控制。

  • 安全性 (Safety):警惕“提示注入”攻击。恶意用户可能会通过巧妙的Prompt,诱导你的应用执行非预期的、甚至是有害的操作。需要对用户输入进行严格的过滤和安全设计。

  • 伦理与偏见 (Ethics and Bias):LLM在训练数据中可能学到了人类社会的偏见。作为开发者,我们有责任设计应用来识别和减轻这些偏见,确保AI的公平和包容性。

未来已来,但仍在塑造之中。 LangChain、LlamaIndex等框架正在飞速发展,开源的LLM模型(如Llama、Mistral)也在迎头赶上。多模态(理解图像、声音)的能力正在成为主流。


结语:你的AI创世之旅

我们从一个简单的API调用开始,学会了如何通过提示工程与AI高效对话;我们掌握了RAG的炼金术,让AI能够学习和记忆我们的私有知识;我们还召唤出了能自主行动的AI智能体。

你现在所掌握的,已经不再是单纯的编程技巧,而是一套与AI协作、共创价值的全新方法论

现在,轮到你了。

  • 去构建一个能帮你总结会议纪要的工具。

  • 去创造一个能充当你个人编程导师的问答机器人。

  • 去设计一个能帮你自动规划旅行行程的智能体。

这个由LLM开启的新纪元,充满了无限的可能。唯一的限制,就是你的想象力。拿起你的代码“魔杖”,去探索、去实验、去创造。

你,就是下一代智能应用的缔造者。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐