Ϊʲôͬһ¸ö½Ó¿Úÿ´Î·µ»Ø¶¼²»Í¬£¿´óÄ£ÐͿɿ¿¶ÏÑÔд·¨½âÎö
ʱ¼ä£º2026-08-12 | ×÷Õߣº318050 | ÔĶÁ£º0AI ²âÊÔ¿ª·¢ÃæÊÔ¸ßÆµÌ⣺¡°´óÄ£Ð͵ÄÊä³öÊDz»È·¶¨µÄ£¬ÄãÔõô×ö×Ô¶¯»¯²âÊÔ£¿¡±
ÕâÆªÓÃÒ»¸öÕæÊµÏßÉϹÊÕÏ£¬ÍêÕû»¹Ô AI ²âÊÔ¿ª·¢¹¤³ÌʦµÄ´¦Àí¹ý³Ì¡£
ÖØµã°üÀ¨£ºÔõô¶¨Î»¡¢Ôõôд´úÂë¡¢×îºó³Áµí³Éʲô·½·¨¡£
Ò»¡¢ÕæÊµ¹ÊÕÏ£º¶ÏÑÔÌìÌìºì£¬ºóÀ´ÓÐÈ˰ÑËü¹ØÁË
ijµçÉ̹«Ë¾µÄÖÇÄܿͷþÏîÄ¿À²âÊÔ¹¤³ÌʦСÖܸø¡°¶©µ¥×´Ì¬²éѯ¡±Õâ¸ö LLM ½Ó¿ÚдÁË×Ô¶¯»¯ÓÃÀý£¬¶ÏÑÔдµÃºÜ´«Í³£º
```python
assert response.text == "ÄúµÄ¶©µ¥ TEST-1001 ÒÑ·¢»õ£¬Ô¤¼Æ3ÌìÄÚËÍ´ï"
```
¸ÕÉÏÏßÄÇÒ»ÖÜ£¬ÕâÌõÓÃÀý¼¸ºõÌìÌì°Ñ CI ´òºì¡£
Ã÷Ã÷ιµÄÊÇͬһ·ÝÊäÈ룬ģÐͽñÌì»ØµÄÊÇ¡°ÒÑ·¢»õ£¬Ô¤¼Æ3ÌìËʹ£¬Ã÷ÌìÓÖ±ä³É¡°ÄúºÃ£¬°ü¹üÒÑÔÚ·ÉÏÀ²~¡±£¬µ½Á˺óÌ죬¸É´àÖ±½ÓÇгÉÁË markdown ÁÐ±í¡£
СÖÜÒ»¿ªÊ¼»¹ÊÔ×ŰѶÏÑÔ·Å¿í£¬¸Ä³É `assert "·¢»õ" in response.text`¡£
À´»ØÕÛÌÚÁ˼¸ÂÖÖ®ºó£¬ËûʵÔÚûÁËÄÍÐÄ£¬Ë÷ÐÔ°ÑÓÃÀýÖ±½Ó½ûÓã¬Ö»ÁôÏÂÒ»¾ä±¸×¢£º¡°LLM Êä³öËæ»ú£¬¶ÏÑÔûÒâÒ塱¡£
ÈýÖܺ󣬰ëÒ¹¸æ¾¯£º¶©µ¥²éѯ¹¦ÄÜÕûÌå²»¿ÉÓá£
ÅŲ鷢ÏÖ£¬Ä£ÐÍÊä³öÇÄÇıä³ÉÁË¡°´ø markdown ´úÂë¿éµÄ JSON¡±¡ª¡ªÄÚÈÝÆäʵû´í£¬µ«ÏÂÓηþÎñÖ±½Ó `json.loads()`£¬Óöµ½ ``` °ü¹ü¾ÍÅ×Òì³£¡£
ÖÂÃüµÄÊÇ£¬ÕâÌõÓÃÀýÔç¾Í±»½ûÓÃÁË£¬·¢²¼Ç°Ã»ÓÐÈκÎÀ¹½Ø£¬¹ÊÕϳÖÐøÁË 40 ·ÖÖÓ¡£
¸´ÅÌʱÍŶӲÅÒâʶµ½£º²»ÊÇ´óÄ£ÐͲ»Äܲ⣬¶øÊÇÓþ«È·Æ¥ÅäµÄ¾É˼·ȥ²â£¬Ò»¶¨»á¾Àú¡°ÌìÌìÎó±¨ ¡ú Âé±Ô·ÅÆú ¡ú ¹ÊÕÏÂã±¼¡±Õâ¸öËÀÍöÑ»·¡£
¶þ¡¢ÏÈÆÆ³ýÒ»¸öÎóÇø£ºtemperature=0 Ò²²»±£Ö¤Öð×ÖÏàͬ
ÃæÊÔÀïºÜ¶àÈ˵ÚÒ»·´Ó¦ÊÇ£º¡°°Ñ temperature Éè³É 0£¬Êä³ö²»¾Í¹Ì¶¨ÁËÂ𣿡±
»¹²»¹»¡£
°Ñ temperature ÉèΪ 0£¬±¾ÖÊÉÏÖ»ÊÇÈòÉÑù¹ý³ÌÍË»¯³ÉÖ±½ÓÑ¡Ôñ×î´ó¸ÅÂ浀 token£»µ«·þÎñ¶ËÏñ continuous batching¡¢¸¡µãÀÛ¼Ó˳Ðò¡¢²¢ÐнâÂëÕâÀàʵÏÖ²ãÃæµÄϸ½Ú£¬ÒÀÈ»¿ÉÄÜÈÃͬһ¶ÎÊäÈë³öÏÖϸ΢µÄ´ë´Ç²¨¶¯¡£
ÕâÒ»µãÆäʵÔç¾ÍÊǹ«¿ªµÄÒÑÖªÏÖÏó£¬ÔÚ OpenAI ¹Ù·½ÂÛ̳ºÍ GitHub issue ÀïÒѾ±»·´¸´ÌÖÂÛ¹ýºÜ¶à´Î¡£
ËùÒÔÕýÈ·µÄÄ¿±ê²»ÊÇ¡°Öð×ÖÏàµÈ¡±£¬¶øÊǰѶÏÑԷֲ㣺»úÆ÷ÄÜÎȶ¨µÄ²¿·ÖÓÃÓ²¶ÏÑÔËøËÀ£¬ÓïÑÔÌìÈ»Æ¯ÒÆµÄ²¿·ÖÓÃÈí¶ÏÑÔ¶µ×¡¡£
Èý¡¢ºËÐÄ´úÂ룺ËIJã¶ÏÑÔ²ßÂÔ
µÚ 1 ²ã£ºÇëÇó²àÏÈÔ¼ÊøÊä³ö
Äܽṹ»¯µÄ¾ø²»×ÔÓÉ·¢»Ó¡£
`temperature=0` + ½á¹¹»¯Êä³ö£¬¿ÉÒÔ°Ñ 80% µÄ²»È·¶¨ÐÔÔÚÔ´Í·Æþµô£º
```python
import json
from openai import OpenAI
client = OpenAI()
def ask_order_status(order_id: str) -> str:
resp = client.chat.completions.create(
model="gpt-4o-mini",
temperature=0,
response_format={"type": "json_object"}, # Ç¿ÖÆ JSON Êä³ö
messages=[
{"role": "system", "content": (
"ÄãÊǿͷþÖúÊÖ£¬Ö»·µ»Ø JSON£º"
'{"status": "shipped|pending|refunding", "summary": "²»³¬¹ý30×Ö"}'
)},
{"role": "user", "content": f"²éѯ¶©µ¥ {order_id} µÄ״̬"},
],
)
return resp.choices[0].message.content
```
µÚ 2¡¢3 ²ã£º¸ñʽӲ¶ÏÑÔ + ÓïÒåÈí¶ÏÑÔ£¨LLM-as-Judge£©
¸ñʽ¡¢×ֶΡ¢Ã¶¾ÙÖµÕâЩ¡°»úÆ÷ÆõÔ¼¡±£¬±ØÐëÓ²¶ÏÑÔ£¬Ò»¸ö×Ö·û¶¼²»ÄÜÈá£
ÓïÒå´ë´ÇÔò½»¸ø²ÃÅÐÄ£ÐÍÅжϣº
```python
JUDGE_PROMPT = """ÄãÊÇÑϸñµÄ²âÊÔÆÀÉóÔ±¡£
²Î¿¼´ð°¸£º{expected}
Ä£ÐÍʵ¼ÊÊä³ö£º{actual}
ÅжÏʵ¼ÊÊä³öÓë²Î¿¼´ð°¸ÓïÒåÊÇ·ñÒ»Ö£¬ÇÒ²»º¬ÊÂʵ´íÎó¡£
Ö»·µ»Ø JSON£º{{"pass": true/false, "reason": "..."}}"""
def assert_llm_output(actual: str, expected: str):
# ¡ª¡ª µÚ2²ã£º¸ñʽӲ¶ÏÑÔ£¨¸´ÏÖ¹ÊÕϵĹؼü·ÀÏߣ©¡ª¡ª
data = json.loads(actual)# ²»ÊǺϷ¨ JSON Ö±½Óʧ°Ü
assert {"status", "summary"} <= set(data), "ȱÉÙ±ØÐè×Ö¶Î"
assert data["status"] in {"shipped", "pending", "refunding"}, "ö¾ÙÖµ·Ç·¨"
# ¡ª¡ª µÚ3²ã£ºÓïÒåÈí¶ÏÑÔ£¨LLM-as-Judge£©¡ª¡ª
verdict = client.chat.completions.create(
model="gpt-4o", temperature=0,
messages=[{"role": "user",
"content": JUDGE_PROMPT.format(expected=expected, actual=actual)}],
)
result = json.loads(verdict.choices[0].message.content)
assert result["pass"], f"ÓïÒå¶ÏÑÔʧ°Ü£º{result['reason']}"
```
×¢Ò⣬²ÃÅÐÄ£ÐÍҪѡ±È±»²âÄ£Ð͸üÇ¿µÄÐͺš£
²¢ÇÒ²ÃÅеÄÌáʾ´Ê¡¢Î¶ȶ¼Òª¹Ì¶¨¡ª¡ª²ÃÅб¾ÉíÒ²Òª¡°¿É¸´ÏÖ¡±¡£
µÚ 4 ²ã£ºÎȶ¨ÐÔ²âÊÔ£¬Óá°Ò»ÖÂÐÔÂÊ¡±Ìæ´úµ¥´ÎÅж¨
µ¥´Îͨ¹ý²»Ëãͨ¹ý¡£
ͬÑùµÄÊäÈëÅÜ N ´Î£¬¸ñʽһÖÂÐÔ±ØÐëÊÇ 100%£¬ÓïÒåÒ»ÖÂÐÔ¸øÒ»¸ö¿É½ÓÊܵÄãÐÖµ£º
```python
def test_output_stability(n=10):
results = []
for _ in range(n):
raw = ask_order_status("TEST-1001")
json.loads(raw)# ÈκÎÒ»´Î¸ñʽʧ°Ü¶¼Ë㲻ͨ¹ý
results.append(json.loads(raw))
semantic_ok = sum(r["status"] == "shipped" for r in results)
rate = semantic_ok / n
assert rate >= 0.9, f"ÓïÒåÒ»ÖÂÐÔÂÊ {rate:.0%}£¬µÍÓÚãÐÖµ 90%"
```
ÕâÌõÓÃÀý¾ÍÊÇСÖÜÍŶӸ´Å̺ó²¹Éϵġ£
Ëü²»¹ÜÄ£ÐÍÔõô´ë´Ç£¬Ö»Òª 10 ´ÎÀïÓÐ 1 ´Î¸ñʽ²»¶Ô£¬CI Á¢¿Ìºì¡ª¡ª¹ÊÕÏÀïÄÇÖÖ¡°¸ñÊ½Æ¯ÒÆ¡±´Ó´Ë²»¿ÉÄܾ²Ä¬ÉÏÏß¡£
ËÄ¡¢³Áµí³É·½·¨£ºAI ²âÊÔ¿ª·¢µÄ¶ÏÑÔËIJãÄ£ÐÍ
- L1 ÇëÇó²àÔ¼Êø£ºÊä³ö¸ñʽ£»·½Ê½ÊÇ temperature=0¡¢response_format¡¢Ñϸñ schema£»Ä¿±êÊÇ´ÓÔ´Í·¼õÉÙÆ¯ÒÆ¡£
- L2 ¸ñʽӲ¶ÏÑÔ£ºJSON ½á¹¹¡¢×ֶΡ¢Ã¶¾Ù£»·½Ê½ÊÇ´úÂë¶ÏÑÔ£»ÈÝÈ̶ÈÊÇÁãÈÝÈÌ¡£
- L3 ÓïÒåÈí¶ÏÑÔ£ºÄÚÈÝÕýÈ·ÐÔ£»·½Ê½ÊÇ LLM-as-Judge / G-Eval£»ÈÝÈ̶ÈÊÇãÐÖµÖÆ£¨Èç ¡Ý0.8£©¡£
- L4 Îȶ¨ÐÔ¶ÏÑÔ£ºÒ»ÖÂÐÔÂÊ£»·½Ê½ÊǶà´Î²ÉÑùͳ¼Æ£»ÒªÇóÊǸñʽ 100%£¬ÓïÒå ¡Ý90%¡£
ÅäÌ×Á½Ìõ¹¤³Ì¼ÍÂÉ£º
- ½ûÖ¹½ûÓÃʧ°ÜÓÃÀý¡£LLM ÓÃÀýºìÁË£¬ÒªÃ´ÐÞ¶ÏÑÔ£¬ÒªÃ´ÐÞÄ£ÐÍ£¬²»Ðí¹Øµô¡£
- ²ÃÅÐÌáʾ´ÊÄÉÈë°æ±¾¹ÜÀí¡£²ÃÅбä¸üÒ²Òª×߻ع顣
¿ªÔ´ÉçÇøµÄ DeepEval£¨G-Eval Ö¸±ê£©¡¢OpenAI Evals ¶¼ÊÇÕâÌ×˼·µÄ³ÉÊìʵÏÖ£¬¿ÉÒÔÖ±½Ó¸´Ó㬲»±Ø´ÓÁãÔì¡£
Îå¡¢ÃæÊÔ×·ÎÊ£¬Äã´ðµÃÉÏÀ´Âð
- LLM-as-Judge ×Ô¼ºÒ²»á³ö´í¡¢Ò²»áÆ¯ÒÆ£¬Ôõô°ì£¿
´ð£º¹Ì¶¨²ÃÅÐÄ£ÐÍÓëÌáʾ´Ê°æ±¾¡¢Î¶ÈÉè 0¡¢¶¨ÆÚÓÃÈ˹¤±ê×¢¼¯Ð£×¼²ÃÅеÄ׼ȷÂÊ£¨²ÃÅеÄ׼ȷÂʱ¾ÉíÒ²ÊÇÒ»¸ö±»²âÖ¸±ê£©¡£ - Ϊʲô²»Ö±½ÓÓÃÓàÏÒÏàËÆ¶È×öÓïÒå¶ÏÑÔ£¿
´ð£ºÏàËÆ¶È¶Ô´ë´ÇÃô¸Ð¡¢¶ÔÊÂʵ²»Ãô¸Ð£¬¡°3 ÌìËʹºÍ¡°5 ÌìËʹÏàËÆ¶ÈºÜ¸ßµ«¶¼ÊÇ´íµÄ£»ÓïÒåÅжϽ»¸ø¸üÇ¿µÄ²ÃÅÐÄ£Ð͸ü¿É¿¿£¬ÏàËÆ¶ÈÖ»ÊʺÏ×ö´Öɸ¡£ - Îȶ¨ÐÔ²âÊÔÅÜ 10 ´Î³É±¾¸ß¡¢CI Âý£¬ÔõôȨºâ£¿
´ð£º·Ö²ãÖ´ÐСª¡ª¸ñʽ¶ÏÑÔÿ´Î PR ÅÜ£»ÓïÒåÓëÎȶ¨ÐÔ²âÊÔÿÍí¶¨Ê±ÅÜÈ«Á¿£¬·¢²¼Ç°ÅÜðÑÌ×Ó¼¯¡£
ÏÂһƪԤ¸æ£º¡¶RAG ÉÏÏߺóΪʲô×Ü¡°´ð·ÇËùÎÊ¡±£¿¡ª¡ª»Æ½ðÊý¾Ý¼¯Óë¼ìË÷ÖÊÁ¿ÆÀ²â¡·
À´Ô´:ÕûÀí×Ô»¥ÁªÍø
ÃâÔðÉùÃ÷£ºÎÄÖÐͼÎľùÀ´×ÔÍøÂ磬ÈçÓÐÇÖȨÇëÁªÏµÉ¾³ý£¬ÐÄÔ¸ÓÎÏ··¢²¼´ËÎĽöΪ´«µÝÐÅÏ¢£¬²»´ú±íÐÄÔ¸ÓÎÏ·ÈÏͬÆä¹Ûµã»ò֤ʵÆäÃèÊö¡£
Ïà¹ØÎÄÕÂ
¸ü¶à-
- Çé¸Ð´óÄ£Ðͳ¤ÆÚ¼ÇÒäµÄ·çÏձ߽磺ΪºÎ³ÉµÚÒ»µÀÉúËÀÏß
- ʱ¼ä£º2026-08-12
-
- °¢ÀïÍòÏàWan3.0ÊÓÆµÉú³É´óÄ£ÐÍ·¢²¼Ó빦ÄܽâÎö
- ʱ¼ä£º2026-08-12
-
-
- °¢ÀïÔÆÁé¿¥ÕæÎäM890³¬½ÚµãÉÏÏß ³É¹¦ÔËÐг¬2ÍòÒÚ²ÎÊý´óÄ£ÐÍ
- ʱ¼ä£º2026-08-12
-
- ÊÓ¾õ´óÄ£ÐÍ¿ªÔ´ÓÀ´ÖذõÉý¼¶£¬¶àģ̬Éú³ÉÓë2K¸ßÇåÒô»½«ÈçºÎ¸Ä±äÐÐÒµ
- ʱ¼ä£º2026-08-12
-
- ¡¶Ö¸»·Íõ¡·´óÄ£ÐÍÆÀ²âлù×¼£º¿¨ÅÁÎ÷Ç¿ÍÆÔÒò½âÎö
- ʱ¼ä£º2026-08-12
-
- ÆÆ½â´óÄ£ÐÍ¶ÌÆÚ¼ÇÒäÀ§¾³µÄ·½·¨Óëʵ¼ù
- ʱ¼ä£º2026-08-12
-
- ÃÀ¹úÆóÒµ¸ÄÓÃÖйú´óÄ£Ðͳɱ¾´ó½µ90%ÄÚÄ»
- ʱ¼ä£º2026-08-12
¾«Ñ¡ºÏ¼¯
¸ü¶à´ó¼Ò¶¼ÔÚÍæ
ÈÈÃÅ»°Ìâ
´ó¼Ò¶¼ÔÚ¿´
¸ü¶à-
- »ªË¶Â·ÓÉÆ÷»Ö¸´³ö³§ÉèÖúó³õʼÃÜÂëÊǶàÉÙ
- ʱ¼ä£º2026-08-12
-
- »ÝÆÕ±Ê¼Ç±¾µçÄÔÐͺÅʶ±ð·½·¨Óë¼¼ÇÉ´óÈ«
- ʱ¼ä£º2026-08-12
-
- °Ù¶ÈµØÍ¼ÈçºÎÉèÖñܿªÓµ¶Â·Ï߸üʡʱ
- ʱ¼ä£º2026-08-12
-
- iPhone 16 Pro ¹Ø±ÕÕñ¶¯ÔÚÄÄÉèÖÃ
- ʱ¼ä£º2026-08-12
-
- UÅ̸ñʽ»¯ºó¶ÁдËٶȱäÂýµÄÔÒòÊÇʲô
- ʱ¼ä£º2026-08-12
-
- QQÒôÀÖÀÏÓû§Ãâ·ÑÁì»áÔ±¹¥ÂÔ¼°»ØÁ÷¸£ÀûÈë¿ÚÒ»ÀÀ
- ʱ¼ä£º2026-08-12
-
- ÀÇÖë¼üÅÌÍ˳öFnģʽºóÒôÁ¿¼üÄָܻ´Õý³£Âð
- ʱ¼ä£º2026-08-12
-
- ÊÖ»úQQ¿Õ¼ä±³¾°ÒôÀÖÔõôÉèÖÃÓë¸ü»»½Ì³Ì
- ʱ¼ä£º2026-08-12