LLM开发指南

韩乔落

基础知识

参考链接 0 参考链接 1 参考链接 2 参考链接 3 参考链接 4

环境准备

vscode 创建 python 3.13 虚拟环境。

安装以下包:

并非全部要用到,后面打算更新的也在这里了

1
pip install langchain langchain-core langchain-community langgraph langsmith langserve langchain-openai langchain-tavily langchain-text-splitters langchain-experimental langchain-huggingface langchain-mcp-adapters pydantic -qU 

跟着 参考链接 0 配置好.env文件。最好把链接中的基础概念,小实验做一遍再来学习。

1
2
3
4
5
6
7
8
9
OPENAI_API_KEY="*"
OPENAI_API_BASE="*"

LANGSMITH_TRACING=true
LANGSMITH_API_KEY="*"
LANGSMITH_ENDPOINT="*"
LANGSMITH_PROJECT="*"

TAVILY_API_KEY="*"

也可以设置好环境变量,然后通过程序获取(配置了.env不用执行下面的函数):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def get_env_llms_api():
import getpass
import os
"""
Get the environment variables for the LLMS API."
"""
if not os.environ.get("OPENAI_API_KEY"):
os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter your OpenAI API key: ")
if not os.environ.get("OPENAI_API_BASE"):
os.environ["OPENAI_API_BASE"] = getpass.getpass("Enter the OpenAI API base URL: ")
if not os.environ.get("LANGSMITH_TRACING"):
os.environ["LANGSMITH_TRACING"] = "true"
if not os.environ.get("LANGSMITH_API_KEY"):
os.environ["LANGSMITH_API_KEY"] = getpass.getpass("Enter your Langsmith API key: ")
# ......

教程说明

本教程持续更新,通过实验来学习LangChain、LangGraph、LangSmith,项目源码链接 LangChallenge

LLM-Challenge

#1 结构化输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
def EasyTranslate():
"""
EasyTranslate using langchain and openai
轻松翻译,使用 langchain 和 openai
"""
import os
from langchain_openai import ChatOpenAI # openai for langchain
from langchain_core.prompts import PromptTemplate # prompt template for langchain
from langchain_core.messages import HumanMessage
from pydantic import BaseModel, Field
from typing import Optional

# 定义翻译结果的结构化模型
class TranslationResult(BaseModel):
"""翻译结果的结构化输出模型"""
translated_text: str = Field(description="翻译后的文本")
source_language: str = Field(description="检测到的源语言")
target_language: str = Field(description="目标语言")
confidence: Optional[str] = Field(description="翻译置信度评估", default="high")

# 检查 API 密钥
api_key = os.getenv("OPENAI_API_KEY")
if not api_key:
print("错误:请设置 OPENAI_API_KEY 环境变量")
print("您可以通过以下方式设置:")
print("$env:OPENAI_API_KEY='your-api-key-here'")
return

try:
llm = ChatOpenAI(
model="gpt-4o", # gpt-4o for openai
temperature=0, # 创作自由度,越高越自由,越低越严谨
streaming=False # 禁用streaming以避免与structured_output冲突
).with_structured_output(TranslationResult)
except Exception as e:
print(f"初始化 ChatOpenAI 时出错: {e}")
return

# 更新 prompt template 以支持结构化输出
prompt = PromptTemplate.from_template(
"""请将以下文本从{src_language}翻译成{dst_language},并提供结构化的翻译结果:

原文:{text_message}

请确保翻译准确、自然,并评估翻译的置信度。"""
)

src_language = input("请输入源语言: ")
dst_language = input("请输入目标语言: ")
text_message = input("请输入要翻译的文本: ")

# message for prompt template
message = prompt.format(
src_language=src_language,
dst_language=dst_language,
text_message=text_message,
)

print("\n正在翻译...\n")

# 使用结构化输出调用
try:
result = llm.invoke([HumanMessage(content=message)])

# 兼容处理:检查返回类型并统一访问方式
def get_field(obj, field_name, default="未知"):
if isinstance(obj, dict):
return obj.get(field_name, default)
else:
return getattr(obj, field_name, default)

# 结构化输出展示
print("=" * 50)
print("📝 翻译结果")
print("=" * 50)
print(f"🔤 源语言:{get_field(result, 'source_language')}")
print(f"🎯 目标语言:{get_field(result, 'target_language')}")
print(f"📄 原文:{text_message}")
print(f"✨ 译文:{get_field(result, 'translated_text')}")
print(f"🎯 置信度:{get_field(result, 'confidence')}")
print("=" * 50)

except Exception as e:
print(f"翻译时出错: {e}")
print("请检查:")
print("1. OPENAI_API_KEY 环境变量是否正确设置")
print("2. API 密钥是否有效")
print("3. 网络连接是否正常")
print("4. Pydantic 库是否已安装 (pip install pydantic)")

if __name__ == "__main__":
EasyTranslate()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
请输入源语言: 中文
请输入目标语言: 韩语
请输入要翻译的文本: 你好

正在翻译...

==================================================
📝 翻译结果
==================================================
🔤 源语言:中文
🎯 目标语言:韩语
📄 原文:你好
✨ 译文:안녕하세요
🎯 置信度:高
==================================================

#2 工具调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
def calculate():
from langchain_core.tools import tool
from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage, ToolMessage, BaseMessage
from pydantic import BaseModel, Field
from typing import List

llm = init_chat_model(model="gpt-4o", model_provider="openai")

# 加法运算参数描述
class AdditionInput(BaseModel):
a: int = Field(..., description="First number")
b: int = Field(..., description="Second number")

# 定义加法运算工具,绑定参数,函数描述不可少
# 修饰器tool的第一个参数是工具名称,第二个参数是参数描述
@tool("Addition", args_schema=AdditionInput)
def Addition(a: int, b: int) -> int:
"""Add two numbers"""
return a + b

# 乘法运算参数描述
class MultiplyInput(BaseModel):
a: int = Field(..., description="First number")
b: int = Field(..., description="Second number")

# 定义乘法运算工具,绑定参数,函数描述不可少
# 修饰器tool的第一个参数是工具名称,第二个参数是参数描述
@tool("Multiply", args_schema=MultiplyInput)
def Multiply(a: int, b: int) -> int:
"""Multiply two numbers"""
return a * b

tools = [Addition, Multiply]
llm_with_tools = llm.bind_tools(tools)

question = "What is 21356 + 99487? Also what is 12347 * 12958?"
messages: List[BaseMessage] = [HumanMessage(question)]

ai_msg = llm_with_tools.invoke(messages)
messages.append(ai_msg)

# 处理工具调用
tool_calls = getattr(ai_msg, 'tool_calls', None)
if tool_calls:
tool_map = {"Addition": Addition, "Multiply": Multiply}

for tool_call in tool_calls:
selected_tool = tool_map[tool_call["name"]]
tool_output = selected_tool.invoke(tool_call["args"])
tool_msg = ToolMessage(
content=str(tool_output),
tool_call_id=tool_call["id"]
)
messages.append(tool_msg)

# 获取最终回答
final_response = llm_with_tools.invoke(messages)
# 如果需要结构化结果,可以使用Result类
class Result(BaseModel):
question: str = Field(..., description="Question asked by the user")
answer: str = Field(..., description="Final answer from the AI")

result = Result(
question=question,
answer=str(final_response.content)
)

print(f"问题: {result.question}")
print(f"答案: {result.answer}")

if __name__ == '__main__':
calculate()
1
2
问题: What is 21356 + 99487? Also what is 12347 * 12958?
答案: The sum of 21356 and 99487 is 120843, and the product of 12347 and 12958 is 159992426.

Agent-Challenge

MCP-Challenge

  • Title: LLM开发指南
  • Author: 韩乔落
  • Created at : 2025-03-21 10:47:22
  • Updated at : 2025-07-29 11:40:58
  • Link: https://jelasin.github.io/2025/03/21/LLM开发指南/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments