我的学习笔记

土猛的员外

LangChain替代品——simpleaichat

原文:The LangChain Alternative You Absolutely Need To Master

使用LangChain一段时间后,我们需要重新定义,看看它的问题和其他替代品:

LangChain的问题

对于开发利用大型语言模型的应用程序来说,LangChain是一个非常强大的工具。它的功能包括链接prompts、利用健壮的代理以及将大语言模型连接到您的数据。

然而,在我使用LangChain的经验中,我经常发现直接使用OpenAI API更简单。有时,使用LangChain的过程似乎不必要地复杂和令人费解,这使得与OpenAI API的直接交互成为一个更有吸引力的选择。

显然,在使用了LangChain之后,我并不是唯一一个有这种想法的人,因为我在HackerNews上发现了一篇深入研究该工具问题的文章。

LangChain的支持者认为,它可以演变成用于基础模型的Streamlit。Streamlit是一个用于机器学习和数据科学任务的开源应用程序框架。同样,LangChain可以让工程师快速制作概念验证(POC)或投资者演示的演示。此外,如果开发人员想要深入研究,他们可以选择在自己的堆栈上构建,从而增强LangChain的实用性。

然而,尽管有这些好处,人们还是提出了一些担忧。一些用户批评LangChain的不透明性,当需要深入理解一个方法时,这就成为一个重大问题。此外,单行程序的使用虽然在工作时很有帮助,但在不起作用时可能会成为一个相当大的障碍。

LangChain是围绕OpenAI栈构建的,在一些人认为应该是确定性的任务中采用随机过程。这方面的一个例子是LangChain使用语言模型为检索QA提供源,而不是最接近的匹配Embedding。这种方法有时会引入不必要的复杂性。

类似地,当开发人员超越原型时,LangChain似乎失去了有效性。它变得越来越抽象和固执己见,缺乏足够的文档来加剧这些挑战。因此,对一些人来说,LangChain可能会变成一种负担,而不是一种帮助。

尽管存在这些批评,但一些人认为,这些问题中的许多都可以迅速得到解决或解决。对文档和工具的调试功能的增强可以缓解其中的一些问题。此外,虽然LangChain的Python包装器可能不适合所有项目,但它提供了许多开发人员所欣赏的便利程度。

img

国外网友梳理的Langchain各种问题

我决定尝试帖子中提出的更简单的替代方案,名为simpleaichat,并发现它非常吸引人。

在接下来的章节中,我将阐述为什么我觉得这个更直接的选择如此吸引人。

GitHub - minimaxir/simpleaichat

评估simpleaichat

快速浏览一下它的文档就会发现simpleaichat是非常用户友好的。为了评估它的能力,我决定创建一个AI代理,可以在国际象棋中与Stockfish引擎竞争。我之所以选择这个项目,是因为我以前曾尝试过使用LangChain来实现它,结果证明它过于复杂。通过使用simplaichat重新创建这个项目,我希望能够快速评估它的用户友好性和效率。

创建一个AI国际象棋代理,使用simplaichat与Stockfish引擎对弈,这个概念确实很吸引人。我决定开始这个项目,之前我尝试过用LangChain来构建它,这是一个更具挑战性的努力。用simplaichat实现它似乎是一个合乎逻辑的步骤,可以更深入地理解它的用户友好性。

为了启动这个项目,让Stockfish引擎充当我的AI象棋代理的对手是至关重要的。我决定使用GPT-4作为人工智能的大脑,因为它具有先进的语言学习模型(LLM)功能。

与之前的尝试相比,使用SimpleAIChat实现这一目标的过程被证明是轻而易举的。该工具框架和所需代码的透明度和简单性与我使用过的其他模型形成鲜明对比。

下面是我实现的代码片段:

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
93
94
95
96
97
98
99
100
101
import chess
import chess.engine
from mytoken import apikey
import json
from simpleaichat import AIChat
from pydantic import BaseModel, Field

BASE_PROMPT = """
Imagine you are a renowned chess master with decades of experience.
A critical moment arises in a high-stakes tournament game. It's your turn to
move, and you have multiple promising options on the board. How do you approach
this situation? What factors do you consider when deciding which move to play?
Share your expert analysis, evaluating the strengths and weaknesses of each
candidate move and explaining the reasoning behind your final choice. Your
insights and strategic guidance will be highly valued by aspiring chess
players worldwide. Show us the brilliance of a true chess master! Make sure
to anticipate how your adversary may react and plan at least five steps ahead
of your opponent. Take into account the opening principles, positional
considerations, coordination of pieces, threat assessment, and endgame
strategies. Provide a comprehensive analysis that encompasses all stages of
the game and showcases your expertise. Inspire chess enthusiasts around the
globe with your strategic prowess and demonstrate how you would triumph in
this critical moment."
"""

AI_agent = AIChat(
console=False,
api_key=apikey,
model="gpt-4-0613",
params={"temperature": 0.0}
)


class get_move(BaseModel):
"""UCI move information"""
move: str = Field(description="UCI move recommended")
Strategy: str = Field(description="Explanation of the UCI move recommended")

# Initialize a chess board and the chess engine
engine = chess.engine.SimpleEngine.popen_uci("/opt/homebrew/Cellar/stockfish/16/bin/stockfish")


def play_game():
white_moves = [] # Variable to store the list of White's moves
black_moves = [] # Variable to store the list of Black's moves
board = chess.Board()

def get_gpt4_move(board):
feedback = ""
while True:
prompt = f"Current board: {board} White's move history: {white_moves}\nBlack's move history: {black_moves}\n\nChoose the next move for black in UCI format. The available legal moves are {list(board.legal_moves)}. {feedback}"

response = AI_agent(f"{BASE_PROMPT} {prompt}", output_schema=get_move)

next_move = response["move"]

try:
move = chess.Move.from_uci(next_move)
if move in board.legal_moves:
return move
else:
feedback = f"AI agent's generated move {move} is not valid currently."
print(feedback)
except:
feedback = "Failed to parse AI agent's generated move. Retrying..."
print(feedback)

while not board.is_game_over():
if board.turn: # True for white's turn, False for black's turn
result = engine.play(board, chess.engine.Limit(time=2.0))
board.push(result.move)
white_moves.append(result.move.uci()) # Store UCI move in the list
else:
move = get_gpt4_move(board)
board.push(move)
black_moves.append(move.uci()) # Store UCI move in the list
print(board)
print("\n\n")

# Check the result of the game
if board.is_checkmate():
if board.turn:
return "AI Agent wins by checkmate"
else:
return "Stockfish wins by checkmate"
elif board.is_stalemate() or board.is_insufficient_material() or board.is_seventyfive_moves() or board.is_fivefold_repetition() or board.is_variant_draw():
return "The game is a draw"
else:
return "The game is not over"

engine.quit()


# Run the game 10 times and store results
results = {"AI agent wins by checkmate": 0, "Stockfish wins by checkmate": 0, "The game is a draw": 0, "The game is not over": 0}

for i in range(5):
result = play_game()
results[result] += 1

print(results)

这段代码促进了人工智能代理和Stockfish引擎之间的国际象棋游戏。它收集并显示双方的移动,允许AI评估和选择移动,并评估游戏状态以确定胜利者。

多次运行此代码将提供有趣的结果,这些结果将在最后存储和输出。

总之,这个练习证明了simpleaichat确实是一个更容易访问和直接的工具来开发基于人工智能的应用程序。通过减少通常与AI开发相关的障碍和复杂性,它可以使项目开发更加流畅和愉快。


我们的创业项目已经上线!!!

TorchV AI,帮助企业快速进入AI时代!

具体详情,请点击官网咨询


最新内容,关注“土猛的员外”公众号