第一次接触LangChain时,最让人头疼的就是环境配置。我刚开始用pip安装时,经常遇到版本冲突问题,直到发现了uv这个现代Python包管理工具。它比pip快10倍以上,而且能自动解决依赖冲突,特别适合新手。
先确保你的Python版本在3.8以上(推荐3.10+),然后用以下命令安装uv:
bash复制curl -LsSf https://astral.sh/uv/install.sh | sh
安装完成后,新建项目目录并初始化:
bash复制mkdir langchain_demo && cd langchain_demo
uv venv # 创建虚拟环境
source .venv/bin/activate # Linux/Mac激活
# 或者 .venv\Scripts\activate # Windows激活
接着安装核心依赖。这里有个小技巧:直接安装langchain[openai]会同时安装所有OpenAI相关的依赖包,比单独安装每个包方便得多:
bash复制uv add langchain[openai] dotenv
我遇到过不少同学卡在环境变量配置这一步。正确做法是在项目根目录创建.env文件,内容如下:
ini复制OPENAI_API_KEY=你的API密钥
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_BASE_MODEL=gpt-3.5-turbo
注意:千万不要把.env文件上传到GitHub!记得在.gitignore里添加
.env
现代Python项目都应该使用pyproject.toml管理依赖。新建文件时我建议直接复制这个模板:
toml复制[project]
name = "langchain_demo"
version = "0.1.0"
description = "My first LangChain app"
readme = "README.md"
requires-python = ">=3.10"
dependencies = [
"dotenv>=1.0.0",
"langchain[openai]>=1.2.0",
]
这里有个坑要注意:requires-python的版本范围不要写得太窄。有次我写了>=3.10,<3.11,结果团队里用Python 3.12的同学完全跑不起来。建议至少保持>=3.10这样宽松的约束。
测试环境是否配置成功,可以新建test_env.py:
python复制from dotenv import load_dotenv
import os
load_dotenv()
print(os.getenv("OPENAI_API_KEY")) # 应该能打印出你的密钥
如果看到密钥输出,说明环境配置正确。这一步看似简单,但能避免后续80%的"API密钥无效"报错。
终于到了激动人心的编码环节!我们先实现最基础的对话功能。新建chat.py:
python复制from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import asyncio
load_dotenv()
llm = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0.7 # 控制创意程度,0-1之间
)
async def main():
response = await llm.ainvoke("用中文解释量子计算")
print(response.content)
if __name__ == "__main__":
asyncio.run(main())
运行后如果看到AI返回的量子计算解释,恭喜你!但这里有几个优化点:
改进后的版本:
python复制import os
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import asyncio
load_dotenv()
llm = ChatOpenAI(
model=os.getenv("OPENAI_BASE_MODEL"),
openai_api_key=os.getenv("OPENAI_API_KEY"),
temperature=0.7
)
async def chat(message: str):
try:
response = await llm.ainvoke(message)
return response.content
except Exception as e:
return f"出错啦: {str(e)}"
async def main():
while True:
user_input = input("你: ")
if user_input.lower() == "exit":
break
response = await chat(user_input)
print(f"AI: {response}")
if __name__ == "__main__":
asyncio.run(main())
直接等完整响应太枯燥了,我们来做个打字机效果的流式输出。新建stream.py:
python复制from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import asyncio
load_dotenv()
llm = ChatOpenAI(
model="gpt-3.5-turbo",
streaming=True # 关键参数!
)
async def main():
stream = llm.astream("用武侠风格讲述Python的装饰器")
async for chunk in stream:
print(chunk.content, end="", flush=True)
print() # 最后换行
if __name__ == "__main__":
asyncio.run(main())
这里有几个实用技巧:
streaming=True启用流式astream而不是ainvokeflush=True确保实时输出end=""避免自动换行如果想更酷炫,可以加个打字机效果:
python复制import random
from time import sleep
async def main():
stream = llm.astream("用科幻小说风格描述神经网络")
async for chunk in stream:
for char in chunk.content:
print(char, end="", flush=True)
sleep(random.uniform(0.01, 0.05)) # 随机延迟
print()
新手最容易遇到的三个坑:
问题1:ImportError: cannot import name 'ChatOpenAI'
uv add langchain[openai] --upgrade问题2:AuthenticationError: Incorrect API key provided
load_dotenv()print(os.getenv("OPENAI_API_KEY"))看是否能输出问题3:流式输出不工作
streaming=Trueastream而不是ainvokeasyncio.run()调用有次我折腾两小时才发现问题出在虚拟环境没激活。现在养成了习惯:每次开终端都先执行source .venv/bin/activate。建议把这个命令加到终端配置里(比如.bashrc或.zshrc)。