åºäºåŸ®èœ¯åŒæºè¯Ÿçš Generative AI for BeginnersïŒâ 110k+ïŒæ·±åºŠæŽçïŒèŠçåçãå·¥çšãå®æå šéŸè·¯
ç®åœ
- ä»ä¹æ¯çæåŒ AIïŒä» 60 幎代å°ä»å€©
- LLM çå éšè¿äœæºå¶
- æš¡åéåå°åŸ
- Prompt EngineeringïŒå AI 诎è¯çèºæ¯
- åšæå®æïŒäžäžªå±æ¬¡ç代ç 瀺äŸ
- RAGïŒè®© AI æ¥æäœ çç§æç¥è¯åº
- Function CallingïŒè®© AI çæ£è°çšå·¥å ·
- AI AgentïŒä»å©æå°èªäž»å³ç
- Fine-TuningïŒå®å¶äžå±æš¡å
- ææ¯è·¯åŸéæ©æå
- åŠä¹ èµæºäžäžäžæ¥
1. åå²äžæ¬èŽš
åŸå€äººä»¥äžºçæåŒ AI æ¯ 2022 幎 ChatGPT 暪空åºäžææçïŒäœè¿é¡¹ææ¯å·²ç»é é ¿äº 60 å€å¹Žã
æ¶éŽçº¿æ»è§ïŒ
1960s ââ⺠åºäºè§åçè倩æºåšäººïŒç¥è¯åº + å
³é®è¯å¹é
ïŒ
ââ æ æ³æ©å±ïŒæ¢äžªè¯Žæ³å°±äžè®€è¯äº
1990s ââ⺠ç»è®¡æºåšåŠä¹ å
Žèµ·
ââ èœä»æ°æ®éåŠè§åŸïŒäœäžäžæç解匱
2010s ââ⺠深床åŠä¹ + RNNïŒåŸªç¯ç¥ç»çœç»ïŒ
ââ çè§£è¯ä¹ïŒèœåç¿»è¯/è¯é³è¯å«ïŒäœé¿ææ¬å€çå·®
2017 ââ⺠Transformer æ¶æïŒAttention is All You NeedïŒ
ââ é©åœæ§çªç ŽïŒèœå€çä»»æé¿åºŠïŒå¹¶è¡è®ç»
2020+ ââ⺠GPT-3 / ChatGPT / GPT-4
ââ çæåŒ AI çåïŒäººäººå¯çš
æ žå¿æŠå¿µäžå¥è¯çè§£ïŒ
çæåŒ AI æ¯èœå€æ ¹æ®äœ çèŸå ¥ïŒèªåšçææåãåŸåã代ç ãé³é¢çå 容ç人工æºèœææ¯ãäœ äžéèŠå代ç ïŒåªéèŠçšèªç¶è¯èšè¯Žåºäœ æ³èŠçïŒå®å°±èœç»åºç»æã
2. LLM å éšæºå¶
çè§£ LLM æä¹å·¥äœïŒæ¯çšå¥œå®çå ³é®ãäžé¢çšæçŽçœçæ¹åŒè§£éå®çäžäžªæ žå¿æ¥éª€ïŒ
LLM å€çäžæ¬¡è¯·æ±ç宿޿µçšïŒ
çšæ·èŸå
¥æå
â
âŒ
âââââââââââââââ
â Tokenizer â â ææååæ"è¯åïŒTokenïŒ"ïŒèœ¬äžºæ°å
â åè¯åš â äŸïŒ"Hello world" â [15496, 995]
âââââââââââââââ
â
âŒ
âââââââââââââââââââââââââââââââââââ
â Transformer æš¡å â
â â
â æ³šæåæºå¶ïŒAttentionïŒ â
â ââââââââââââââââââââââââââââ â
â â 对æ¯äžª Token 计ç®"æé" â â
â â éèŠçè¯æéé«ïŒåªå£°è¯äœ â â
â ââââââââââââââââââââââââââââ â
â â
â 颿µäžäžäžª Token çæŠçååž â
âââââââââââââââââââââââââââââââââââ
â
âŒ
æ ¹æ®æŠç + Temperature åæ°éæºéæ ·
â
âŒ
èŸåºäžäžª TokenïŒè¿œå å°äžäžæïŒåŸªç¯çŽå°ç»æ
â
âŒ
æç»åçæå
Temperature åæ°çŽè§çè§£ïŒ
Temperature = 0.0 â æ¯æ¬¡èŸåºå®å
šçžåïŒéå代ç ãç»æåä»»å¡ïŒ
Temperature = 0.7 â æäžå®éæºæ§ïŒéå对è¯ãå
容åäœïŒ â é»è®€
Temperature = 1.5 â éåžžéæºïŒéå倎è飿Žãåæåæ£ïŒ
䞺ä»ä¹ LLM äŒ"çŒé "å 容ïŒå¹»è§/HallucinationïŒïŒ
LLM çæ¬èŽšæ¯"颿µæå¯èœçäžäžäžªè¯"
宿²¡æ"æäžç¥é"è¿äžªé项ââåªèŠæèŸå
¥ïŒå®å°±äŒèŸåº
åœäœ é®å®äžç¥éçäºæ
æ¶ïŒæ¯åŠäœ å
¬åžå
éšæ°æ®ïŒïŒ
å®äŒçšç»è®¡äž"æåçç"å
容æ¥å¡«å
ïŒ
å¬èµ·æ¥åçäœå®å
šæ¯çŒçïŒ
è§£å³æ¹æ³ïŒ
ââ Prompt äžæç¡®è¯Ž"åŠæäžç¥éïŒè¯·çŽæ¥è¯Žäžç¥é"
ââ RAGïŒæ£çŽ¢å¢åŒºïŒïŒç»å®æäŸçå®çåèææ
ââ Fine-TuningïŒçšç宿°æ®éæ°è®ç»
3. æš¡åéå
é¢å¯¹çŒè±çŒä¹±çæš¡åïŒæä¹éïŒäžé¢è¿åŒ å°åŸåž®äœ å¿«éå®äœïŒ
æçšééæš¡åïŒ
äœ ç任塿¯ä»ä¹ïŒ
â
ââ⺠æåçæ / å¯¹è¯ / 代ç
â ââ æåŒºææïŒGPT-4o, Claude 3.5 Sonnet
â ââ æ§ä»·æ¯ïŒGPT-3.5-turbo, Mistral-7B
â ââ å®å
šå
èŽ¹åŒæºïŒLlama 3, Mistral
â
ââ⺠åŸåçæ
â ââ DALL-E 3ïŒOpenAIïŒéæåš ChatGPTïŒ
â ââ Stable DiffusionïŒåŒæºïŒå¯æ¬å°è¿è¡ïŒ
â ââ MidjourneyïŒåäžïŒæææå¥œïŒ
â
ââ⺠è¯é³è¯å«
â ââ WhisperïŒOpenAI åŒæºïŒæ¯æ 99 ç§è¯èšïŒ
â
ââ⺠åéåµå
¥ïŒçšäºæçŽ¢/RAGïŒ
ââ text-embedding-ada-002ïŒOpenAIïŒ
text-embedding-3-smallïŒæŽäŸ¿å®ïŒ
åŒæº vs éæºæä¹éïŒ
éæºæš¡åïŒOpenAI / Azure OpenAIïŒ åŒæºæš¡åïŒLlama / MistralïŒ
âââââââââââââââââââââââââââââââââ âââââââââââââââââââââââââ
â
æææå¥œïŒåŒç®±å³çš â
æ°æ®å®å
šç§æïŒäžå€äŒ
â
æ é管çåºç¡è®Ÿæœ â
坿¬å°éšçœ²ïŒé¶ææ¬
â
æç»æŽæ°ç»Žæ€ â
å¯ä»¥ Fine-Tuning 深床å®å¶
â æ Token ä»è޹ïŒå€§è§æš¡ææ¬é« â éèŠèªå·±çç®åèµæº
â æ°æ®èŠäžäŒ å°ç¬¬äžæ¹ â ææçšåŒ±ïŒéèŠæŽå€è°äŒ
â ææ°æ®éç§é¡Ÿè â ç»Žæ€ææ¬é«
4. Prompt Engineering
Prompt Engineering æ¯"çšå¯¹æ¹åŒå AI 对è¯"çææ¯ïŒæ¯ææ¬æäœãè§ææå¿«çäŒåææ®µã
4.1 Prompt çåºæ¬ææ
äžäžªå®æŽ Prompt çè§£åïŒ
ââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â System MessageïŒç³»ç»æç€ºïŒ â
â â å®ä¹ AI çè§è²ãæ§æ Œãè§å â
â â "äœ æ¯äžäœäžäžç Python å·¥çšåžïŒåçèŠç®æŽ..." â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â ContextïŒäžäžæ/èæ¯ç¥è¯ïŒ â
â â æäŸ AI éèŠäºè§£çèæ¯ä¿¡æ¯ â
â â äŸåŠïŒäžæ®µææ¡£å
å®¹ãæ°æ®åºç»æ â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â ExamplesïŒç€ºäŸïŒ â
â â ç» AI çäœ ææçèŸå
¥èŸåºæ ŒåŒ â
â â Few-shot åŠä¹ çæ žå¿ â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â User InstructionïŒçšæ·æä»€ïŒ â
â â æç¡®åè¯ AI èŠåä»ä¹ â
â â è¶å
·äœè¶å¥œïŒå
嫿 ŒåŒèŠæ± â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââ
4.2 Zero-Shot / One-Shot / Few-Shot 对æ¯
Zero-ShotïŒé¶æ ·æ¬ïŒââ çŽæ¥æé®
âââââââââââââââââââââââââââ
Prompt: "æäžé¢è¿å¥è¯ç¿»è¯ææ³è¯ïŒThe weather is nice today."
Output: "Le temps est beau aujourd'hui."
éçšïŒç®åéçšä»»å¡
âââââââââââââââââââââââââââââââââââââââââ
One-ShotïŒåæ ·æ¬ïŒââ ç»äžäžªäŸå
ââââââââââââââââââââââââââââââ
Prompt:
è±è¯: "I love programming" â æ³è¯: "J'aime la programmation"
è±è¯: "The weather is nice today" â æ³è¯:
Output: "Le temps est beau aujourd'hui."
éçšïŒææ ŒåŒèŠæ±çä»»å¡
âââââââââââââââââââââââââââââââââââââââââ
Few-ShotïŒå€æ ·æ¬ïŒââ ç»å€äžªäŸåïŒè®© AI åŠè§åŸ
ââââââââââââââââââââââââââââââââââââââââ
Prompt:
"The player ran the bases" â Baseball
"The player hit an ace" â Tennis
"The player hit a six" â Cricket
"The player made a slam-dunk" â
Output: Basketball â
ïŒAI æšæåºäºè§åŸïŒïŒ
éçšïŒåç±»ãæ ŒåŒèœ¬æ¢ãè§åŸæå
4.3 Prompt äŒå宿坹æ¯
äžé¢çäžäžªçå®ç"åäœä»»å¡"ïŒéæ¥äŒå Prompt ææåŠäœååïŒ
â å·®ç PromptïŒ
"åž®æå䞪ä»ç»"
ââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ð¶ æ®é PromptïŒ
"åž®æåäžæ®µäº§åä»ç»"
èŸåºïŒæ³æ³èè°ïŒæ²¡æéç¹
ââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
奜ç PromptïŒ
"""
äœ æ¯äžäœç§æäº§åææ¡äžå®¶ã
è¯·äžºäžæ¬Ÿ AI åäœå©æåäžæ®µäº§åä»ç»ïŒèŠæ±ïŒ
- ç®æ çšæ·ïŒå
容åäœè
ååäž»
- åæ°ïŒ100-150å
- è¯æ°ïŒäžäžäœäº²å
- éç¹åŒºè°ïŒçæ¶ãæºèœãæçš
- ç»å°Ÿå äžå¥è¡åšå¬å€ïŒCall to ActionïŒ
"""
èŸåºïŒç²Ÿåãæé对æ§ã笊åè¥éç®æ â
5. åšæå®æ
äžé¢æéŸåºŠåäžäžªå±æ¬¡ïŒæäŸå®æŽå¯è¿è¡ç代ç 瀺äŸã
ð¢ å ¥éšçº§ïŒæç®åç对è¯åºçš
# æç®åç OpenAI 对è¯ç€ºäŸ
# å®è£
ïŒpip install openai python-dotenv
import os
from openai import OpenAI
from dotenv import load_dotenv
load_dotenv()
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
def chat(user_message, system_message="äœ æ¯äžäžªå奜çAI婿"):
"""æåºç¡çå蜮对è¯"""
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": system_message},
{"role": "user", "content": user_message}
],
temperature=0.7,
max_tokens=500
)
return response.choices[0].message.content
# 䜿çšç€ºäŸ
print(chat("çšäžå¥è¯è§£éä»ä¹æ¯æºåšåŠä¹ "))
# èŸåºïŒæºåšåŠä¹ æ¯äžç§è®©è®¡ç®æºéè¿ä»æ°æ®äžèªåšåŠä¹ è§åŸïŒ
# èæ éæç¡®çŒçšç人工æºèœææ¯ã
# 忢è§è²
print(chat("è§£ééåœ", system_message="äœ æ¯äžäœç»5å²å°å©è®²æ
äºçèåž"))
# èŸåºé£æ Œå®å
šäžåïŒ
ð¡ è¿é¶çº§ïŒåžŠè®°å¿çå€èœ®å¯¹è¯ + ç»æåèŸåº
# è¿é¶ç€ºäŸïŒå€èœ®å¯¹è¯ + JSON ç»æåèŸåº
import json
from openai import OpenAI
client = OpenAI()
class ConversationBot:
"""
垊记å¿çå€èœ®å¯¹è¯æºåšäºº
å¯¹è¯æµçšïŒ
çšæ·èŸå
¥
â
âŒ
æ·»å å° messages åå²
â
âŒ
åéå
šéšåå²ç» LLM
â
âŒ
LLM è¿åïŒè¿œå å°åå²
â
âŒ
äžèœ®ç»§ç»ïŒAI è®°åŸä¹å诎çè¯ïŒ
"""
def __init__(self, system_prompt):
self.messages = [
{"role": "system", "content": system_prompt}
]
def chat(self, user_input):
# 远å çšæ·æ¶æ¯å°åå²
self.messages.append({
"role": "user",
"content": user_input
})
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=self.messages,
temperature=0.7
)
# 远å AI åå€å°åå²
assistant_reply = response.choices[0].message.content
self.messages.append({
"role": "assistant",
"content": assistant_reply
})
return assistant_reply
def clear(self):
"""æž
空对è¯åå²ïŒä¿ç system promptïŒ"""
self.messages = self.messages[:1]
# åºæ¯ïŒä»éç»æåææ¬äžæåç»æåä¿¡æ¯
def extract_info(text):
"""äœ¿çš JSON æš¡åŒæåç»æåæ°æ®"""
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{
"role": "user",
"content": f"""
ä»äžé¢ææ¬äžæåä¿¡æ¯ïŒè¿å JSON æ ŒåŒïŒ
{{
"name": "å§å",
"age": å¹ŽéŸæ°å,
"skills": ["æèœå衚"],
"experience_years": å·¥äœå¹Žéæ°å
}}
ææ¬ïŒ{text}
åªè¿å JSONïŒäžèŠå
¶ä»å
容ã
"""
}],
response_format={"type": "json_object"} # åŒºå¶ JSON èŸåº
)
return json.loads(response.choices[0].message.content)
# æµè¯
text = "åŒ äŒïŒ28å²ïŒæ5幎 Python åŒåç»éªïŒçæ DjangoãFastAPI å Docker"
result = extract_info(text)
print(result)
# èŸåºïŒ
# {
# "name": "åŒ äŒ",
# "age": 28,
# "skills": ["Python", "Django", "FastAPI", "Docker"],
# "experience_years": 5
# }
ðŽ é«çº§ïŒå®æŽçæµåŒèŸåº + é误å€ç + Token 计æ°
# é«çº§ç€ºäŸïŒç产级代ç
import tiktoken
import time
from openai import OpenAI, APIError, RateLimitError
client = OpenAI()
def count_tokens(text: str, model: str = "gpt-3.5-turbo") -> int:
"""ç²Ÿç¡®è®¡ç® Token æ°éïŒé¿å
è¶
åºéå¶"""
encoding = tiktoken.encoding_for_model(model)
return len(encoding.encode(text))
def stream_chat(
messages: list,
model: str = "gpt-3.5-turbo",
max_retries: int = 3
) -> str:
"""
æµåŒèŸåº + èªåšéè¯ïŒç产ç¯å¢æšèïŒ
æµåŒèŸåºæµçšïŒ
âââââââââââââââ ââââââââââââââââ ââââââââââââââââ
â åéè¯·æ± âââââââºâ æå¡åšéå ââââââºâ 宿¶æå°æ¯ â
â stream=True â â è¿å Token â â 䞪å笊 â
âââââââââââââââ ââââââââââââââââ ââââââââââââââââ
äŒç¹ïŒçšæ·çå°ç¬¬äžäžªåçå»¶è¿ä»3ç§éå°0.3ç§
"""
for attempt in range(max_retries):
try:
full_response = ""
# äœ¿çšæµåŒæ¥å£
with client.chat.completions.create(
model=model,
messages=messages,
stream=True, # å
³é®ïŒåŒå¯æµåŒ
temperature=0.7,
) as stream:
for chunk in stream:
delta = chunk.choices[0].delta
if delta.content:
print(delta.content, end="", flush=True)
full_response += delta.content
print() # æ¢è¡
return full_response
except RateLimitError:
wait_time = 2 ** attempt # ææ°éé¿
print(f"\néçéå¶ïŒçåŸ
{wait_time}s åéè¯...")
time.sleep(wait_time)
except APIError as e:
print(f"API é误ïŒ{e}")
raise
raise Exception("è¶
è¿æå€§éè¯æ¬¡æ°")
# 䜿çšç€ºäŸ
messages = [
{"role": "system", "content": "äœ æ¯äžäœ AI äžå®¶"},
{"role": "user", "content": "è§£éäžäž Transformer æ¶æ"}
]
# æ£æ¥ token çšé
total_tokens = sum(count_tokens(m["content"]) for m in messages)
print(f"èŸå
¥ Token æ°ïŒ{total_tokens}")
# æµåŒèŸåº
response = stream_chat(messages)
print(f"\nèŸåº Token æ°ïŒ{count_tokens(response)}")
6. RAG
RAGïŒRetrieval Augmented GenerationïŒæ£çŽ¢å¢åŒºçæïŒæ¯åœåäŒäž AI åºçšäžæéèŠçæ¶ææš¡åŒïŒè§£å³äº LLM "äžç¥éäœ å ¬åžæ°æ®" çæ žå¿é®é¢ã
RAG å·¥äœåçåŸ
ââââââââââââââââââââââââââââââââââââââââ
â RAG 宿޿¶æ â
ââââââââââââââââââââââââââââââââââââââââ
ãçŠ»çº¿é¶æ®µïŒæå»ºç¥è¯åºã
ç§æææ¡£/æ°æ®åº
(PDF/Word/çœé¡µ...)
â
âŒ
âââââââââââââââ
â ææ¡£åå â â ææ®µèœæè¯ä¹ååæå°åïŒChunkïŒ
â Chunking â æ¯å 200~500 Token
âââââââââââââââ
â
âŒ
âââââââââââââââââââ
â åéåµå
¥ â â è°çš Embedding æš¡å
â Embedding â ææå â é«ç»Žæ°ååé
â ada-002 ç â "è¹æ" â [0.23, -0.11, 0.87, ...]
âââââââââââââââââââ
â
âŒ
âââââââââââââââââââ
â åå
¥åéæ°æ®åº â â Qdrant / Chroma / Azure AI Search
â Vector DB â æ¯æçžäŒŒåºŠå¿«éæ£çŽ¢
âââââââââââââââââââ
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ãåšçº¿é¶æ®µïŒåççšæ·é®é¢ã
çšæ·æé®ïŒ"æä»¬å
¬åžç鿬Ÿæ¿çæ¯ä»ä¹ïŒ"
â
âŒ
âââââââââââââââââââ
â Query Embedding â â æé®é¢ä¹èœ¬æåé
âââââââââââââââââââ
â
âŒ
âââââââââââââââââââââââââââââââââââ
â åéçžäŒŒåºŠæçŽ¢ â
â æŸåºæçžå
³ç Top-K äžªææ¬å â
â äœåŒŠçžäŒŒåºŠïŒcos(Ξ) è¶å€§è¶çžäŒŒ â
âââââââââââââââââââââââââââââââââââ
â
âŒ
ââââââââââââââââââââââââââââââââââââââââââââââ
â æå»ºå¢åŒº Prompt â
â â
â System: "åªåºäºä»¥äžèµæåçé®é¢" â
â Context: [æ£çŽ¢å°çææ¬å1] â
â [æ£çŽ¢å°çææ¬å2] â
â [æ£çŽ¢å°çææ¬å3] â
â User: "æä»¬å
¬åžç鿬Ÿæ¿çæ¯ä»ä¹ïŒ" â
ââââââââââââââââââââââââââââââââââââââââââââââ
â
âŒ
âââââââââââââââââââ
â LLM â â GPT-4 / Claude ç
âââââââââââââââââââ
â
âŒ
"æ ¹æ®å
¬åžæ¿çæä»¶ïŒé欟éåšèŽä¹°å30倩å
..." â
ïŒçæ¡ææ®å¯æ¥ïŒäžåçŒé ïŒïŒ
RAG 宿Žä»£ç å®ç°
# å®æŽ RAG å®ç°ç€ºäŸ
# pip install openai chromadb tiktoken
import chromadb
from openai import OpenAI
client = OpenAI()
chroma_client = chromadb.Client()
# ââ ç¬¬äžæ¥ïŒå建åéæ°æ®åºå¹¶åå
¥ææ¡£ ââ
def build_knowledge_base(documents: list[str], collection_name="my_kb"):
"""
æå»ºç¥è¯åº
documents: ææ¡£å
容å衚
"""
collection = chroma_client.get_or_create_collection(collection_name)
for i, doc in enumerate(documents):
# äœ¿çš OpenAI Embedding æš¡åçæåé
embedding_response = client.embeddings.create(
input=doc,
model="text-embedding-ada-002"
)
embedding = embedding_response.data[0].embedding
# åå
¥åéæ°æ®åº
collection.add(
ids=[f"doc_{i}"],
embeddings=[embedding],
documents=[doc]
)
print(f"â
ç¥è¯åºæå»ºå®æïŒå
± {len(documents)} äžªææ¡£å")
return collection
# ââ ç¬¬äºæ¥ïŒæ£çŽ¢çžå
³å
容 ââ
def retrieve(query: str, collection, top_k=3):
"""
åéæ£çŽ¢ïŒæŸå°æçžå
³çææ¡£å
"""
# æé®é¢èœ¬æåé
query_embedding = client.embeddings.create(
input=query,
model="text-embedding-ada-002"
).data[0].embedding
# çžäŒŒåºŠæçŽ¢
results = collection.query(
query_embeddings=[query_embedding],
n_results=top_k
)
return results["documents"][0] # è¿åæçžå
³ç top_k äžªææ¡£å
# ââ ç¬¬äžæ¥ïŒRAG é®ç ââ
def rag_answer(query: str, collection):
"""
RAG 宿޿µçšïŒæ£çŽ¢ â å¢åŒº â çæ
"""
# æ£çŽ¢çžå
³å
容
relevant_docs = retrieve(query, collection)
context = "\n\n---\n\n".join(relevant_docs)
# æå»ºå¢åŒº Prompt
augmented_prompt = f"""
请åºäºä»¥äžåèèµæåçé®é¢ã
åŠæåèèµæäžæ²¡æçžå
³ä¿¡æ¯ïŒè¯·çŽæ¥è¯Ž"æåšç¥è¯åºäžæ²¡ææŸå°çžå
³ä¿¡æ¯"ïŒäžèŠçŒé çæ¡ã
ãåèèµæã
{context}
ãé®é¢ã
{query}
"""
# è°çš LLM çæçæ¡
response = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "äœ æ¯äžäžªäžäžçç¥è¯åºå©æïŒåªåºäºæäŸçèµæåçé®é¢ã"},
{"role": "user", "content": augmented_prompt}
],
temperature=0 # 讟䞺0è®©çæ¡æŽçš³å®
)
answer = response.choices[0].message.content
# æå°æ¥æºïŒå¢åŒºå¯ä¿¡åºŠïŒ
print("\nð åèæ¥æºïŒ")
for i, doc in enumerate(relevant_docs, 1):
print(f" [{i}] {doc[:80]}...")
return answer
# ââ 䜿çšç€ºäŸ ââ
# æš¡æå
¬åžå
éšææ¡£
company_docs = [
"鿬Ÿæ¿çïŒææå忝æ30倩æ çç±é欟ã鿬Ÿééè¿å®çœæäº€ç³è¯·ïŒ3-5äžªå·¥äœæ¥å
å€ç宿ã",
"äŒåå¶åºŠïŒé»éäŒå享å9æäŒæ ïŒééäŒå享å8æäŒæ ãæ¶èŽ¹æ»¡1000å
å级é»éäŒåã",
"é
éæ¿çïŒå
šåœå
é®ïŒ48å°æ¶å
å莧ãåè¿å°åºïŒè¥¿èãæ°ççïŒéé¢å€3-5倩ã",
"å®åæå¡ïŒäº§ååšä¿ä¿®æå
åºç°èŽšéé®é¢ïŒå
èŽ¹ç»Žä¿®ææŽæ¢ãä¿ä¿®æäžºèŽä¹°åäžå¹Žã",
]
collection = build_knowledge_base(company_docs)
# æé®
answer = rag_answer("æä¹°çäžè¥¿æ³é莧ïŒéèŠå 倩èœå°èŽŠïŒ", collection)
print(f"\nð€ åçïŒ{answer}")
7. Function Calling
Function Calling 让 LLM ä»"åªäŒè¯Žè¯"åæ"èœåäº"ââå®èœè¯å«çšæ·æåŸå¹¶è°çšäœ é¢å®ä¹çåœæ°ã
Function Calling å·¥äœæµçšåŸ
çšæ·é®ïŒ"å京æå€©å€©æ°æä¹æ ·ïŒ"
â
âŒ
âââââââââââââââââââââââââââââââââââââââââââ
â LLM åæïŒç¬¬äžæ¬¡è°çšïŒ â
â â
â å¯çšå·¥å
·ïŒ â
â - get_weather(city, date) â æ¥å€©æ° â
â - search_web(query) â æçŽ¢çœé¡µ â
â - send_email(to, body) â åé®ä»¶ â
â â
â LLM å³çïŒè¿äžªé®é¢éèŠè°çš get_weather â
âââââââââââââââââââââââââââââââââââââââââââ
â
⌠è¿å JSONïŒäžæ¯èªç¶è¯èšïŒïŒ
{
"function": "get_weather",
"arguments": {
"city": "å京",
"date": "tomorrow"
}
}
â
âŒ äœ çä»£ç æ§è¡è¿äžªåœæ°
real_weather = get_weather("å京", "tomorrow")
â "æŽå€©ïŒæé«æ°æž©28°CïŒæäœ18°CïŒåé£3级"
â
⌠æç»æè¿åç» LLMïŒç¬¬äºæ¬¡è°çšïŒ
âââââââââââââââââââââââââââââââââââââââââââ
â LLM çæèªç¶è¯èšåå€ â
â "å京æå€©å€©æ°æŽæïŒæ°æž©åš18-28°Cä¹éŽïŒ â
â åé£3级ïŒåºéšå¯ä»¥ç©¿èå€å¥ïŒäžçšåžŠäŒïŒ" â
âââââââââââââââââââââââââââââââââââââââââââ
宿Žä»£ç 瀺äŸ
# Function Calling 宿Žç€ºäŸ
import json
from openai import OpenAI
client = OpenAI()
# ââ ç¬¬äžæ¥ïŒå®ä¹å·¥å
·åœæ°ïŒçå®å®ç°ïŒââ
def get_weather(city: str, date: str) -> str:
"""æš¡æå€©æ° APIïŒå®é
项ç®äžæ¥çå® APIïŒ"""
weather_data = {
"å京": {"today": "æŽå€© 25°C", "tomorrow": "å€äº 22°C"},
"äžæµ·": {"today": "éŽå€© 20°C", "tomorrow": "å°éš 18°C"},
}
return weather_data.get(city, {}).get(date, "ææ æ°æ®")
def search_courses(role: str, topic: str, level: str) -> str:
"""æçŽ¢åŠä¹ 诟çšïŒæš¡æ APIïŒ"""
return json.dumps([
{"title": f"{topic} å
¥éšè¯Ÿçš", "url": "https://example.com/1", "level": level},
{"title": f"{topic} 宿项ç®", "url": "https://example.com/2", "level": "intermediate"},
], ensure_ascii=False)
# ââ ç¬¬äºæ¥ïŒçš JSON Schema æè¿°å·¥å
· ââ
# LLM éè¿è¿äºæè¿°å³å®"äœæ¶è°çšåªäžªåœæ°ãäŒ ä»ä¹åæ°"
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "è·åæå®ååžç倩æ°ä¿¡æ¯",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "ååžåç§°ïŒåŠïŒå京ãäžæµ·"
},
"date": {
"type": "string",
"enum": ["today", "tomorrow"],
"description": "æ¥è¯¢æ¥æ"
}
},
"required": ["city", "date"]
}
}
},
{
"type": "function",
"function": {
"name": "search_courses",
"description": "æçŽ¢åŠä¹ 诟çš",
"parameters": {
"type": "object",
"properties": {
"role": {"type": "string", "description": "åŠä¹ è
è§è²"},
"topic": {"type": "string", "description": "åŠä¹ äž»é¢"},
"level": {
"type": "string",
"enum": ["beginner", "intermediate", "advanced"]
}
},
"required": ["topic", "level"]
}
}
}
]
# ââ ç¬¬äžæ¥ïŒå®æŽçå·¥å
·è°çšåŸªç¯ ââ
def run_with_tools(user_message: str) -> str:
"""垊工å
·è°çšç宿Žå¯¹è¯åŸªç¯"""
messages = [
{"role": "system", "content": "äœ æ¯äžäžªæºèœå©æïŒå¯ä»¥æ¥å€©æ°åæçŽ¢è¯Ÿçšã"},
{"role": "user", "content": user_message}
]
available_functions = {
"get_weather": get_weather,
"search_courses": search_courses,
}
while True:
# è°çš LLM
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=messages,
tools=tools,
tool_choice="auto"
)
message = response.choices[0].message
# åŠææ²¡æå·¥å
·è°çšïŒçŽæ¥è¿åçæ¡
if not message.tool_calls:
return message.content
# å€çå·¥å
·è°çš
messages.append(message) # 远å AI ç"å³å®è°çšå·¥å
·"æ¶æ¯
for tool_call in message.tool_calls:
func_name = tool_call.function.name
func_args = json.loads(tool_call.function.arguments)
print(f"ð§ è°çšå·¥å
·ïŒ{func_name}({func_args})")
# æ§è¡å®é
åœæ°
result = available_functions[func_name](**func_args)
# æåœæ°ç»æè¿œå å°æ¶æ¯å衚
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": str(result)
})
# ç»§ç»åŸªç¯ïŒè®© LLM æ ¹æ®å·¥å
·ç»æçææç»åç
# æµè¯
print(run_with_tools("å京ä»å€©å€©æ°æä¹æ ·ïŒ"))
print(run_with_tools("ææ³åŠ PythonïŒæä»ä¹å
¥éšè¯ŸçšæšèïŒ"))
8. AI Agent
AI AgentïŒæºèœäœïŒæ¯åœåæåæ²¿çæ¹åââ让 LLM èªäž»è§åãæ§è¡å€æ¥éª€ä»»å¡ïŒäžåªæ¯"é®äžçäž"ïŒèæ¯"ç»äžäžªç®æ ïŒèªå·±æ³åæ³å®æ"ã
Agent äžæ®é LLM çåºå«
æ®é LLM 对è¯ïŒ
ââââââââââââââ
çšæ· â [é®é¢] â LLM â [çæ¡] ç»æ
âââââââââââââââââââââââââââââââââââââââââââââââââââ
AI Agent è¿äœæš¡åŒïŒReAct æ¡æ¶ïŒïŒ
ââââââââââââââââââââââââââââââââ
çšæ·ç»åºç®æ ïŒ"åž®æåæææ°ç AI 论æè¶å¿å¹¶åäžä»œæ¥å"
â
âŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââ
â Agent äž»åŸªç¯ â
â â
â THINKïŒæèïŒïŒéèŠå
æçŽ¢ææ°è®ºæ â
â â â
â ⌠â
â ACTïŒè¡åšïŒïŒè°çš search_papers("AI 2024") â
â â â
â ⌠â
â OBSERVEïŒè§å¯ïŒïŒè·åŸè®ºæå衚 â
â â â
â ⌠â
â THINKïŒéèŠåç±»æ±æ»è¿äºè®ºæ â
â â â
â ⌠â
â ACTïŒè°çš summarize(papers) â
â â â
â ⌠â
â OBSERVEïŒè·åŸæèŠ â
â â â
â ⌠â
â THINKïŒç°åšå¯ä»¥åæ¥åäº â
â â â
â ⌠â
â ACTïŒgenerate_report(summaries) â
â â â
â ⌠â
â OBSERVEïŒæ¥åçæå®æ¯ â
â â â
â ⌠â
â THINKïŒä»»å¡å®æ â
âââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âŒ
è¿å宿޿¥åç»çšæ· â
äž»æµ Agent æ¡æ¶å¯¹æ¯
ââââââââââââââââ¬âââââââââââââââ¬âââââââââââââââââ¬ââââââââââââââââââ
â æ¡æ¶ â æ žå¿ç¹ç¹ â éååºæ¯ â éŸåºŠ â
ââââââââââââââââŒâââââââââââââââŒâââââââââââââââââŒââââââââââââââââââ€
â LangChain â å·¥å
·çæäž°å¯ â éçšä»»å¡ â âââ äžç â
â â ç€Ÿåºæå€§ â RAG + Agent â â
ââââââââââââââââŒâââââââââââââââŒâââââââââââââââââŒââââââââââââââââââ€
â AutoGen â å€ Agent å¯¹è¯ â 倿任å¡åäœ â âââ äžç â
â (Microsoft) â 坿š¡æå¢é â 代ç çæ/å®¡æ¥ â â
ââââââââââââââââŒâââââââââââââââŒâââââââââââââââââŒââââââââââââââââââ€
â TaskWeaver â 代ç äŒå
â æ°æ®åæ â ââ èŸç®å â
â (Microsoft) â æ¯æDataFrame â çæåŸè¡š â â
ââââââââââââââââŒâââââââââââââââŒâââââââââââââââââŒââââââââââââââââââ€
â JARVIS â è°åºŠå
¶ä» AI â 倿š¡æä»»å¡ â ââââ èŸå€æ â
â â æš¡åæ¥åäœ â åŸå+æåæ··å â â
ââââââââââââââââŽâââââââââââââââŽâââââââââââââââââŽââââââââââââââââââ
AutoGen å€ Agent åäœç€ºäŸ
# AutoGen å€ Agent åäœïŒæš¡æç åå¢éè¯å®¡ä»£ç
# pip install pyautogen
import autogen
llm_config = {
"model": "gpt-4",
"api_key": "YOUR_API_KEY"
}
# ââ å建äžäžªäžåè§è²ç Agent ââ
# 1. çšåºå AgentïŒèŽèŽ£å代ç
coder = autogen.AssistantAgent(
name="çšåºå",
system_message="""äœ æ¯äžäœèµæ·± Python å·¥çšåžã
äœ çè莣æ¯ïŒçŒåæž
æ°ãé«æãææ³šéç代ç ã
åªå代ç ïŒäžåå
¶ä»äºã""",
llm_config=llm_config,
)
# 2. 代ç 审æ¥å AgentïŒèŽèޣ审æ¥
reviewer = autogen.AssistantAgent(
name="代ç 审æ¥å",
system_message="""äœ æ¯äžäœäž¥æ Œç代ç 审æ¥åã
äœ çè莣æ¯ïŒæŸåºä»£ç äžç bugãå®å
šé®é¢ãæ§èœé®é¢ã
ç»åºå
·äœçæ¹è¿å»ºè®®ã""",
llm_config=llm_config,
)
# 3. çšæ·ä»£çïŒä»£è¡šäººç±»åäž
user_proxy = autogen.UserProxyAgent(
name="ææ¯èŽèŽ£äºº",
human_input_mode="TERMINATE", # éå° TERMINATE å
³é®è¯å°±åæ¢
max_consecutive_auto_reply=5, # æå€èªåšåå€5蜮
code_execution_config={
"work_dir": "workspace",
"use_docker": False
}
)
# ââ å¯åšå€ Agent å¯¹è¯ ââ
# æµçšïŒææ¯èŽèŽ£äººæéæ± â çšåºåå代ç â 审æ¥åå®¡æ¥ â çšåºåä¿®æ¹ â 埪ç¯çŽå°æ»¡æ
groupchat = autogen.GroupChat(
agents=[user_proxy, coder, reviewer],
messages=[],
max_round=10
)
manager = autogen.GroupChatManager(
groupchat=groupchat,
llm_config=llm_config
)
# åèµ·ä»»å¡
user_proxy.initiate_chat(
manager,
message="请垮æåäžäžª Python åœæ°ïŒå®ç°å¯¹å衚çå¿«éæåºïŒèŠæ±å
å«èŸ¹çå€çåç±»åæ£æ¥ã"
)
# AutoGen äŒèªåšè¿è¡å€èœ®å¯¹è¯ïŒ
# çšåºåïŒååºåç代ç
# 审æ¥åïŒæåºçŒºå°ç±»å泚解ãèŸ¹çæ²¡å€ç None
# çšåºåïŒä¿®æ¹ä»£ç
# 审æ¥åïŒç¡®è®€éè¿
# ææ¯èŽèŽ£äººïŒæ»¡æïŒç»æ¢
LangChain Agent 宿Žç€ºäŸ
# LangChain AgentïŒåžŠå·¥å
·çèªäž»ä»»å¡æ§è¡
# pip install langchain langchain-openai
from langchain_openai import ChatOpenAI
from langchain.agents import create_react_agent, AgentExecutor
from langchain.tools import tool
from langchain import hub
# ââ å®ä¹å·¥å
·ïŒAgent å¯ä»¥è°çšçåœæ°ïŒââ
@tool
def calculate(expression: str) -> str:
"""è®¡ç®æ°åŠè¡šèŸŸåŒïŒåŠ '2 + 3 * 4'ãæ³šæïŒåªèœçšäºå®å
šçæ°åŠè®¡ç®ã"""
try:
# å®å
šè¯äŒ°ïŒåªå
讞æ°ååè¿ç®ç¬ŠïŒ
allowed = set('0123456789+-*/.() ')
if not all(c in allowed for c in expression):
return "é误ïŒäžæ¯æçå笊"
result = eval(expression)
return str(result)
except Exception as e:
return f"计ç®é误: {e}"
@tool
def search_knowledge(query: str) -> str:
"""åšç¥è¯åºäžæçŽ¢ä¿¡æ¯ãçšäºæ¥æŸäžäžç¥è¯ãæ¿çææ¡£çã"""
# è¿éè¿æ¥çå®ç RAG ç³»ç»
knowledge_base = {
"鿬Ÿæ¿ç": "èŽä¹°å30倩å
å¯ç³è¯·é欟ïŒå®¡æ ž3-5äžªå·¥äœæ¥",
"äŒåæç": "é»éäŒå享9æïŒééäŒå享8æ",
"ææ¯æ¯æ": "å·¥äœæ¥9:00-18:00ïŒçµè¯ 400-xxx-xxxx"
}
for key, value in knowledge_base.items():
if key in query:
return value
return "æªæŸå°çžå
³ä¿¡æ¯"
@tool
def send_notification(message: str, channel: str = "email") -> str:
"""åééç¥æ¶æ¯ãchannel å¯ä»¥æ¯ email æ smsã"""
print(f"ðš åé{channel}éç¥: {message}")
return f"éç¥å·²æååéå° {channel}"
# ââ å建 Agent ââ
llm = ChatOpenAI(model="gpt-4", temperature=0)
tools = [calculate, search_knowledge, send_notification]
# äœ¿çš ReAct æç€ºæš¡æ¿ïŒæèâè¡åšâè§å¯åŸªç¯ïŒ
prompt = hub.pull("hwchase17/react")
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True, # æå°æ¯äžæ¥æèè¿çš
max_iterations=5
)
# ââ è¿è¡ Agent ââ
result = agent_executor.invoke({
"input": "åž®ææ¥è¯¢éæ¬Ÿæ¿çïŒç¶å计ç®åп鿬Ÿé颿¯1299å
ïŒé欟æç»è޹æ¯1.5%ïŒå®é
鿬Ÿæ¯å€å°é±ïŒæååé®ä»¶éç¥çšæ·ã"
})
# Agent äŒèªåšïŒ
# 1. THINK: éèŠå
æ¥é欟æ¿ç
# 2. ACT: è°çš search_knowledge("鿬Ÿæ¿ç")
# 3. OBSERVE: åŸå°é欟æ¿çææ¬
# 4. THINK: éèŠè®¡ç®å®é
鿬Ÿéé¢
# 5. ACT: è°çš calculate("1299 * (1 - 0.015)")
# 6. OBSERVE: åŸå° 1279.515
# 7. THINK: éèŠåéç¥
# 8. ACT: è°çš send_notification(...)
# 9. OBSERVE: éç¥å·²åé
# 10. è¿åæç»ç»æ
print(result["output"])
9. Fine-Tuning
åœ Prompt Engineering å RAG éœæ»¡è¶³äžäºéæ±æ¶ïŒFine-TuningïŒåŸ®è°ïŒå°±æ¯ç»ææŠåšââçšäœ èªå·±çæ°æ®éæ°è®ç»æš¡åã
äžç§äŒåçç¥å¯¹æ¯
éæ©äŒåçç¥çå³çæ ïŒ
åŒå§
â
âŒ
äœ çé®é¢æ¯ä»ä¹ïŒ
â
ââ⺠暡åäžäºè§£äœ çç§ææ°æ®ïŒå
¬åžææ¡£/产åä¿¡æ¯ïŒ
â â
â âŒ
â æ°æ®é倧åïŒæ¯åŠéèŠå®æ¶æŽæ°ïŒ
â ââ æ¯ â çš RAGïŒæ£çŽ¢å¢åŒºïŒâ
æšèéŠé
â ââ åŠïŒæ°æ®çš³å® â èè Fine-Tuning
â
ââ⺠暡åèŸåºé£æ Œ/æ ŒåŒäžç¬ŠåèŠæ±ïŒå€ªæ£åŒ/倪éæ/æ ŒåŒä¹±ïŒ
â ââ⺠Fine-Tuning â
ïŒçšäœ çæ ·æ¬è®ç»é£æ ŒïŒ
â
ââ⺠暡ååšç¹å®é¢å衚ç°å·®ïŒå»ç/æ³åŸ/代ç ç¹å®æ¡æ¶ïŒ
â ââ⺠Fine-Tuning â
â
ââ⺠éèŠåå° Token çšéïŒæ¯æ¬¡ Few-Shot 倪莵ïŒ
ââ⺠Fine-Tuning â
ïŒè®ç»åäžåéèŠå€§é瀺äŸïŒ
ææ¬/ææå¯¹æ¯ïŒ
äœææ¬ é«ææ¬
â â
äœå€æåºŠ Prompt Engineering âââââââââââââââââââº
RAG
é«å€æåºŠ Fine-Tuning ââââº
ä»å€Žè®ç»ïŒæå°æ°åºæ¯ïŒ
Fine-Tuning æ°æ®å倿 ŒåŒ
# Fine-Tuning æ°æ®åå€ç€ºäŸïŒOpenAI æ ŒåŒïŒ
# æ°æ®æ ŒåŒïŒJSONLïŒæ¯è¡äžäžªè®ç»æ ·æ¬
import json
# è®ç»æ°æ®ç€ºäŸïŒè®©æš¡ååŠä¹ ç¹å®ç客æåå€é£æ Œ
training_data = [
{
"messages": [
{"role": "system", "content": "äœ æ¯XXå
¬åžäžäžå®¢æïŒè¯æ°äº²åïŒåçç®æŽã"},
{"role": "user", "content": "æçå¿«éè¿æ²¡å°ïŒæä¹æ¥è¯¢ïŒ"},
{"role": "assistant", "content": "æšå¥œïŒæšå¯ä»¥éè¿ä»¥äžæ¹åŒæ¥è¯¢ïŒ\n1. ç»åœå®çœâ订åäžå¿âæ¥çç©æµ\n2. åå€çä¿¡ãæ¥è¯¢+订åå·ã\n3. èŽçµ 400-xxx-xxxx\n\nåŠæé®é¢éæ¶èç³»æä»¬ ð"}
]
},
{
"messages": [
{"role": "system", "content": "äœ æ¯XXå
¬åžäžäžå®¢æïŒè¯æ°äº²åïŒåçç®æŽã"},
{"role": "user", "content": "产å莚éæé®é¢ïŒæ³é莧"},
{"role": "assistant", "content": "éåžžæ±æç»æšåžŠæ¥äžäŸ¿ïŒèŽšéé®é¢æä»¬100%èŽèŽ£ã\n\né莧æµçšïŒ\n1. æç
§äžäŒ é®é¢åŸçïŒè®¢å诊æ
页ïŒ\n2. éæ©ã莚éé®é¢é莧ã\n3. 客æ24å°æ¶å
å®¡æ ž\n4. å®¡æ žéè¿åäžéšåä»¶ïŒæ éæšæ¿æ
è¿è޹\n\nè¯·é®æšæ¹äŸ¿ç°åšæäº€ç³è¯·åïŒ"}
]
},
# ... è³å°åå€ 50-100 䞪é«èŽšéæ ·æ¬
]
# ä¿å䞺 JSONL æ ŒåŒ
with open("training_data.jsonl", "w", encoding="utf-8") as f:
for item in training_data:
f.write(json.dumps(item, ensure_ascii=False) + "\n")
print(f"â
è®ç»æ°æ®å·²ä¿åïŒå
± {len(training_data)} æ¡æ ·æ¬")
# äžäŒ å¹¶å¯åš Fine-Tuning ä»»å¡ïŒOpenAIïŒ
from openai import OpenAI
client = OpenAI()
# ç¬¬äžæ¥ïŒäžäŒ è®ç»æ°æ®
with open("training_data.jsonl", "rb") as f:
upload_response = client.files.create(
file=f,
purpose="fine-tune"
)
file_id = upload_response.id
print(f"æä»¶äžäŒ æåïŒID: {file_id}")
# ç¬¬äºæ¥ïŒå建 Fine-Tuning ä»»å¡
ft_job = client.fine_tuning.jobs.create(
training_file=file_id,
model="gpt-3.5-turbo",
hyperparameters={
"n_epochs": 3, # è®ç»èœ®æ°
"batch_size": 4, # æ¹æ¬¡å€§å°
"learning_rate_multiplier": 1.5
}
)
print(f"Fine-Tuning ä»»å¡å·²å建: {ft_job.id}")
print(f"ç¶æ: {ft_job.status}")
# éåžžéèŠ 10 åéå°å å°æ¶ïŒåå³äºæ°æ®é
# ç¬¬äžæ¥ïŒäœ¿çšåŸ®è°åçæš¡å
# ft_job.fine_tuned_model å°±æ¯æ°æš¡åçåç§°
response = client.chat.completions.create(
model=ft_job.fine_tuned_model, # 䜿çšåŸ®è°æš¡å
messages=[
{"role": "system", "content": "äœ æ¯XXå
¬åžäžäžå®¢æïŒè¯æ°äº²åïŒåçç®æŽã"},
{"role": "user", "content": "æç订åä»ä¹æ¶åå莧ïŒ"}
]
)
print(response.choices[0].message.content)
# èŸåºé£æ Œå°å®å
šç¬Šåäœ è®ç»æ°æ®ç飿 ŒïŒ
10. ææ¯è·¯åŸéæ©
读å°è¿éïŒäœ å¯èœåšæ³ïŒè¿ä¹å€ææ¯ïŒæç项ç®å°åºè¯¥çšåªäžªïŒäžé¢æ¯äžåŒ 宿Žçå³çå°åŸã
äŒäž AI åºç𿿝éåå šæ¯åŸ
âââââââââââââââââââââââââââââââââââââââââââââââââââ
â äœ èŠæå»ºä»ä¹ç±»åçåºçšïŒ â
ââââââââââââââââââââ¬âââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââââââââŒâââââââââââââââââââââââââââââââ
â â â
⌠⌠âŒ
âââââââââââââââ âââââââââââââââ âââââââââââââââ
â å¯¹è¯ / é®ç â â å
å®¹çæ â â èªåšåä»»å¡ â
ââââââââ¬âââââââ ââââââââ¬âââââââ ââââââââ¬âââââââ
â â â
⌠⌠âŒ
éèŠç§æç¥è¯ïŒ éèŠç¹å®é£æ Œ/æ ŒåŒïŒ éèŠå€æ¥éª€æ§è¡ïŒ
ââ æ¯ â RAG ââ æ¯ â Fine-Tuning ââ æ¯ â AI Agent
ââ åŠ â çŽæ¥è°çš API ââ åŠ â Prompt Engineering â
â
éèŠè°çšå€éš APIïŒ
ââ æ¯ â Function Calling
åµå
¥ Agent äž
宿޿æ¯ç»åæšèïŒ
åºæ¯1ïŒäŒäžå
éšç¥è¯åºå©æ
ââââââââââââââââââââââââââ
APIïŒAzure OpenAIïŒ
+ RAGïŒåéæ°æ®åºåäŒäžææ¡£ïŒ
+ Function CallingïŒæ¥ HR ç³»ç»/ERPïŒ
+ Fine-TuningïŒå¯éïŒç»äžåç飿 ŒïŒ
åºæ¯2ïŒä»£ç 婿
âââââââââââââââ
GPT-4 / Claude
+ Fine-TuningïŒè®ç»åšäœ ç代ç åºäžïŒ
+ Function CallingïŒæ§è¡ä»£ç æµè¯ïŒ
+ AgentïŒèªåšä¿® Bug 埪ç¯ïŒ
åºæ¯3ïŒå®¢ææºåšäºº
âââââââââââââââââ
GPT-3.5-turboïŒææ¬äœïŒ
+ Fine-TuningïŒåŠä¹ åçè¯æ°ïŒ
+ RAGïŒäº§åæå/FAQïŒ
+ å
容å®å
šè¿æ»€
åºæ¯4ïŒæ°æ®åæ Agent
âââââââââââââââââââââ
GPT-4
+ Function CallingïŒæ¥æ°æ®åº/çæåŸè¡šïŒ
+ AutoGen / TaskWeaverïŒå€æ¥åæïŒ
+ ä»£ç æ§è¡ç¯å¢
èŽèޣ任 AI çåå±é²æ€äœç³»
è¿æ¯åŸ®èœ¯è¯Ÿçšç¹å«åŒºè°çïŒä»åºå±å°åºçšå±çå®å šé²æ€ïŒäžèœåªæ¯"å 䞪 if"äºäºïŒ
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â çšæ·çé¢å±ïŒç¬¬4å±ïŒ â
â ⢠éå¶èŸå
¥ç±»åïŒäžå
讞èŸå
¥ HTML/èæ¬ïŒ â
â ⢠对ææé®é¢æç€º"请åšè¯¢äžäžäººå£«" â
â ⢠æç¡®æ 泚"AI çæå
容ïŒä»
äŸåè" â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â Meta Prompt å±ïŒç¬¬3å±ïŒ â
â ⢠System Prompt 讟眮æž
æ°çè¡äžºèŸ¹ç â
â ⢠"åŠæé®é¢è¶
åºèåŽïŒè¯·ç€Œè²æç»" â
â â¢ äœ¿çš RAG éå¶æš¡ååªåŒçšå¯ä¿¡æ¥æº â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â å®å
šç³»ç»å±ïŒç¬¬2å±ïŒ â
â ⢠Azure AI Content SafetyïŒåŸ®èœ¯å
å®¹è¿æ»€ APIïŒ â
â â¢ æ£æµïŒä»æšãæŽåãè²æ
ãèªæäŒ€å®³çå
容 â
â â¢ æ£æµ Prompt Injection 泚å
¥æ»å» â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â æš¡åéæ©å±ïŒç¬¬1å±ïŒ â
â â¢ å°æš¡å + ç¹å®çšé > 倧暡å + éçšçšéïŒæŽå¯æ§ïŒ â
â â¢ äœ¿çš Fine-Tuning å尿害èŸåºé£é© â
â â¢ å®æçº¢éæµè¯ïŒRed TeamingïŒïŒäž»åšæŸæŒæŽ â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
é«çº§ Prompt æå·§éæ¥è¡š
åºäºç¬¬ 5 ç« çè¿é¶å 容ïŒè¿éæŽç䞺äžä»œå®çšéæ¥å¡ïŒ
æå·§ éçšåºæ¯ 瀺äŸå
³é®è¯
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
Chain-of-Thought æ°åŠ/é»èŸ/æšçé®é¢ "äžæ¥äžæ¥æè..."
倿åæä»»å¡ "Let's think step by step"
Self-Refine 代ç äŒåãæç« æ¶Šè² "æåºäžé¢çæ¡ç3䞪é®é¢å¹¶æ¹è¿"
ä»»äœèŽšéèŠæ±é«ççæä»»å¡
Few-Shot æ ŒåŒèœ¬æ¢ãåç±»ãæœå çŽæ¥ç»3-5䞪èŸå
¥èŸåºäŸå
Generated Know. éèŠäžäž/é¢åç¥è¯æ¶ å
让 AI çæèæ¯ç¥è¯ïŒåæé®
倿äžå¡åºæ¯ "å
ä»ç»Xçèæ¯ïŒç¶ååç..."
Least-to-Most 倧å倿任å¡åè§£ "æè¿äžªä»»å¡åè§£æ5䞪æ¥éª€ïŒ
æ°æ®ç§åŠ/项ç®è§å ç¶å鿥æ§è¡"
Maieutic éªè¯ AI çæ¡æ£ç¡®æ§ "è§£éäœ çæ¡äžæ¯äžªèŠç¹çäŸæ®"
é«åç¡®æ§èŠæ±åºæ¯
Temperature æ§å¶ïŒ
代ç çæ/ç»æåæ°æ® â temperature=0.0~0.2
æ¥åžžé®ç/åæ â temperature=0.5~0.7ïŒé»è®€ïŒ
åæåäœ/倎èé£æŽ â temperature=0.8~1.0
11. äžäžæ¥
LLMOpsïŒç产级 AI åºçšç宿Žçåœåšæ
åŠæäœ èŠæ AI åºçšä» Demo æšåç产ïŒéèŠèè宿Žçè¿ç»Žäœç³»ïŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââ
â LLMOps 宿Žçåœåšæ â
ââââââââââââââââââââââââââââââââââââââââââââââââââââ
ââââââââââ ââââââââââ ââââââââââââââ ââââââââââââ ââââââââââ
â æ¢çŽ¢ ââââºâ åå ââââºâ æå»ºå¢åŒº ââââºâ è¯äŒ°æµè¯ ââââºâ äžçº¿ â
â Ideate â âPrototypeâ â Build/RAG â â Evaluate â âDeploy â
ââââââââââ ââââââââââ ââââââââââââââ ââââââââââââ âââââ¬âââââ
â â â â â
éæ©æš¡å Prompt Flow Fine-Tune / æ žå¿ææ çæ§
å®ä¹ç®æ å¿«ééªè¯ RAG éæ è¯æµ åèŠ
â
ââââââââââââââââââââââââââââââââââââ
â
ââââââââââââŒâââââââââââ
â æç»çæ§ïŒLLMOpsïŒ â
â â
â ð æ žå¿è¯äŒ°ææ ïŒ â
â ⢠QualityïŒèŽšéïŒ â
â ⢠HarmïŒæå®³æ§ïŒ â
â ⢠HonestyïŒè¯å®ïŒ â
â ⢠CostïŒææ¬ïŒ â
â ⢠LatencyïŒå»¶è¿ïŒ â
âââââââââââââââââââââââ
æšèåŠä¹ è·¯åŸïŒç²Ÿç¡®çïŒ
第 1 åšïŒåºç¡å
¥éš
âââââââââââââââââââââââââââââââââââââââ
â¡ å®æ Lesson 00ïŒé
奜ç¯å¢ïŒGitHub Codespaces æç®åïŒ
â¡ å®æ Lesson 01-02ïŒçè§£ LLM åçåæš¡åå·®åŒ
â¡ åšæïŒçš OpenAI API ååºç¬¬äžäžªå¯¹è¯çšåº
â¡ ç®æ ïŒèœè§£é"ä»ä¹æ¯ Token""Temperature æ¯ä»ä¹"
第 2 åšïŒPrompt å·¥çšæ žå¿
âââââââââââââââââââââââââââââââââââââââ
â¡ å®æ Lesson 04-05ïŒPrompt åºç¡+è¿é¶æå·§
â¡ ç»ä¹ ïŒåäžäžªä»»å¡ïŒçš Zero-Shot / Few-Shot / CoT åè¯äžæ¬¡
â¡ å®æ Lesson 06-07ïŒææ¬çæåè倩åºçš
â¡ ç®æ ïŒèœååº"äžäžçº§"System PromptïŒçè§£è§è²ãæä»€ãæ ŒåŒå犻
第 3 åšïŒæå»ºçå®åºçš
âââââââââââââââââââââââââââââââââââââââ
â¡ å®æ Lesson 08+15ïŒåéæ°æ®åº + RAG
â¡ åšæïŒç»èªå·±çææ¡£/ç¬è®°æå»ºäžäžªé®çç³»ç»
â¡ å®æ Lesson 11ïŒFunction Calling
â¡ ç®æ ïŒèœæå»ºäžäžªåºäºç§ææ°æ®ãäŒè°çš API çåºçš
第 4-5 åšïŒè¿é¶æ·±å
âââââââââââââââââââââââââââââââââââââââ
â¡ å®æ Lesson 17ïŒAI AgentïŒLangChain æ AutoGenïŒ
â¡ å®æ Lesson 09ïŒåŸåçæïŒDALL-EïŒ
â¡ å®æ Lesson 13-14ïŒå®å
š+çåœåšæ
â¡ ç®æ ïŒå®æäžäžª End-to-End çå°é¡¹ç®å¹¶éšçœ²
第 6-8 åšïŒå¯éè¿é¶ïŒ
âââââââââââââââââââââââââââââââââââââââ
â¡ å®æ Lesson 16ïŒåŒæºæš¡å + Hugging Face
â¡ å®æ Lesson 18ïŒFine-Tuning 埮è°
â¡ å®æ Lesson 19-21ïŒSLMãMistralãMeta ç³»å
â¡ ç®æ ïŒå
·å€å®æŽçæš¡åéåãè°äŒãéšçœ²èœå
é å¥çæèµæº
宿¹å¹³å°
ââââââââââââââââââââââââââââââââââââââââââââââââââ
Azure AI Studio https://ai.azure.com
â æš¡åç®åœãPrompt FlowãFine-Tuningãè¯äŒ°ïŒäžç«åŒ
GitHub Codespaces åšä»åºé¡µé¢ç¹ Code â Codespaces
â é¶é
眮åšçº¿åŒåç¯å¢ïŒ30ç§å¯åš
OpenAI Playground https://platform.openai.com/playground
â å¯è§åè°è¯ PromptïŒå¯¹æ¯äžåæš¡å
HuggingFace Hub https://huggingface.co
â åŒæºæš¡åãæ°æ®éãåšçº¿ Demo
瀟åºäº€æµ
ââââââââââââââââââââââââââââââââââââââââââââââââââ
Azure AI Discord è¯Ÿçš README äžæéè¯·éŸæ¥
GitHub Discussions https://github.com/microsoft/generative-ai-for-beginners/discussions
ååšæå
读å®è¿ç¯ïŒäœ å·²ç»èµ°å®äºäžæ¡ä»"ä»ä¹æ¯çæåŒ AI"å°"åŠäœåšç产ç¯å¢å®å šè¿è¡ AI åºçš"ç宿޿ çšã以äžå ç¹åŒåŸåå€è®°äœïŒ
LLM äžæ¯"å šç¥å šèœçç¥"ïŒèæ¯äžäžª"æŠç颿µæºåš"ã çè§£è¿äžç¹ïŒäœ å°±äžäŒå¯¹å¹»è§æå°æ²®äž§ïŒä¹äžäŒç²ç®ä¿¡ä»»å®çæ¯äžäžªèŸåºã
äžæé¥åè§£é 90% çåºçšåºæ¯ïŒ Prompt EngineeringïŒæäœææ¬ïŒâ RAGïŒç§ææ°æ®ïŒâ Function CallingïŒè¿æ¥ç°å®äžçïŒãFine-Tuning å Agent æ¯éŠäžæ·»è±ã
å®å šäžèŽ£ä»»äžæ¯äºåçè¡¥äžïŒèæ¯ä»ç¬¬äžå€©å°±èŠå åµç讟计ååã å å®¹è¿æ»€ã蟹ç讟眮ãçº¢éæµè¯ïŒçŒºäžäžå¯ã
æå¿«çåŠä¹ æ¹åŒæ°žè¿æ¯åšæã Fork è¿äžªä»åºïŒä» Lesson 00 çç¯å¢é 眮åŒå§ïŒèŸ¹è¯»èŸ¹è·ä»£ç ïŒäžäžªæåäœ å¯¹çæåŒ AI ççè§£äŒåç莚çé£è·ã