GitHub Repo
LangChainコミュニティでメッセージ結合の不具合を再現、developerロールが無効な文字列になる可能性
10月31日のLangChainコミュニティ報告によると、連続するdeveloperメッセージを結合するとロール名が連結され、送信リクエストの形式が無効になる可能性がある。別の参加者も再現を報告し、報告者は修正ブランチを公開したが、メンテナーによる確認や正式なマージはまだない。

LangChainでは10月31日、会話履歴の処理に関する不具合が報告された。隣接する2つのdeveloperメッセージをmerge_message_runsで結合すると、ロールフィールドがdeveloperdeveloperになるという。報告者はlangchain-core 1.7.3と指定されたメインブランチのコミットで再現したと述べ、ほかの参加者2人も同じ結果を投稿した。確認時点で、このissueは未解決のままだった。出典:コミュニティの報告と再現に関する議論
公式ドキュメントによると、この関数は型が同じ連続メッセージを結合し、文字列の内容はデフォルトで改行してつなぐ。個別のツール呼び出しIDを持つToolMessageは結合されない。この処理はモデル呼び出し前の会話処理に使われることがあるため、結合後も元のロール情報を維持する必要がある。出典:LangChain APIドキュメント
報告内の分析によると、developerロールはSystemMessageのadditional_kwargs["__openai_role__"]に保存される。基底となる辞書のマージ処理は文字列を連結する一方、このフィールドを単一値として保持すべきラベルとして扱っていない。その結果、内容は正常につながるものの、ロールが重複して連結される。後でAPIメッセージに変換する際には、その値がそのまま使われる。通常のsystemメッセージとdeveloperメッセージも1つにまとめられ、出力ロールが変わる可能性があるとの指摘もあった。出典:根本原因に関する議論
報告者が公開した修正ブランチは、2つのケースに対応している。同じdeveloperラベルは1つだけ残し、systemメッセージとdeveloperメッセージは分けたままにする。報告者は、追加したテストが修正前のコードでは失敗し、修正後には通過したと述べている。ただし、これはコントリビューターによる検証結果であり、正式リリースで修正済みであることを示すものではない。出典:修正の進捗
固定ルールとリクエストごとの指示を連結するエージェントシステムでは、結合後に実際に送信されるロールフィールドを確認する必要がある。この報告だけでは、すべてのLangChain呼び出しが影響を受けるとは断定できない。今後は、メンテナーが修正を受け入れるか、また回帰テストが異なるロールの並び順を網羅するかに注目したい。